使用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. C# 给当前程序创建桌面快捷方式

    C# 给当前程序创建桌面快捷方式 //by wgscd //date 2024-10-22 using System; using System.Reflection; using System.IO ...

  2. 双指针习题:Binary Deque

    14.Binary Deque 题面翻译 Binary Deque - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 有多组数据. 每组数据给出 \(n\) 个数,每个数为 \(0\) ...

  3. SQL Server 内存占用高分析及解决办法(超详细)

    SQL Server 内存占用高分析及解决办法(超详细) 一.问题 1.1.SQL Server内存占用高 ,内存不释放 1.2.SQL Server 内存使用策略 SQL Server对服务器内存的 ...

  4. manim边做边学--淡入淡出变换

    今天介绍Manim中用于淡入淡出变换的3个动画类: FadeToColor:聚焦于对象颜色的平滑转换,通过渐变增强视觉效果 FadeTransform:实现不同对象之间的渐变替换,让元素转换更加连贯 ...

  5. Win7远程桌面连接不上

    Windows远程桌面连接不上有多种情况,当完成基本设置后,如果连不上,那么最可能的情况是防火墙和网络设置不匹配. 1. 检查一下Window防火墙中远程桌面的设置,默认情况下只允许"家庭/ ...

  6. uni-app之条件编译

    ifdef 仅出现在XXx平台上 仅出现在 App 平台下的代码 #ifdef APP-PLUS 需条件编译的代码 #endif <!-- 只在H5上有哈 --> <!-- #ifd ...

  7. DeepSeek-R1 技术全景解析:从原理到实践的“炼金术配方” ——附多阶段训练流程图与核心误区澄清

    字数:约3200字|预计阅读时间:8分钟 (调试着R1的API接口,看着控制台瀑布般流淌的思维链日志)此刻我仿佛看到AlphaGo的棋谱在代码世界重生--这是属于推理模型的AlphaZero时刻. D ...

  8. 表治理-Iceberg元数据合并-metadata.json文件

    一.背景描述 元数据文件随时间增多,导致查询变慢.通过如下方式可以指定metadata个数,超过指定数量自动清理. metadata文件对应Iceberg概念是Snapshots 二.解决方案 1.在 ...

  9. PKUWC2025 游记

    哈哈哈哈哈,我糖完了,哈哈哈哈哈. Day \(-998244353\) 被波波抓到机房充军集训去了,听到了很多新奇的算法,然后拼尽全力仍难以 \(AC\)--然后被各种巨佬疯狂单调队列. Day \ ...

  10. Typecho防黑安全加固-修改后台路径

    删除安装文件 成功安装后删除install.php文件.install/文件夹. 修改后台地址 把admin修改为黑客猜不到的名字,例如pipixia,防止黑客穷举密码. 修改admin文件夹名称 修 ...