目录
使用Vue-cli创建
使用vite创建
Composition API 组合API
setup
执行时机
setup的参数
ref函数
reactive函数
Vue3.0中的响应式原理
Vue2的响应式
实现原理
Vue3的响应式
实现原理
通过Proxy(代理):拦截对象中任意属性的变化,包括属性值的读写,属性的添加,属性的删除。
通过Reflect(反射):对被代理对象的属性进行操作。
计算属性与监视
computed函数
1.Vue3中的一个新的配置项,值为一个函数
2.可以将组件中所用到的数据,方法等配置在setup中.
3.setup函数的两种返回值
3.1若返回一个对象,则对象中的属性,方法,在模板中均可以直接使用.
3.2若返回一个渲染函数,则可以自定义渲染内容.
注意:Vue2.0配置(data,methos,computed,...)中可以访问到setup中的属性,方法.但在setup中不能访问(data,methos,computed,...).如果有重名,setup优先
在beforeCreate生命周期前执行一次,this是undefined
export default {
props:['name','id'],
emits:['事件名称'],
setup(props,context){
// props:{name:'',id:''}
console.log(props)
}
}
定义一个响应式数据
const xxx = ref(initValue)
创建一个包含响应式数据的引用对象(RefImpl)
JS中操作数据:xxx.value
模板中读取数据不需要.value
备注:
从定义数据角度对比:
从原理角度对比:
从使用角度对比:
对象类型:通过Object.defineProperty()对属性的读取,修改进行拦截(数据劫持).
数组类型:通过重写更新数组的一系列方法来实现拦截.(对数组的变更方法进行了包裹).
新增属性,删除属性,界面不会更新.(可以使用this.$set()和this.$delete())
直接通过下标修改数组元素,界面不会更新.(通过splice修改数组元素)
new Proxy(data,{
// 拦截读取属性值
get(target,propertyName){
// target 源对象
// propertyName 属性名
return Reflect.get(target[propertyName])
},
set(target,propertyName,value){
// value 修改的值
return Reflect.set(target,propertyName,value)
},
deleteProperty(target,propertyName){
return Reflect.deleteProperty(target[propertyName])
}
})
不希望数据被修改时使用
setup(){
//自定义一个myRef
function myRef(value,delay){
return customRef((track,trigger)=>{
let timer
return {
get(){
track() // 通知Vue追踪value的变化,
return value
},
set(newValue){
clearTimeout(timer)
timer = setTimeout(()=>{
value = newValue
trigger() // 通知Vue重新解析模板
},delay)
}
}
})
}
return {
value:myRef('初始值',500)
}
}
// 祖组件中使用provide提供数据
setup(){
let car = reactive({name:'name',price:'price'})
provide('car',car)
}
// 孙组件中使用inject接收数据
setup(){
const car = inject('car')
return {car}
}