vue3第二次传递数据方法无法获取到最新的值
使用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第二次传递数据方法无法获取到最新的值的更多相关文章
- jquery操作select下拉框的各种方法,获取选中项的值或文本,根据指定的值或文本选中select的option项等
简介jquery里对select进行各种操作的方法,如联动.取值.根据值或文本来选中指定的select下拉框指定的option选项,读取select选中项的值和文本等. 这一章,站长总结一下jquer ...
- URL跨项目调用方法,获取返回的json值,并解析
package com.mshc.util; import java.io.BufferedReader; import java.io.IOException; import java.io.Inp ...
- 封装GetQueryString()方法来获取URL的value值(转载)
首先测试URL:http://192.168.1.82:8020/juzhong/daojishi.html?name=xiangruding&sex=nuuu&age=90 代码如下 ...
- 封装GetQueryString()方法来获取URL的value值
首先测试URL:http://192.168.1.82:8020/juzhong/daojishi.html?name=xiangruding&sex=nuuu&age=90 代码如下 ...
- C#中解析JSON数据,并获取到其中的值
1.应需求创建一个Json字符串 string json = "[{'Name':'张三','age':'20','Data':{'ID':100,'heigh':'180','weight ...
- C#中怎么解析JSON数据,并获取到其中的值?
[1]首先我们根据创建一个json字符转 string json = @"[{'phantom':true,'id':'20130717001','data':{'MID':1019,'Na ...
- JSF页面中使用js函数回调后台bean方法并获取返回值的方法
由于primefaces在国内使用的并不是太多,因此,国内对jsf做系统.详细的介绍的资料很少,即使有一些资料,也仅仅是对国外资料的简单翻译或者是仅仅讲表面现象(皮毛而已),它们的语句甚至还是错误的, ...
- 为什么 @Value 可以获取配置中心的值?
hello,大家好,我是小黑,好久不见~~ 这是关于配置中心的系列文章,应该会分多篇发布,内容大致包括: 1.Spring 是如何实现 @Value 注入的 2.一个简易版配置中心的关键技术 3.开源 ...
- WebForm.aspx 页面通过 AJAX 访问WebForm.aspx.cs类中的方法,获取数据
WebForm.aspx 页面通过 AJAX 访问WebForm.aspx.cs类中的方法,获取数据 WebForm1.aspx 页面 (原生AJAX请求,写法一) <%@ Page Langu ...
- WebForm.aspx 页面通过 AJAX 访问WebForm.aspx.cs类中的方法,获取数据(转)
WebForm.aspx 页面通过 AJAX 访问WebForm.aspx.cs类中的方法,获取数据 WebForm1.aspx 页面 (原生AJAX请求,写法一) <%@ Page Langu ...
随机推荐
- python的类机制
python的类机制 参考:python面向对象 概念 方法重写/覆盖:若从父类继承的方法不能满足子类的需求,可以对其进行改写. 类变量:在实例化对象中是公用的,定义在类中,且在函数体之外,通常不作为 ...
- 一些devops、软件工程的个人感悟
1.devops不是简单的工具,是思想. (1)devops核心在于快速编译构建.自动测试化.自动部署发布 (2)工具只是辅助手段,无论是Jenkins.腾讯蓝盾等等,甚至是手动bat+bash搭建, ...
- Project Euler 638 题解
q-analog,老玩家集体起立! 这也就是说: \[\binom{n+m}{n}_q=\sum_{\pi\in L_{n,m}}q^{area(\pi)} \] 结束! #include<bi ...
- flutter-真机调试ios Traceback (most recent call last)
1 Traceback (most recent call last): 2 File "/tmp/C5FDB25B-C7F4-462E-8AC9-7FF9D1A50F21/fruitstr ...
- WPF Expander style
<!--ExpanderStyle--> <Style x:Key="ExpanderStyleOne" TargetType="{x:Type Exp ...
- 【Spring】Spring的@Autowire注入Bean的规则测试
背景 在项目中使用Spring的Bean,一般都使用默认的Bean的单例,并且结合@Autowire使用. 实在有同一个类型多个实例的情况,也使用@Qualifier或@Resource实现注入. 所 ...
- Archlinux 更新失败之驱动与 Xorg 配置错误
Archlinux系统更新是滚动更新,所以更新失败又被叫做"滚挂了" 此次滚挂发生在1月27日,过了那么久了才想起来该记录了-- 现象 滚挂的现象是,能够进系统,但是笔记本电脑自带 ...
- Oracle 23ai TPC-H 执行情况
TPC-H是一个广泛使用的基准测试,用于评估数据库系统在决策支持系统(DSS)场景下的性能. 在昨天的文章中,我们完成了<Oracle 23ai TPC-H 测试环境部署>,本文将继续记录 ...
- Mermaid Live Editor 如何调整方向
在 Mermaid Live Editor 中,默认情况下,流程图和序列图等都是按照从左到右的方向来布局的.但是,如果你想要创建一个从上到下(纵向)布局的图形,你可以使用 TD(Top-Down,即从 ...
- STM32 学习方法
前言 学习知识要掌握有效的学习方法,学习技术也是一样,本篇分享关于我学习 STM32 后总结的学习方法. 推荐的学习方法 系统学习 在网上购买一款开发板,使用开发板+开发板配套视频教程+开发板配套源码 ...