Vue 总结(一)

116 阅读2分钟

常见语法

<div v-text='n+1' /> === {{n+1}}
<div v-html='x' /> //显示粗体的内容
v-for="(value,key) in 对象或数组" :key="key" // 必须加key

watch computed methods的区别

watch:{ [key: string]: string | Function | Object | Array } 是监听数据 无缓存,watch是异步的,一般着重于执行一个函数。watch里不可以用箭头函数,因为this会指向window

computed:{ [key: string]: Function | { get: Function, set: Function } } 是计算属性,有缓存,着重于依赖之间的变化和缓存

methods:{ [key: string]: Function }

new Vue({
 data:{
 	obj:{
 		a:'a'
 	}
 }
}
watch:{
	obj(){
		handler:{
			console.log('obj changed')
		}
		deep:true
// 如果改变obj.a的值,obj也会变化。相当于监听了obj里面的所有属性。“该回调会在任何被侦听的对象的 property 改变时被调用,不论其被嵌套多深”
	}
}).$mount(#app)
  • computed 和 methods 相比,最大区别是 computed 有缓存:如果 computed 属性依赖的属性没有变化,那么 computed 属性就不会重新计算。methods 则是看到一次计算一次。
  • watch 和 computed 相比,computed 是计算出一个属性(废话),而 watch 则可能是做别的事情(如上报数据)

computed和watch的区别:

  • computed是计算属性,watch是监听属性
  • computed调用时不需要加括号,根据依赖自动==缓存==,如果 computed 属性==依赖==的属性没有变化,那么 computed 属性就不会重新计算。
  • watch有两个选项:immediate,表示第一次渲染是否要执行,deep,是否要==监听==对象里面的属性。变化了就会执行里面的函数

Vue 的生命周期钩子函数

  • beforeCreate
  • created
  • beforeMount
  • mounted:一般在此周期内请求数据
  • beforeUpdate
  • updated
  • beforeDestory
  • destoryed

Vue 实现组件间通信

  • 父子组件:使用 v-on 通过事件通信
    • 组件不能修改props外部数据
    • $emit('update:value',value+1)可以触发事件并传参
    • $event可以获取$emit的参数
  • 爷孙组件:使用两次 v-on 通过爷爷爸爸通信,爸爸儿子通信实现爷孙通信
  • 任意组件:使用 eventBus = new Vue() 来通信,eventBus.on 和 eventBus.emit 是主要API
  • 任意组件:使用 Vuex 通信

Vue 数据响应式

  • 是vue实现UI的核心思路,当用户改变数据时,UI就会自动更新
  • 使用 Object.defineProperty 把这些属性全部转为 getter/setter。Object.defineProperty是es5无法shim(shim可以将新的API引入到旧的环境中,而且仅靠就环境中已有的手段实现。),所以vue不支持IE8以下的版本
  • 由于 JavaScript 的限制,Vue 不能检测到对象属性的添加或删除,解决方法是手动调用 Vue.set 或者 this.$set。使用 Vue.set(object, propertyName, value) 方法向嵌套对象添加响应式 property。
  • 缺点:对于一些新增的属性无法响应,因为无法监听它。vue3解决了这个问题
  • data:内部数据,props:外部数据

Vue.set( target, propertyName/index, value )===this.$set

作用:

  1. 新增key
  2. 自动创建代理和监听
  3. 触发UI更新(但不会立即更新)

举例 : this.$set(this.obj,’b’,100)

向响应式对象中添加一个 property,并确保这个新 property 同样是响应式的,且触发视图更新。它必须用于向响应式对象上添加新 property,因为 Vue 无法探测普通的新增 property (比如 this.myObject.newProperty = 'hi')