目录
通过Proxy(代理):拦截对象中任意属性的变化,包括属性值的读写,属性的添加,属性的删除。
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}
- }