vue 的几个提效技巧
1.动态组件 <component :is='组件名'></component>
结合 v-for 循环使用
使用环境
如图,这是一个 v-for 渲染的列表(只是目前这个版块才刚开始做,目前只有一个),圆圈内的就是一个组件,也就是要 v-for 动态组件 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CgstVJ6d-1665390342414)(https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/018edf494b164a3b806e550acf4879d8~tplv-k3u1fbpfcp-zoom-in-crop-mark:4536:0:0:0.image)]
实际使用
一开始就是基本的组件引入了
接下来就是动态 v-for 动态组件的使用,componentList:['ColorIn','LineIn','Header','Footer']
使用下面的代码即可将代码依次循环
编译以后的效果就是
2.watch 进阶使用
立即执行
使用环境
例如场景为页面一进来就调用拉取列表数据getList()
,然后监听路由的$route.query.id
然后触发列表数据的更新
实际使用
为了让它一开始就执行,我们需要在created()
生命周期中执行一次拉取数据的方法
但是使用immediate
即可立即执行,改写以后的代码如下
深度监听
使用环境
在监听对象的时候,对象的内部属性发生变化 watch 无法监听到,这种时候就需要使用深度监听
实际使用
只需要设置deep:true
即可开启深度监听
计算属性之 setter
实际使用我们一般平常使用的都是
getter
,但其实它还有个setter
,当计算属性的fullName
触发更新的时候,就会触发setter
回调
$on('hook:生命周期')来简化 window 监听
实际使用
先来看一下平常的使用方法,参考 vue 实战视频讲解:进入学习
改写以后的代码为,相比于上面的写法,这个写法的好处在于可以开启一个事件监听器的同时,就在beforeDestroy
生命周期中挂载一个删除事件监听器的事件。比上面的写法会更加安全,更加有助于避免内存泄露并防止事件冲突
子组件@hook:生命周期
监听子组件的生命周期回调
实际使用
v-pre
使用环境
不需要编译的 html 代码可以使用 v-pre,可以提高性能
实际使用
v-once
使用环境
只需要渲染一次,适用于渲染完以后就不会更新的内容,降低性能开销
实际使用
v-pre 与 v-once 的区别
v-pre 相当于不编译,直接显示,v-once 相当于只编译一次,后面的更新不编译了
Vue.set()
使用环境
① 当你利用索引直接设置一个数组项时
② 当你修改数组的长度时
③ 对象属性的添加或删除时
由于Object.defineprototype()
方法限制,数据不响应式更新
实际使用
$forceUpdate()
使用环境
$set()
也有一定的使用限制,当对象没有这个属性的时候,$set()
就会报错,这种时候,直接修改数据,再使用 $forceUpdate()
强制视图刷新即可
实际使用
keep-alive
使用环境
当这个页面没有数据更新,或者是想保存状态,下次进来还是这样子的时候,例如淘宝查看列表页,点进去查看详情之后,返回列表页依旧到上次浏览到的地方,都可以使用keep-alive
实际使用分为配合路由使用,使用
max,include,exclude
,以及特殊的生命周期activated
和deactivated
$route 路由信息
$route.query.id
用来拿取路由传值的信息,比如路由的后缀?id=1,$route.query.id 拿到的值为 1
$route.meta.flag
用来拿取路由 meta 中的信息,路由信息里的 meta 是可以自定义属性的,我一般导航栏当前选中的 nav 用来和 $route.meta.flag 进行匹配,来拿到当前页面应该激活哪一个选项卡
base 路由
比方说百度的所有路由前缀要加/baidu
,那么可以设置路由的 base 为/baidu
此外,打包的时候,请修改config/index.js
的build
块中的assetsPublicPath
为 '/baidu/',不然打包以后是找不到资源文件路径的
全局路由钩子
使用场景一般为用户的登录鉴权
组件路由钩子中访问 this
组件路由的钩子一开始还未初始化,不能访问到 vue 实例 beforeRouteEnter (to, from, next) {// 这里还无法访问到组件实例,this === undefinednext( vm => {// 通过 vm
访问组件实例})}
$route 路由信息不刷新问题
使用场景
有的时候,你从 /user?id=1
跳转到 /user?id=2
的时候,由于渲染同样的 User
组件,导致路由会复用,此时,页面就会仍然是用户 1 的信息。
解决方案
组件内的路由守卫
给
<router-view>
绑定key
使用 watch 监听路由
$emit 传参同时拿到父子组件两者入参的值
在实际项目开发中,可能会遇到 $emit
的值和父组件的 index 都要拿的情况,但是按照之前的写法,只能拿到其中一个的值,要么子组件,要么父组件,鱼和熊掌不可兼得
子组件入参
父组件入参
方法取参
样式穿透
使用环境
一般在修改插件样式的时候使用的比较多
实际使用
分为两种,一般stylus
中使用>>>
,less
中使用/deep/
,sass
没有使用经验,不予说明
Object.freeze()
使用环境
我们都知道vue
是使用Object.defineProperty
对数据进行双向绑定,而对于只做展示使用的长列表,可以使用 Object.freeze()进行冻结,使它无法被修改,从而提高性能
实际使用
值得注意的是,改变 list 的值不会更新,但改变引用会触发更新
组件通信技巧
props
$emit
$attrs
&$listeners
provide
&inject
vuex
Observable
eventBus
$refs
slot-scope
&v-slot
scopedSlots
$parent
&$children
&$root
父子组件参数同时获取
使用环境,有的时候父组件中,要拿取子组件中
$emit
传递的值,并且,要拿到父组件v-for
当前的index
值
子组件入参
父组件入参
实际使用
mixins 混入的使用
使用环境
一般获取验证码,收藏,点赞等公用且逻辑一样(有些逻辑是根据页面的不同而不同的不建议使用混入)等场景都可以使用混入
实际使用
这里我直接封装了一个 vue 新开窗口的混入方法,引入了以后,混入中的所有data,methods
,以及生命周期都会共享
注意点(使用的页面统称为组件)
① 混入比组件优先执行
② 当混入中的属性或者方法与组件中的属性或者方法名称相同时,以组件中的值为准(结合上一条规则,因为混入先执行,所以组件会将混入覆盖)
③ 比方说 A 页面和 B 页面都使用了同一个混入,A 页面与 B 页面的状态同样是独立的
qs
使用场景,
get
传输的时候都是路由拼接方式(?a=1&b=2),而不是json
方式实际使用
v-for 绑定 key 不建议使用 index
主要原因
有的时候 v-for 列表可能存有删除,交换位置等操作,这种时候 index 的顺序变换会导致同一条数据,在此刻的 index 置换,所以,不建议 v-for 的 key 绑定 index
解决方案
建议使用另外的并且值唯一的变量,例如后台给你的 id,反正只要是唯一,不会重复即可
v-for 不建议配合 v-if
主要原因
v-for 的优先级比 v-if 高,也就是说,假设总计 50 条数据,即使经过 v-if 以后,只剩下 25 条显示,但是 v-for 早就循环了一遍 50 条数据,解决办法就是用一个计算属性先将数据过滤了以后,v-for 循环过滤了之后的数据
解决方案
使用 computed
计算属性,对列表进行过滤,只剩下过滤之后需要的数据
document.body.contentEditable
操作方法
打开控制台,输入document.body.contentEditable=true
,然后敲回车,网页可以像 word 一样编辑,很方便对于页面的布局抗压能力做测试
评论