vue-router(七)-案例:TabBar | 青训营笔记


theme: condensed-night-purple

highlight: a11y-dark

这是我参与「第五届青训营 」伴学笔记创作活动的第 7 天

TabBar

TabBar实现思路

1. 如果在下方有一个单独的TabBar组件,你如何封装

自定义TabBar组件,在APP中使用 让TabBar出于底部,并且设置相关的样式

2.TabBar中显示的内容由外界决定

定义插槽 flex布局平分TabBar

3.自定义TabBarItem,可以传入 图片和文字

定义TabBarItem,并且定义两个插槽:图片、文字。 给两个插槽外层包装div,用于设置样式。 填充插槽,实现底部TabBar的效果

4.传入高亮图片

定义另外一个插槽,插入active-icon的数据 定义一个变量isActive,通过v-show来决定是否显示对应的icon

5.TabBarItem绑定路由数据

安装路由:npm install vue-router —save 完成router/index.js的内容,以及创建对应的组件 main.js中注册router APP中加入 组件

6.点击item跳转到对应路由,并且动态决定isActive

监听item的点击,通过this.$router.replace()替换路由路径 通过this.$route.path.indexOf(this.link) !== -1来判断是否是active

7.动态计算active样式

封装新的计算属性:this.isActive ? {'color': 'red'} : {}

代码实现

  1. 在app中写好基本的
  2. 封装成Tabbar组件 样式、布局都封装
  3. 如果在tabbar中对item进行设计,逻辑堆在一块,之后复用不好,只将tabbar逻辑封装在tabbar组件中
  4. 定义插槽,将item内容插入,这样代码也很多
  5. 封装item组件
  6. 在item中固定写复用性不强,使用slot插槽将内容插入

  7. 添加活跃状态的样式 slot外面包裹div,一些设定在div上写,因为slot会被替换,可能不起作用

  8. 和路由结合 点击后页面转到对应组件
  9. 在src中创建views(视图 文件夹 分类创建文件夹,存放对应组件
  10. 与路由绑定 props
  11. 图标活跃动态控制 计算属性comouted 判断当前活跃路由是否包含此item的路径return this.$route.path.indexOf(this.path) !== -1
  12. 动态决定Item的颜色 :style return this.isActive ? {color : this.activeColor} : {}
  13. 进行MainTabBar抽取
  14. 文件路径引用问题 给文件夹起别名 属于webpack相关 alias:起别名 js alias: { '@': resolve('src'), 'assets' : resolve('src/assets'), //@/assets 在cli3里可以 'components' : resolve('src/components'), 'views' : resolve('src/views'), }

学习中

创建项目

vue init webpack tabbar

css引入

面试题,说说链接式和导入式的区别 导入不好链接好,一个同步渲染一个等页面显示完再渲染

学习css的时候就教过两种引用方式一种link还有一种就是import app的style里导入时不仅要加@,还应该加分号 因为是在css里

justify-content: space-evenly

友情提示:子组件里面的style不能用@import,会报错

vue组件命名驼峰,组件标签用-连接

肯定有人会疑惑命名注册的组件名字叫TabBar但是在引用组件的时候为什么是 ,因为在引用的时候vue规定用-隔开 因为html忽略大小写,必须用短横线 驼峰命名不写大写就需要用-连接 比较规范的是.vue组件驼峰命名,组件标签写 - 连接

img是行内元素, 只是比较特殊, 有行内块的特点而已

scoped表示每个style都是只在自己的组件中会有用,不影响别的组件的样式

抽出item组件时,页面不显示内容

查了半天,发现是item的export的name没加引号 。。。

template里面直接用item那个div,不用在外面再套一个!!踩坑

cli3 4里面页面写在views里面,小组件写在compenents里面

。。。true拼错了,卡了半天

安装vue-router

npm install vue-router --save 运行时依赖

views

view里面放视图文件(独立组件),components里面放共通的组件

与路由绑定

点击进行组件切换

点击事件定义到TabBarItem上,跳转的路径由app传入的tab-bar-item提供,固定的字符串,不用v-bind

在TabBarItem组件中如何获取:使用props ```js

export default { name : "TabBarItem", props : { path : String }, data(){ return { // isActive : true isActive : false } }, methods : { itemClick (){ // console.log("itemClick"); this.$router.push(this.path) } } }; ```

路由默认为hash模式: http://localhost:8080/#/home 改为history更好 js const router = new Router({ routes, mode : 'history' })

props

重复点击报错的在跳转前判断下 if (this.$route.path === this.path) return; 这和之前父传子是类似的,只是那是动态传父组件的值,这是直接传个静态值 path是props里面自己定义的属性,用来接收点击item的路径的

!!!注意这个地方,如果双击报错在replace()后面加.catch( err => (err))

item活跃动态控制

原先的使用data,固定了,我们需要动态根据当前活跃组件进行颜色改变 使用计算属性,return this.$route.path.indexOf(this.path) !== -1

item颜色动态控制

原来颜色在TabBarItem内设置class进行改变,如果要改变图标颜色,需要修改源码,复用性不强 使用计算属性进行style动态绑定,app里传入activeColor,在item里接收,进行修改 ```js

props : { path : String, activeColor : { type : String, default : 'red' } }, computed : { activeStyle() { return this.isActive ? {color : this.activeColor} : {} // v-bind 动态绑定style } } ```

进行MainTabBar抽取

tabbar的代码全在app.vue里,看着很多 将代码抽取到MainTabBar里,使用时在app里引用MainTabBar,注册组件就可以使用 ```js import MainTabBar from "./components/MainTabBar.vue"

export default { name: "App", components : { MainTabBar } } ```

文件路径引用问题

给文件夹起别名 属于webpack相关 alias:起别名 cli2 在 \build\webpack.base.conf.js cli3/cli4 查找node_moudles下的@vue/cli-server/lib/config.base.js

注意:在html里使用路径别名时需要在前面加 ~ , ( dom 是属性的问题 不了解) js resolve: { extensions: ['.js', '.vue', '.json'], alias: { '@': resolve('src'), 'assets' : resolve('src/assets'), //@/assets 在cli3里可以 'components' : resolve('src/components'), 'views' : resolve('src/views'), } } <tab-bar-item path="/home" activeColor="deepPink"> <img slot="item-icon" src="~assets/imgs/tabbar/home.svg" alt=""> <img slot="item-icon-active" src="~assets/imgs/tabbar/home_active.svg" alt=""> <div slot="item-text">首页</div> </tab-bar-item>

猜你喜欢

转载自blog.csdn.net/weixin_50945128/article/details/129377815