Vue计算属性、过滤器、侦听器

v-for更新监测

当使用会造成原数组改变的方法时,会导致v-for更新,页面更新; 不会造成原数组改变的方法,可以给原数组重新赋值或使用this.$set()更新数组; 使用arr[索引] = 值的方法更新数组的值时,不会造成v-for的更新,需要使用this.$set()方法;

this.$set() 语法:this.$set(this.arr, 索引, 值)

v-for的就地更新 v-for的默认行为会尝试原地修改元素而不是移动他们

虚拟DOM

.vue文件中的template里写的标签都是模板,都要被处理成虚拟DOM对象,才会渲染显示到真实的DOM页面上;

虚拟DOM本质就是一个js对象 vue会将真实DOM的关键信息记录在虚拟的DOM结构对象中,在更新DOM时,生成新的虚拟DOM结构,与旧的结构对比,利用diff算法找不同,只更新变化的部分

虚拟dom的优点 1.提高了更新DOM的性能 2.虚拟DOM只包含必要的属性

diff算法

vue使用diff算法将新虚拟DOM和旧虚拟DOM比较; 1.当根元素改变时,直接删除重建 2.根元素未改变,属性改变,不会删除元素,只更新元素的属性 3.根元素和子元素均未改变,元素内容改变: 根元素无key属性:就地更新(当在前面插入新元素时,会造成新元素得到之前旧元素的子节点) 根元素有key属性,值为索引:还是就地更新; 根元素有key属性,值为id:key的值是唯一不可重复的,新插入的元素就不会的到之前旧元素的子节点;

动态class、动态style

使用v-bind给标签的class设置动态的值 语法::class="{类名: 布尔值}"(布尔值可以为表达式,在执行时会自动将其转化为布尔值执行;花括号里可以写多个键值对形式的类名,用英文的逗号隔开) :style="{css属性: 值}"(和动态class写法相同)

vue过滤器

过滤器只能用在插值表达式和v-bind中; 过滤器可以转换格式,过滤器就是一个函数,传入旧值返回处理后的新值; 语法:

// (全局定义,写在main.js中)
Vue.filter("过滤器名", (值) => {
          
    
	return "返回过滤后的值" 
})
// 局部定义 写在vue文件的module.exports的导出对象中
filters: {
          
   
	过滤器名字(val, 形参) {
          
    
		return "返回过滤后的值"
	}
}

过滤器可同时使用多个,也可以传参 语法:

- 过滤器传参:   vue变量 | 过滤器(实参) 
- 多个过滤器:   vue变量 | 过滤器1 | 过滤器2

vue计算属性

语法:

computed: {
          
   
    "计算属性名" () {
          
   
        return "值"
    },
    "计算属性名" : {
          
   
    	// 赋值触发set方法
    	set(val){
          
   
			// 操作
		},
		// 使用值触发get方法
		get(){
          
   
			return "值"
		}
    }
}

计算属性-缓存 计算属性是基于它们的依赖项的值结果进行缓存的,只要依赖的变量不变, 都直接从缓存取结果

vue侦听器

语法:

watch: {
          
   
    "被侦听的属性名" (newVal, oldVal){
          
   
        
    }
}

想要侦听一个属性变化, 可使用侦听属性watch

深度侦听和立即执行 语法:

watch: {
          
   
    "要侦听的属性名": {
          
   
        immediate: true, // 立即执行
        deep: true, // 深度侦听复杂类型内变化
        handler (newVal, oldVal) {
          
   
            
        }
    }
}
经验分享 程序员 微信小程序 职场和发展