你们好,这里是@IT·平头哥联盟,我是首席甩锅官
——老金,今天给你们分享的,一些平常中神秘而又简单的vue的实用小技巧,以及我在我司项目中实用vue的总结和坑,跟你们一块儿分享,但愿能给其余攻城狮带来些许便利,若有理解错误,请纠正。css
场景一 :this指向改变没法用this访问vue实例html
mounted(){ setTimeout( function () { //setInterval同理 console.log(this); //此时this指向Window对象 },1000) ; }复制代码
解决方法 :使用箭头函数或者缓存thisvue
//箭头函数访问this实例由于箭头函数自己没有绑定this
setTimeout(() => { console. log(this);}, 500) ; //使用变量访问this实例let self=this; },1000); setTimeout (function () { console. log(self);//使用self变量访问this实例 }, 1000) ; 复制代码
场景一 :好比一些弹幕,走马灯文字,这类须要定时调用的,路由跳转以后,由于组件已经销毁了,可是setlnterval尚未销毁,还在继续后台调用,控制台会不断报错,若是运算量大的话,没法及时清除,会致使严重的页面卡顿。git
解决方法 :在组件生命周期beforeDestroy中止setIntervalgithub
created() { this.intervalid = setInterval(() => { this.layerError = ""; this.Timer = null; }, 100000); } beforeDestroy( ){ //我一般是把setInterval( )定时器赋值给this实例,而后就能够像下面这么暂停。 clearInterval(this.intervalid); }复制代码
场景一 :为了防止用户忽然离开,没有保存已输入的信息。web
解决方法 :数组
//在路由组件中:mounted(){}, beforeRouteLeave (to, from, next) { if(用户已经输入信息){ //出现弹窗提醒保存草稿,或者自动后台为其保存 }else{ next(true);//用户离开 } } 复制代码
场景一 :一些自定义组件,须要额外添加一些事件来实现一些特定需求浏览器
<template>
<el-progress type="circle" :percentage=“0" @click=“stopProgress”></elprogress> </template> <script> export default { methods:{ stopProgress() { console.log('中止') } } } </script>复制代码
解决方法:使用.native修饰符缓存
<template>
<el-progress type="circle" :percentage=“0" @click.native=“stopProgress”></el-progress> </template> <script> export default { methods:{ stopProgress() { console.log('中止') } } } </script>复制代码
场景一 :一些自定义组件,须要去获取组件对象进行一些其余的Dom操做bash
解决方法 :使用ref属性暴露组件获取句柄
<template>
<el-progress type="circle" :percentage="O" ref="progress"></el-progress></template> <script> this.$refs.progress //组件对象实例, 能够手动调用组件的内置方法和属性 this.$refs.progress.$el //组件 对象的最外层dom元素 </script> 复制代码
场景一 : scoped的样式,但愿影响到子组件的默认样式
在样式中设置完scoped在浏览器解析为以下图这样,a是个div,a div里面包含一个组件里面解析完了div的样式名字为b,想在父组件影响到子组件的默认样式。
解决方法:
<style scoped>
.a >>> .b { /* ... */ }
</style>
//有些像Sass之类的预处理器没法正确解析>>>。这种状况下你可使用/deep/操做符取而代之- - - -这是一个>>>的别名,一样能够正常工做。
<style scoped lang=“scss”>
.a /deep/ .b { /* ... */ }
</style>复制代码
场景一 :不少时候咱们习惯于这样操做数组和对象
data() { return { arr: [1,2,3], obj:{ a: 1, b: 2 } }; }, // 数组更新视图不更新 this.arr[0] = 'OBKoro1'; this.arr.length = 1; console.log(arr);// ['OBKoro1']; // 数据更新,对象视图不更新 this.obj.c = 'OBKoro1'; delete this.obj.a; console.log(obj); // {b:2,c:'OBKoro1'} 复制代码
解决方法 :
this. $set(你要改变的数组/对象,你要改变的位置/key,你要改为什么value)
数组原生方法触发视图更新( vue官网可查):
总体替换数组/对象
场景一 :常见的数据文本的格式化
<!-- 在双花括号中 -->
<div>{{ message | DateFormat }}</div> //展现正确时间
<!-- 在'v-bind'中 --> <div v-bind:id="rawId | formatId"></div> Demo:一个日期过滤器返回yyyy- MM-ddhh:mm:ss的样式 引入一个提早写好日期格式化的js import dayjs from ‘dayjs'; export default { data() { return { //时间毫秒 message:18324798324789 } }, filters: { //传入进行日期格式化 DateFormat(value) { return dayjs(value).format(“YYYY-MM-DD HH:mm:ss") } } }复制代码
场景一 :在watch里面监测对象里面对应的值是监测不到的,能够用以下方法。
选项: deep
在选项参数中指定deep:true,能够监听对象中子属性的变化。
选项: immediate
在选项参数中指定immediate:true,将当即以表达式的当前值触发回调,也就是默认触发一次。
watch: {
obj: {
handler(val, oldVal) {
console.log('属性变化触发这个回调',val, oldVal); }, deep: true // 监测这个对象中每个属性的变化 }, step: { // 属性 //watch handler(val, oldVal) { console.log("默认触发一次", val, oldVal); }, immediate: true // 默认触发一次 } }
欢迎你们一块儿探讨 ~~
做者:疯狂的阿金连接:https://juejin.im/post/5bc937285188255c63763ae2来源:掘金