vue3第二次传递数据方法无法获取到最新的值

笔记哥 / 04-02 / 29点赞 / 0评论 / 556阅读
![](https://cdn.res.knowhub.vip/c/2504/03/ac9efc1c.jpg?G1YAAMTW3DgpgLxm22gD1Vl6p82ARBZBpYT1uvee6yR6PldWi9ff%2bvD14S%2btDycxRa4gZQUbgmeVZEhAyqHwUSBSLb7TAQ%3d%3d) #### 使用reactive父组件第二次传递给子组件的数据:方法中可以获取到最新数据 ```csharp ``` ```csharp ``` ![](https://cdn.res.knowhub.vip/c/2504/03/c52d61cd.png?G1YAAETn9LwULLDIvtMdbIlTE20GJLIIKiWs13vO2jfR9wcYmp%2fR%2boz94S%2btz6CisMuNwDBWJM8oIlXMvSYICqt7zWsE) #### 使用ref父组件第二次传递给子组件的数据:不能获取到最新的数据 ```csharp ``` ```csharp ``` ![](https://cdn.res.knowhub.vip/c/2504/03/1dc9d026.png?G1YAAOQ8bZy437eNOlybKBKaAYksgkoJ6%2fXeu08D%2bH5nZI3P7GP5%2bfCXPpYDKVuqBoxsqAgemUSKFpIUqhWVminHPR0%3d) #### 办法1:将数据作为函数的参数进行传递 ```csharp ``` ```csharp ``` ![](https://cdn.res.knowhub.vip/c/2504/03/830a4b17.png?G1YAAOTcVkxwP3K2iOF0Q2CDZkAii6BSwnq956x9A3x%2fMLLmZ7Q%2bY3%2f4S%2bszgJStuAEjGyqSRyYRR1Gz5FS8XtU0rxE%3d) #### 解决办法2:在调用方法时使用 nextTick ```csharp ``` ```csharp ``` ![](https://cdn.res.knowhub.vip/c/2504/03/f0007533.png?G1cAAETn9LwUKODivtMdbIlTE20GLNIIKiWs13vO2jfR9wcYlp%2fR%2boz94TetzyAxeKlOYDgbUmCIahUHOEllL%2bqXcl4jAA%3d%3d) #### 结论 使用ref父组件第二次传递给子组件的数据(基本数据和引用数据):不能获取到最新的数据。 #### 使用reactive和ref传递参数给子组件,为啥ref第二次子组件无法获取最新的数据?而reactive可以 在 Vue 3 中,reactive 和 ref 在传递给子组件时的行为有所不同。 这也说明了 reactive 和 ref 是有区别的(屁话)。 #### ref 和 reactive 的区别 1,ref可以试用于任何数据类型,而reactive只适用于对象类型。 2,在js模块ref获取值,设置值,需要点value, ‌在模板中使用不需要点value。 而reactive都不需要。 3,ref可以完全替换整个对象,不会失去响应式。 reactive不能直接替换整个对象(否则会失去响应式)。需要逐个修改属性或使用 Object.assign 4,返回值不同。ref返回一个‌包装对象‌。reactive返回一个‌Proxy 对象‌ #### ref完全替换 不会失去响应式 ```csharp ``` #### reactive不能直接替换整个对象(会失去响应式) ```csharp const objReactive = reactive({ a: 1 }) // 错误方式(失去响应性) objReactive = { b: 2 } // 正确方式 或者逐个修改属性 Object.assign(objReactive, { b: 2 }) ``` #### [错误]:ref解构不会失去响应式。reactive解构或展开会失去响应式。[这句话不正确] ref和reactive解构都会失去响应式。都需要通过toRefs 或者toRef 来进行解决。 #### reactive 解构会失去响应式 ```csharp ``` ![](https://cdn.res.knowhub.vip/c/2504/03/6c80b2df.png?G1cAAMTsdJxI8hLoNuqQ9k5xp82ARRpBpYT1ev5%2fn4vo%2fRwMjffsY%2fn58Js%2blpMoLDcjMIwVITAkaYJqbUGK5VxLFY17Og%3d%3d) #### ref 解构会失去响应式 ```csharp ``` ![](https://cdn.res.knowhub.vip/c/2504/03/984691b0.png?G1YAAMT0bJxoe7TCNvqh%2f4lHQjMgkUVQKWG93nv3aUTf72Dk%2bMw%2blp8Pf%2bljOUmGWlUCQzkjeIakVFUSW4CZFFSUuKcD) #### toRefs()​解构ref,解构后仍然保持响应式 ```csharp ``` ![](https://cdn.res.knowhub.vip/c/2504/03/d836210f.png?G1YAAMTydJz4c%2f%2bkuo06fJsoEpoBiSyCSgnr9Z6z9i3y%2fU7Q4jNan74%2f%2fKX16ZKMudQsBDMMwYNJDUhKDaY0sF6Mazg%3d) #### toRef()​解构reactive,解构后仍然保持响应式 ```csharp ``` ![](https://cdn.res.knowhub.vip/c/2504/03/be673ea1.png?G1YAAMS22TiVempQ29gP%2fkNfQTUDElkElRLW6713n0b0%2fQGG5Wf2seJ8%2bEsfK0gMXqoTGM6G5BmixgJVS0XEndU87xk%3d) #### toRefs()​ 官网:将一个响应式对象转换为一个普通对象。 这个普通对象的[每个属性]都是指向源对象[相应属性的] ref。 每个单独的 ref 都是使用 toRef() 创建的。 我的理解: toRefs 可以把一个响应式对象转换为普通的对象。 该普通对象的每一个值都是ref。 由于变成了ref,所以我们使用每个属性的时候需要点value。 #### ref和reactive的使用场景 ref 适合于基本数据类型,reactive适合于对象类型。 ref 适合完全替换整个对象 我喜欢用ref定义基本数据类型和数组。对象使用reactive。 #### ref的本质 我理解的ref本质上是reactive的再封装。 使用reactive定义响应式数据时,若数据不是对象类型直接就返回了。 就不会进行后续的数据响应式处理了。 这也就是我只用reactive定义对象型响应式数据的原因