vue 父子组件传值数据不能实时更新问题

解决方案一: 在子组件进行深度监听,然后监听里调用方法就可以了

父组件测试代码

<WranList ref="myEMChartRef2" :data-arr="dataArr" />

data() {
return {
dataArr: ['父组件初始的数据测试dataArr'],
}
}, mounted() {
let ii = 0
setInterval(() => {
ii++
this.dataArr = ['定时器' + ii]
console.log('父组件改变子组件值,改变后的值为', this.dataArr)
this.$refs && this.$refs.myEMChartRef2 && this.$refs.myEMChartRef2.reFresh()
}, 10000);
}

子组件测试代码

props: {
dataArr: {
type: Array,
required: true,
default: () => {
return []
}
}
}, data() {
return {
currentDataArr: this.dataArr
}
}, watch: {
dataArr(val) {
console.log('子组件深度监听获取的val', val)
this.currentDataArr = [...val]
this.reFresh() // 打开这个就可以更新为最新数据了
}
}, methods: {
reFresh() {
console.log('当前子组件方法里内数据', this.currentDataArr)
}
}

打印结果


父组件改变子组件值,改变后的值为 ["定时器2", __ob__: Observer]
当前子组件方法里内数据 ["定时器1", __ob__: Observer]
子组件深度监听获取的val ["定时器2", __ob__: Observer] 父组件改变子组件值,改变后的值为 ["定时器3", __ob__: Observer]
当前子组件方法里内数据 ["定时器2", __ob__: Observer]
子组件深度监听获取的val ["定时器3", __ob__: Observer] 父组件改变子组件值,改变后的值为 ["定时器4", __ob__: Observer]
当前子组件方法里内数据 ["定时器3", __ob__: Observer]
子组件深度监听获取的val ["定时器4", __ob__: Observer] 父组件改变子组件值,改变后的值为 ["定时器5", __ob__: Observer]
当前子组件方法里内数据 ["定时器4", __ob__: Observer]
子组件深度监听获取的val ["定时器5", __ob__: Observer]

解决方案二this.$nextTick

let ii = 0
setInterval(() => {
ii++
this.dataArr = ['定时器' + ii]
console.log('父组件改变子组件值,改变后的值为', this.dataArr)
this.$nextTick(()=>{this.$refs.myEMChartRef2.reFresh(ii)})
}, 10000);
this.changeTiming(200000); 打印结果 父组件改变子组件值,改变后的值为 ["定时器4", __ob__: Observer]
子组件深度监听获取的val ["定时器4", __ob__: Observer]
当前子组件方法里内数据 4 ["定时器4", __ob__: Observer] 父组件改变子组件值,改变后的值为 ["定时器5", __ob__: Observer]
子组件深度监听获取的val ["定时器5", __ob__: Observer]
当前子组件方法里内数据 5 ["定时器5", __ob__: Observer]

需要特别注意的是,如果父组件给子组件传值采用this.$nextTick方式更新,子组件只声明props就可以了,不用再进行重新声明,也不需要进行深度监听

下面就是一个错误的案例

父组件

<WranList ref="myEMChartRef2" :data-arr="dataArr" />

setFunTimeOut(componentName, fun = null) {
let timeOutFun
if (this.$refs && this.$refs[componentName]) {
console.log('存在这个dom')
if (fun) { fun() } else {
console.log('存在这个dom---执行刷新函数')
console.log('执行此函数时候的dataArr', this.dataArr)
this.$refs[componentName].reFresh()
}
} else {
window.clearTimeout(timeOutFun)
timeOutFun = setTimeout(() => {
if (fun) { fun() } else {
console.log('不-----存在这个dom', this.$refs[componentName])
this.$refs[componentName].reFresh()
}
}, 1000);
}
}, // 父组件调用
this.dataArr = res2.List
console.log('this.dataArr父组件里的值', this.dataArr)
this.$nextTick(
() => { this.setFunTimeOut('myEMChartRef2') }
)

子组件


props: {
dataArr: {
type: Array,
required: true,
default: () => {
return []
}
}
}, data() {
return {
currentDataArr: this.dataArr
}
}, methods: {
reFresh() {
console.log('当前子组件方法里内数据this.dataArr', this.dataArr)
console.log('当前子组件方法里内数据this.currentDataArr', this.currentDataArr)
}
}

打印结果

this.dataArr父组件里的值 (1) ['最新新数据', __ob__: Observer]
存在这个dom
存在这个dom---执行刷新函数
执行此函数时候的dataArr (1) ['最新新数据', __ob__: Observer]
当前子组件方法里内数据this.dataArr (1) ['最新新数据', __ob__: Observer]
当前子组件方法里内数据this.currentDataArr ["上一次的数据", __ob__: Observer]

可以看出,子组件props里的数据是更新的,但是重新声明的那个是上一次的数据,假如我们要对子组件进行深度监听,比如加上下面的代码,就可以采用这种方式,但是父组件可以直接更改值,不使用this.$nextTick,但是毕竟耗费性能,所以。。。。。。你懂的

子组件可以加上这个,但是不建议

// watch: { // 暂时决定采用方案二,深度监听太耗费性能
// dataArr(val) {
// console.log('子组件深度监听获取的val', val)
// this.currentDataArr = [...val]
// // this.reFresh() // 假如说不用这行代码,子组件就不会更新数据
// }
// }

Vue 父组件传值给子组件,对象数组类型,父组件直接调用子组件方法,会是上次的引用地址,vue 父子组件传值数据不能实时更新问题的更多相关文章

  1. Vue组件传值,父传子,子传父,非父子组件

    vue3中传值方式: 1.父组件向子组件传值 父组件Blog.vue <template> <div id="blog"> <Alert v-if=& ...

  2. Vue 父组件调用子组件的方法

    qwq  前两天看了下vue,父子组件方法的调用,怕忘记,所以做个小记录. 一.父组件调用子组件的方法 1.父组件 <template> <div id="rightmen ...

  3. vue中父子组件之间的传值、非父子组件之间的传值

    在Vue实例中每个组件之间都是相互独立的,都有自己的作用域,所以组件之间是不能直接获取数据.在项目开发中一个组件可能需要获取另一个组件的值,我们可以通过其他方法间接的获取.所以,获取的方法有以下几种: ...

  4. uni-app 父组件引用子组件时怎么调用子组件的方法

    1.写一个简单的子组件main/index.vue: <template> <view> </view> </template> <script& ...

  5. Angular组件——父组件调用子组件方法

    viewChild装饰器. 父组件的模版和控制器里调用子组件的API. 1.创建一个子组件child1里面只有一个greeting方法供父组件调用. import { Component, OnIni ...

  6. vue组件父子组件传递引用类型数据

    今天在写分页功能时,发现父子组件传值时,子组件监听不到父组件中数据的变化,传递的是一个引用类型的数据 其原因是引用类型共用一个内存地址,父子组件用的是同一个对象,故子组件监听不到变化,此时就需要做一个 ...

  7. Component 父子组件关系

    我们把组件编写的代码放到构造器外部或者说单独文件 我们需要先声明一个对象,对象里就是组件的内容. var zdy = { template:`<div>Panda from China!& ...

  8. python---django中form组件(2)自定制属性以及表单的各种验证,以及数据源的实时更新,以及和数据库关联使用ModelForm和元类

    自定义属性以及各种验证 分析widget: class TestForm(forms.Form): user = fields.CharField( required = True, widget = ...

  9. js 改变对象的引用地址

    在业务处理中我们经常会碰到列表中有编辑和新增按钮,为了能够提高代码的公用性,我们经常会使用同一组件处理. 这样会出现一个问题就是编辑的时候直接把对象传过去,直接赋值,引用地址是同一个,所以不管修改了那 ...

  10. dedecms列表页调用子栏目列表,织梦首页调用栏目的子栏目标签代码

    dedecms列表页调用子栏目列表,织梦首页调用栏目的子栏目标签代码. dedecms列表页调用子栏目列表标签: {dede:channelartlist type='sun' }<a href ...

随机推荐

  1. 13.内建函数eval()

      eval函数 eval()函数十分强大 -- 将字符串当成有效的表达式来求值并返回计算结果 例如下图,eval会将字符串的引号去掉并且计算返回结果  

  2. VB6查看桌面分辨率和工作区大小 2022.08.22 name.vt

    VB6查看桌面分辨率和工作区大小 2022.08.22 name.vt Form1 内代码如下: ' 2022年8月22日 15时15分 ' 作者:name.vt Private Sub cmdCle ...

  3. 京东云开发者|关于“React 和 Vue 该用哪个”我真的栓Q

    一.前言:我全都要 面对当今前端界两座大山一样的主流框架,React和Vue,相信很多小伙伴都或多或少都产生过这样疑问,而这样的问题也往往很让人头疼和犹豫不决: 业务场景中是不是团队用什么我就用什么? ...

  4. ansible回调插件介绍(待完成)

    简介 ansible回调插件(callback plugins)允许为事件添加一些额外响应.这里的事件包括了执行任务(task)的结果,例如(ok.failed.unreachable.skipped ...

  5. 2022-11-13 Acwing每日一题

    本系列所有题目均为Acwing课的内容,发表博客既是为了学习总结,加深自己的印象,同时也是为了以后回过头来看时,不会感叹虚度光阴罢了,因此如果出现错误,欢迎大家能够指出错误,我会认真改正的.同时也希望 ...

  6. Go语言核心36讲11

    至今为止,我们讲过的集合类的高级数据类型都属于针对单一元素的容器. 它们或用连续存储,或用互存指针的方式收纳元素,这里的每个元素都代表了一个从属某一类型的独立值. 我们今天要讲的字典(map)却不同, ...

  7. Go语言核心36讲06

    我已经为你打开了Go语言编程之门,并向你展示了"程序从初建到拆分,再到模块化"的基本演化路径. 一个编程老手让程序完成基本演化,可能也就需要几十分钟甚至十几分钟,因为他们一开始就会 ...

  8. Java-(array)数组的基本概念 及 Java内存划分

    (array)数组的基本概念 数组的概念:是一种容器,可同时存放多个数据值 数组的特点: 1.数组是一种引用数据类型 2.数组当中的多个数据,类型必须统一 3.数组的长度在程序运行期间不可改变 数组的 ...

  9. vcenter密码设置永不过期

    由于机房断电,原本的vcenter重启后web页面出现报错,为尽快恢复vcenter管理机,直接停用了旧的vcenter虚机,重新安装了一台vcenter,两个月后,页面开始报警密码即将到期: 经查阅 ...

  10. django启动报错:DisallowedHost at /

    学习django第一天,第一次启动服务就报错,报错内容如下: DisallowedHost at / Invalid HTTP_HOST header: '192.168.116.22:8000'. ...