使用reactive父组件第二次传递给子组件的数据:方法中可以获取到最新数据

<template>
<div>
<div>
<h1>子组件</h1>
<child :infoObj='infoObj' ref="childRef"></child>
</div>
<button @click='updateHandler'>跟新值</button>
<div>
<h1>父页面</h1>
<p>{{ infoObj }}</p>
</div>
</div>
</template> <script setup lang="ts">
import child from '@/components/child.vue'
import { ref,reactive } from 'vue'
let infoObj = reactive({
name:'张三',
age:26
})
const childRef = ref()
function updateHandler(){
infoObj.name = '李四'
infoObj.age = 28
// 跟新值后,调用父组件的方法。
childRef.value.getData()
}
</script>
<template>
<div>
<h1> {{ props.infoObj }}</h1>
</div>
</template> <script setup lang="ts">
let props = defineProps({
infoObj:Object,
})
function getData(){
console.log('infoObj', props.infoObj)
}
defineExpose({
getData
})
</script>

使用ref父组件第二次传递给子组件的数据:不能获取到最新的数据

<template>
<div>
<div>
<h1>子组件</h1>
<child :infoObj='infoObj' ref="childRef"></child>
</div>
<button @click='updateHandler'>跟新值</button>
<div>
<h1>父页面</h1>
<p>{{ infoObj }}</p>
</div>
</div>
</template>
<script setup lang="ts">
import child from '@/components/child.vue'
import { ref } from 'vue'
let infoObj = ref({
name:'张三',
age:26
})
const childRef = ref()
function updateHandler(){
infoObj.value = {
name:'李四',
age:28
}
// 跟新值后,调用父组件的方法。看下getData是否可以获取到最新的值
childRef.value.getData()
}
</script>
<template>
<div>
<h1> {{ props.infoObj }}</h1>
</div>
</template>
<script setup lang="ts">
let props = defineProps({
infoObj:Object,
})
function getData(){
console.log('infoObj', props.infoObj)
}
defineExpose({
getData
})
</script>

办法1:将数据作为函数的参数进行传递

<template>
<div>
<div>
<h1>子组件</h1>
<child :infoObj='infoObj' ref="childRef"></child>
</div>
<button @click='updateHandler'>跟新值</button>
<div>
<h1>父页面</h1>
<p>{{ infoObj }}</p>
</div>
</div>
</template>
<script setup lang="ts">
import child from '@/components/child.vue'
import { ref } from 'vue'
let infoObj = ref({
name:'张三',
age:26
})
const childRef = ref()
function updateHandler(){
infoObj.value = {
name:'李四',
age:28
}
// 将数据作为函数的参数进行传递
childRef.value.getData(infoObj.value)
}
</script>
<template>
<div>
<h1> {{ props.infoObj }}</h1>
</div>
</template>
<script setup lang="ts">
let props = defineProps({
infoObj:Object,
})
function getData(mess:any){
console.log('infoObj', props.infoObj)
console.log('将数据作为函数的参数进行传递:mess', mess)
}
defineExpose({
getData
})
</script>

解决办法2:在调用方法时使用 nextTick

<template>
<div>
<div>
<h1>子组件</h1>
<child :infoObj='infoObj' ref="childRef"></child>
</div>
<div>
<h1>父页面</h1>
<p>{{ infoObj }}</p>
</div>
<button @click='updateHandler'>跟新值</button>
</div>
</template>
<script setup lang="ts">
import child from '@/components/child.vue'
import { nextTick, ref } from 'vue'
let infoObj = ref({
name:'张三',
age:26
})
const childRef = ref()
function updateHandler(){
infoObj.value = { name: '李四', age: 28 };
// 推荐在这里使用nextTick
nextTick(() => {
childRef.value.getData()
})
}
</script>
<template>
<div>
<h1> {{ props.infoObj }}</h1>
</div>
</template>
<script setup lang="ts">
let props = defineProps({
infoObj:Object,
})
function getData(){
// 或者在这里使用nextTick。
console.log('getData 方法获取值', props.infoObj.name, props.infoObj.age)
}
defineExpose({
getData
})
</script>

结论

使用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完全替换 不会失去响应式

<template>
<button type="button" @click="updateHandler">更改数据</button>
<p>数据{{ objRef }}</p>
</template>
<script setup lang="ts">
import { ref } from 'vue';
const objRef = ref({ age: 1 })
function updateHandler(){
//完全替换 不会失去响应式
objRef.value = { age: 100 }
}
</script>

reactive不能直接替换整个对象(会失去响应式)

const objReactive = reactive({ a: 1 })
// 错误方式(失去响应性)
objReactive = { b: 2 } // 正确方式 或者逐个修改属性
Object.assign(objReactive, { b: 2 })

[错误]:ref解构不会失去响应式。reactive解构或展开会失去响应式。[这句话不正确]

ref和reactive解构都会失去响应式。都需要通过toRefs 或者toRef 来进行解决。

reactive 解构会失去响应式

<template>
<button type="button" @click="updateHandler">更改数据</button>
<p>数据{{ name }} {{ age}}</p>
</template>
<script setup lang="ts">
import { reactive } from 'vue';
const state = reactive({ name: '张三', age: 20 })
// reactive解构会失去响应式
let { name, age } = state
function updateHandler(){
// 更新数据后,页面不会跟新
name = '王麻子'
age = 1000
}
</script>

ref 解构会失去响应式

<template>
<div>
<p>Name: {{ name }}</p>
<p>Age: {{ age }}</p>
<button @click="changeName">Change Name</button>
</div>
</template> <script setup>
import { ref } from 'vue'
// 使用 ref 创建响应式对象
const user = ref({
name: 'Alice',
age: 25
})
// 解构 ref 对象 - 会失去响应式,视图不会跟新
let { name, age } = user.value
function changeName() {
name = 'Bob' // 直接修改解构出来的属性
}
</script>

toRefs()​解构ref,解构后仍然保持响应式

<template>
<div>
<p>Name: {{ name }}</p>
<p>Age: {{ age }}</p>
<button @click="changeName">Change Name</button>
</div>
</template>
<script setup>
import { ref,toRefs } from 'vue'
// 使用 ref 创建响应式对象
const user = ref({
name: 'Alice',
age: 25
})
// 通过toRefs解构不会失去响应式
let { name, age } = toRefs(user.value)
function changeName() {
name.value = '大大再大' // 直接修改解构出来的属性
}
</script>

toRef()​解构reactive,解构后仍然保持响应式

<template>
<button type="button" @click="updateHandler">更改数据</button>
<p>数据{{ name }} {{ age}}</p>
</template>
<script setup lang="ts">
import { reactive, toRefs } from 'vue';
const state = reactive({ name: '张三', age: 20 })
// 通过toRefs解构不会失去响应式
let { name, age } = toRefs(state)
function updateHandler(){
// 更新数据后,页面不会跟新
name.value = '王麻子'
age.value = 1000
}
</script>

toRefs()​

官网:将一个响应式对象转换为一个普通对象。

这个普通对象的[每个属性]都是指向源对象[相应属性的] ref。

每个单独的 ref 都是使用 toRef() 创建的。

我的理解:

toRefs 可以把一个响应式对象转换为普通的对象。

该普通对象的每一个值都是ref。

由于变成了ref,所以我们使用每个属性的时候需要点value。

ref和reactive的使用场景

ref 适合于基本数据类型,reactive适合于对象类型。

ref 适合完全替换整个对象

我喜欢用ref定义基本数据类型和数组。对象使用reactive。

ref的本质

我理解的ref本质上是reactive的再封装。

使用reactive定义响应式数据时,若数据不是对象类型直接就返回了。

就不会进行后续的数据响应式处理了。

这也就是我只用reactive定义对象型响应式数据的原因

vue3第二次传递数据方法无法获取到最新的值的更多相关文章

  1. jquery操作select下拉框的各种方法,获取选中项的值或文本,根据指定的值或文本选中select的option项等

    简介jquery里对select进行各种操作的方法,如联动.取值.根据值或文本来选中指定的select下拉框指定的option选项,读取select选中项的值和文本等. 这一章,站长总结一下jquer ...

  2. URL跨项目调用方法,获取返回的json值,并解析

    package com.mshc.util; import java.io.BufferedReader; import java.io.IOException; import java.io.Inp ...

  3. 封装GetQueryString()方法来获取URL的value值(转载)

    首先测试URL:http://192.168.1.82:8020/juzhong/daojishi.html?name=xiangruding&sex=nuuu&age=90 代码如下 ...

  4. 封装GetQueryString()方法来获取URL的value值

    首先测试URL:http://192.168.1.82:8020/juzhong/daojishi.html?name=xiangruding&sex=nuuu&age=90 代码如下 ...

  5. C#中解析JSON数据,并获取到其中的值

    1.应需求创建一个Json字符串 string json = "[{'Name':'张三','age':'20','Data':{'ID':100,'heigh':'180','weight ...

  6. C#中怎么解析JSON数据,并获取到其中的值?

    [1]首先我们根据创建一个json字符转 string json = @"[{'phantom':true,'id':'20130717001','data':{'MID':1019,'Na ...

  7. JSF页面中使用js函数回调后台bean方法并获取返回值的方法

    由于primefaces在国内使用的并不是太多,因此,国内对jsf做系统.详细的介绍的资料很少,即使有一些资料,也仅仅是对国外资料的简单翻译或者是仅仅讲表面现象(皮毛而已),它们的语句甚至还是错误的, ...

  8. 为什么 @Value 可以获取配置中心的值?

    hello,大家好,我是小黑,好久不见~~ 这是关于配置中心的系列文章,应该会分多篇发布,内容大致包括: 1.Spring 是如何实现 @Value 注入的 2.一个简易版配置中心的关键技术 3.开源 ...

  9. WebForm.aspx 页面通过 AJAX 访问WebForm.aspx.cs类中的方法,获取数据

    WebForm.aspx 页面通过 AJAX 访问WebForm.aspx.cs类中的方法,获取数据 WebForm1.aspx 页面 (原生AJAX请求,写法一) <%@ Page Langu ...

  10. WebForm.aspx 页面通过 AJAX 访问WebForm.aspx.cs类中的方法,获取数据(转)

    WebForm.aspx 页面通过 AJAX 访问WebForm.aspx.cs类中的方法,获取数据 WebForm1.aspx 页面 (原生AJAX请求,写法一) <%@ Page Langu ...

随机推荐

  1. python的类机制

    python的类机制 参考:python面向对象 概念 方法重写/覆盖:若从父类继承的方法不能满足子类的需求,可以对其进行改写. 类变量:在实例化对象中是公用的,定义在类中,且在函数体之外,通常不作为 ...

  2. 一些devops、软件工程的个人感悟

    1.devops不是简单的工具,是思想. (1)devops核心在于快速编译构建.自动测试化.自动部署发布 (2)工具只是辅助手段,无论是Jenkins.腾讯蓝盾等等,甚至是手动bat+bash搭建, ...

  3. Project Euler 638 题解

    q-analog,老玩家集体起立! 这也就是说: \[\binom{n+m}{n}_q=\sum_{\pi\in L_{n,m}}q^{area(\pi)} \] 结束! #include<bi ...

  4. flutter-真机调试ios Traceback (most recent call last)

    1 Traceback (most recent call last): 2 File "/tmp/C5FDB25B-C7F4-462E-8AC9-7FF9D1A50F21/fruitstr ...

  5. WPF Expander style

    <!--ExpanderStyle--> <Style x:Key="ExpanderStyleOne" TargetType="{x:Type Exp ...

  6. 【Spring】Spring的@Autowire注入Bean的规则测试

    背景 在项目中使用Spring的Bean,一般都使用默认的Bean的单例,并且结合@Autowire使用. 实在有同一个类型多个实例的情况,也使用@Qualifier或@Resource实现注入. 所 ...

  7. Archlinux 更新失败之驱动与 Xorg 配置错误

    Archlinux系统更新是滚动更新,所以更新失败又被叫做"滚挂了" 此次滚挂发生在1月27日,过了那么久了才想起来该记录了-- 现象 滚挂的现象是,能够进系统,但是笔记本电脑自带 ...

  8. Oracle 23ai TPC-H 执行情况

    TPC-H是一个广泛使用的基准测试,用于评估数据库系统在决策支持系统(DSS)场景下的性能. 在昨天的文章中,我们完成了<Oracle 23ai TPC-H 测试环境部署>,本文将继续记录 ...

  9. Mermaid Live Editor 如何调整方向

    在 Mermaid Live Editor 中,默认情况下,流程图和序列图等都是按照从左到右的方向来布局的.但是,如果你想要创建一个从上到下(纵向)布局的图形,你可以使用 TD(Top-Down,即从 ...

  10. STM32 学习方法

    前言 学习知识要掌握有效的学习方法,学习技术也是一样,本篇分享关于我学习 STM32 后总结的学习方法. 推荐的学习方法 系统学习 在网上购买一款开发板,使用开发板+开发板配套视频教程+开发板配套源码 ...