vue reactive ref,vue3.0 ref reactive

  vue reactive ref,vue3.0 ref reactive

  在vue3中,有两种正式的方法来声明响应数据:ref()和reactive()。以下文章主要介绍了Vue3中ref和reactive的相关信息,有需要的可以参考一下。

  

目录

   I、ref和reactive1.reactive2.ref

  二。shallowRef和shallowReactive1。ref和shallowRef2。反应性和浅反应性III、toRaw IV、markRaw V、toRef和toRef

  1.裁判员

  2.总结2。toRef3。托雷夫斯

  

一、ref和reactive

  记住:ref本质上也是电抗,ref(obj)等价于reactive({value: obj})

  vue3中实现响应式数据的方法是使用ref和reactive。所谓响应式数据,就是接口和数据的同步,可以实现实时更新。

  vue2中的响应由defineProperty实现,vue3中由ES6的代理实现。

  

1.reactive

  reactive的参数必须是对象,包括json数据和数组,否则没有响应。

  如果将其他对象(如时间对象)传递给reactive,默认情况下修改对象的界面不会自动更新。如果要更新,可以通过重新指定对象来解决。

  

2.ref

  既然我们有电抗,为什么还需要ref?当我们只希望一个变量是响应式的时候,采用反应式会很麻烦。所以vue3提供了ref方法来监控简单值,但并不意味着ref只能传入简单值。他的底层是反应性的,所以他都有。还是那句老话:

  记住:ref本质上也是电抗,ref(obj)等价于reactive({value: obj})

  使用vue中ref的值,而不是让它通过。价值。

  js中使用的ref的值必须通过。价值。

  

二、shallowRef和shallowReactive

  递归监视和非递归监视

  而ref reactive属于递归监控,即每一层数据都是有响应的。如果数据量很大,消耗很多性能,非递归监控只会监控第一层数据。

  

1. ref和shallowRef

  ref定义的每一层数据都是响应式数据。

  只有lowref定义的数据的第一层是有响应的,也就是说,它只能在。值已更改。

  设年龄=ref({

  答:“1”,

  女:{

  乙: 二,

  斯:{

  丙:“3”

  }

  }

  })

  //打印各层数据

  console.log(年龄);

  console . log(age . value);

  console . log(age . value . f);

  console . log(age . value . f . s);

  设age=shallowRef({

  答:“1”,

  女:{

  乙: 二,

  斯:{

  丙:“3”

  }

  }

  })

  //打印各层数据

  console.log(年龄);

  console . log(age . value);

  console . log(age . value . f);

  console . log(age . value . f . s);

  使用shallowRef后,可以通过triggerRef()方法主动更新界面,刷新界面。

  函数doSome(){

  age . value . f . s . c= c ;

  //主动更新界面

  triggerRef(年龄);

  }

  

2. reactive和shallowReactive

  注意:shallowReactive没有类似triggerRef()的方法

  

三、toRaw

  托拉解决了什么问题?

  有时,我们不希望数据以响应方式实时更新。我们可以通过toRaw获得ref或reactive引用的原始数据。通过修改原始数据,界面不会更新。只有修改ref和reactive封装的数据,接口才会有响应性的变化。

  设obj1={.};

  //state和obj1是引用关系,state的本质是一个代理对象,其中引用了obj1。

  设状态=无功(obj 1);

  toRaw方法得到的原始数据其实是obj1的内存地址,obj2和obj1完全相等。

  设obj2=toRaw(州)

  console . log(obj 1===obj 2);//真

  有同学会问,直接用obj1修改数据不行吗?但关键的一点是,我们在使用reactive定义数据时,一般不会先定义一个obj,然后再传递给reactive。我们都是直接用reactive写数据。

  

四、markRaw

  与toRaw不同,markRaw的打包数据永远不会被跟踪!

  暂时没发现有什么用(手动狗头)

  让obj1={姓名:李静,年龄:18}

  设obj 2=markRaw(obj 1);

  //此时,虽然reactive所包装的数据是一个响应式对象,但不会被跟踪,也不会产生效果效应。

  设状态1=电抗(obj2)

  console . log(obj 1===obj 2);//真

  

五、toRef和toRefs

  ref和toRef都用于构造响应数据。两者有什么区别?看两个例子。

  

1. ref

  复制修改响应式数据不会影响之前的数据,数据发生变化时界面会自动更新。

  转换的是RefImpl类型。

  可以看出,在用ref响应性地修改对象的简单数据类型属性之后,原始数据将不会受到修改响应数据的影响。如上图所示,obj1中属性A的值在state1修改值后没有变化。这里有一个注意:修改的属性必须是一个简单的数据类型,一个特定的值,而不是一个引用。如果属性也是一个对象,它将受到影响,因为对象引用!

  比如上面的例子,如果obj1.f被传入state1,情况就完全不一样了。

  //等效于let state1=ref ({b: 2 ,s: {c: 3}})

  //它相当于-let state1=reactive ({value: {.}})

  设state 1=ref(obj 1 . f);

  

2. toRef

  如果使用toRef进行转换,修改响应数据会影响原始数据,数据会发生变化,但界面不会自动更新。

  转换后,它是ObjectRefImpl类型。

  Ref类似于深度复制,toref类似于浅层复制。

  

3. toRefs

  遍历对象中的所有属性,把它变成响应数据,因为toRef只能传递一个键,toRef和toRef的作用是一样的。

  温馨提示:目前最常用的是ref和reactive,其他的一般在后面用,提高性能。

  

总结

  关于Vue3 ref和reactive的这篇文章就到这里了。有关Vue3 ref和reactive的更多信息,请搜索我们以前的文章或继续浏览下面的相关文章。希望大家以后能多多支持我们!

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: