vite官方文档

创建项目

使用Vite创建vue项目

  1. # npm 7+, extra double-dash is needed:
  2. npm init vite@latest my-vue-app -- --template vue
  3. # yarn
  4. yarn create vite my-vue-app --template vue

安装vue-router

vue-router官方文档
查看vue-router版本
**npm info vue-router versions**
安装最新版4
yarn add vue-router@4.0.12

使用vue-router, main.ts入口文件如下

  1. import { createApp } from 'vue'
  2. import App from './App.vue'
  3. import {createWebHashHistory, createRouter} from 'vue-router'
  4. import Hi from './components/hi.vue'
  5. const history = createWebHashHistory()
  6. const router = createRouter({
  7. history,
  8. routes: [
  9. {
  10. path: '/', component: Hi
  11. }
  12. ]
  13. })
  14. createApp(App)
  15. .use(router)
  16. .mount('#app')

env.d.ts的作用

让TS能够识别.vue文件
image.png

创建首页和文档页

安装sass

  1. yarn add -D sass

封装Topnav组件

  1. <template>
  2. <div class="topnav">
  3. <div class="logo">LOGO</div>
  4. <ul class="menu">
  5. <li>菜单1</li>
  6. <li>菜单2</li>
  7. </ul>
  8. </div>
  9. </template>
  10. <script lang="ts">
  11. export default {
  12. }
  13. </script>
  14. <style lang="scss" scoped>
  15. .topnav {
  16. background: pink;
  17. display: flex;
  18. padding: 16px;
  19. > .logo {
  20. min-width: 6em;
  21. margin-right: auto;
  22. }
  23. > .menu {
  24. display: flex;
  25. white-space: nowrap;
  26. flex-wrap: nowrap;
  27. > li {
  28. margin: 0 1em;
  29. }
  30. }
  31. }
  32. </style>

使用Topnav组件

  1. <template>
  2. <div>
  3. <Topnav />
  4. <div class="banner">
  5. <h1>pika-ui</h1>
  6. <h2>一个厉害的UI框架</h2>
  7. <p class="actions">
  8. <a>Github</a>
  9. <a>开始</a>
  10. </p>
  11. </div>
  12. </div>
  13. </template>
  14. <script lang="ts">
  15. import Topnav from '../components/Topnav.vue'
  16. export default {
  17. components: {Topnav}
  18. }
  19. </script>

页面切换

  1. <p class="actions">
  2. <a href="https://github.com">Github</a>
  3. <router-link to="/doc">开始</router-link>
  4. </p>

sideBar

  1. <aside>
  2. <h2>组件列表</h2>
  3. <ol>
  4. <li>
  5. <routerlink to="/doc/switch">Switch组件</routerlink>
  6. </li>
  7. <li>
  8. <routerlink to="/doc/button">Button组件</routerlink>
  9. </li>
  10. <li>
  11. <routerlink to="/doc/dialog">Dialog组件</routerlink>
  12. </li>
  13. <li>
  14. <routerlink to="/doc/tabs">Tabs组件</routerlink>
  15. </li>
  16. </ol>
  17. </aside>

调整topbar和sidebar的位置

image.png
此时postion:fixed, 如何让sidebar在topbar的下方?
给topbar添加样式:

  1. positon: relative;
  2. z-index: 10;

给aside添加样式:

  1. padding-top: 70px;

使用provide和inject实现sidebar切换功能

在App.vue中使用provide定义全局变量

  1. <script lang="ts">
  2. import {ref, provide} from 'vue'
  3. export default {
  4. setup(){
  5. const menuVisible = ref(false)
  6. provide('menuVisible', menuVisible)
  7. }
  8. }
  9. </script>

在topnav组件中获取并修改menuVisible的值

  1. <script lang="ts">
  2. import { inject, Ref} from 'vue'
  3. export default {
  4. setup(){
  5. const menuVisible = inject<Ref<boolean>>('menuVisible')!
  6. const toggleMen = () => {
  7. menuVisible.value = !menuVisible.value
  8. }
  9. return {toggleMen}
  10. }
  11. }
  12. </script>

在setup中的变量或方法需要return出来,template才能访问
在sidebar中通过相同的方式获取menuVisible, template中使用v-if实现切换

实现菜单按钮响应式切换

使用媒体查询

  1. .topnav {
  2. // ...
  3. @media (max-width: 500px) {
  4. > .menu{ display: none;}
  5. > .logo{margin:0 auto}
  6. > .toggleAside {
  7. display: inline-block;
  8. }
  9. }

根据屏幕宽度设置menuVisible的初始值

  1. setup(){
  2. const width = document.documentElement.clientWidth;
  3. const menuVisible = ref(width <= 500 ? false : true)
  4. provide('menuVisible', menuVisible)
  5. }

嵌套路由

children为子路由

  1. const router = createRouter({
  2. history,
  3. routes: [
  4. {
  5. path: '/',
  6. component: Home
  7. },
  8. {
  9. path: '/doc',
  10. component: Doc,
  11. children:[
  12. {path: '', component: DocDemo},
  13. {path: 'switch', component: SwitchDemo},
  14. {path: 'tabs', component: TabsDemo},
  15. {path: 'button', component: ButtonDemo},
  16. {path: 'dialog', component: DialogDemo}
  17. ]
  18. }
  19. ]
  20. })

在对应路径下的页面添加router-link和router-view

  1. <div class="content" v-if="menuVisible">
  2. <aside>
  3. <h2>组件列表</h2>
  4. <ol>
  5. <li>
  6. <router-link to="/doc/switch">Switch组件</router-link>
  7. </li>
  8. </ol>
  9. </aside>
  10. </div>
  11. <main><router-view /></main>

router.forEach

用router.forEach实现每次路由切换后隐藏菜单栏

  1. router.afterEach(()=>{
  2. if(width <= 500){
  3. menuVisible.value = false
  4. }
  5. })