1.1 模仿Vue官网首页 创建首页和文档页
[toc]
创建首页和文档页
创建
src/view
目录以及文件Docs.vue
Home.vue
开始创建官网
Home.vue
TopNav
: 左边是 logo,右边是 menuBanner
: 文件介绍 + 开始按钮
Docs.vue
TopNav
: 复用Content
: 左边是 aside,右边是 main
|
|
确保所有组件都有
<script>
标签,否则在VSCode
中可能不能识别引入路径
封装 Topnav
完善样式
完善 Home.vue 样式
H1 + H2 + 两个链接
|
|
完善 Docs.vue 样式
边栏 + 主内容
主做手机,兼容PC
|
|
点击切换 aside 边栏
点击一次显示,再点击一次隐藏,使用 provide 和 inject 实现切换功能
menuVisible
重命名为asideVisible
- 使用一个变量
asideVisible
,表示边栏是否被显示 - 变量
asideVisible
不可放在Topnav.vue
组件中,因为Docs.vue
不能访问变量 - 变量
asideVisible
不可放在Docs.vue
组件中,因为Docs.vue
隐藏时不能访问变量 - 变量
asideVisible
必须放在App.vue
组件中- 并且通过
provide/inject
标记下变量asideVisible
是可以被子组件访问的
- 并且通过
在App.vue
中提供控制变量
|
|
<script setup>
是在单文件组件 (SFC) 中使用组合式 API 的编译时语法糖- 里面的代码会被编译成组件 setup() 函数的内容
- ref 值在模板中使用的时候会自动解包处值 value
- ref 值在其他处中使用的时候需要手动解包
refValueXXX.value
在子孙组件中插入使用
TopNav.vue
|
|
- 注意:需要提供接收的类型
const asideVisible = inject<Ref<boolean>>('xxx');
Ref<boolean>
内部类型也需要
Docs.vue
|
|
- 分别在控制台打印出
console.log('topNav 获取的 asideVisible 为:', asideVisible?.value);
console.log('docs 获取的 asideVisible 为:', asideVisible?.value);
- 查看在子组件中是否获取到
asideVisible
- 注意:获取的是
asideVisible?.value
,解包RefImpl
后的值
添加点击切换事件
TopNav.vue
|
|
Docs.vue
- 添加条件渲染
<aside v-if="asideVisible">...
|
|
小结
- 父组件提供变量
provide('xxx', asideVisible);
- 子孙组件获取变量
const asideVisible = inject<Ref<boolean>>('xxx');
- 切换逻辑
- 一个子组件中添加切换事件
<div class="logo" @click="toggleMenu">LOGO</div>
const toggleMenu = () => {asideVisible!.value = !asideVisible?.value;};
- 另一个子组件中按变量进行 条件渲染
<aside v-if="asideVisible">
- 一个子组件中添加切换事件
改造TopNav.vue 添加切换按钮
手机页面上的切换按钮 汉堡按钮
- 当页面窄到 500px 时,隐藏侧边栏,显示菜单按钮
- 使用
@media (max-width: 500px) {...}
初始时判断页面宽度
路由间切换
点击组件,点击组件显示相应的文档
使用嵌套路由
main.ts
每次切换路由时,都将组件列表菜单关闭(PC端不需要关闭)
- 在
main.ts
中使用路由钩子router.afterEach(() => {})
|
|
- 问题是现在需要访问的变量
asideVisible
在App.vue
中 - 如果将钩子放到
App.vue
中,就无法访问router
单独封装一个路由文件
router.ts
, 导出router
接口
|
|
在
main.ts
中引入router
|
|
在
App.vue
中使用router
钩子afterEach
|
|
- 注意在模板
<template>
外使用数据需要.value
:asideVisible.value = false;
小结
- 封装路由
router.ts
main.ts
中引入router
- 在
App.vue
中引入router
,使用钩子router.afterEach(()=>{})
去实现逻辑 - 完善PC逻辑,PC不许要隐藏逻辑,加上视口宽度判断
基本完成官网
补全其他组件路由
router.ts
|
|
参考