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. 0基础90分钟会用PS——GenJi笔记

    数码图像的相关基础概念 1.位图和矢量图 位图 也叫点阵图像,位图使用也称像素的一格一格的小点来描述图像,图放大后我们可以看到像素点 矢量图 根据几何特性来绘制图形,用线段和曲线描述图像,可以是一个一 ...

  2. Java中math类的常用函数

    Java中math类的常用函数 在 Java 中 Math 类封装了常用的数学运算,提供了基本的数学操作,如指数.对数.平方根和三角函数等 只要在源文件的顶部加上下面这行代码就不必在数学方法名和常量名 ...

  3. 你所不知道的 vscode,汇集历史版本中你可能不知道的新特性

    壹 ❀ 引 vscode可以毫不夸张的说是大部分前端同学吃饭的工具(webstorm除外),随着时间的推移vscode其实也在不断推出了各种新功能新特性,但vscode并不会默认就实装这些新功能,我相 ...

  4. 长文梳理muduo网络库核心代码、剖析优秀编程细节

    前言 muduo库是陈硕个人开发的tcp网络编程库,支持Reactor模型,推荐大家阅读陈硕写的<Linux多线程服务端编程:使用muduo C++网络库>.本人前段时间出于个人学习.找工 ...

  5. C# 窗体相关知识

    一  窗体 固定窗体大小,并不能最大/最小化: FormBorderStyle属性设置为:FixedSingleMaximizeBox = falseMinimizeBox = false都是在For ...

  6. 如何开发Vite3插件构建Electron开发环境

    新用户购买<Electron + Vue 3 桌面应用开发>,加小册专属微信群,参与群抽奖,送<深入浅出Electron>.<Electron实战>作者签名版. 1 ...

  7. SketchUp2020免费中文完整版官网2021教程模型库下载

    SketchUp2022 WIN10 64位安装步骤: 1.先使用"百度网盘客户端"下载SU22_CN_x64安装包到电脑磁盘里,并鼠标右击进行解压缩,然后找到SketchUpPr ...

  8. 回溯算法经典问题总结(.NET版)

    回溯算法 回溯法其实也是一种递归,本质上就是穷举,然后筛选出符合规则的数据.为了使回溯更加高效,我们根据规则要求,在穷举过程中加上条件限制(也就是剪枝). 我们什么场景下应该想到使用回溯法呢? 如何画 ...

  9. C语言实验手册

    在三位整数(100~999)中寻找符合条件的整数,并以此从小到大存到数组当中,它既是完全平方数,又是两位数字相同,例如144,676等. #include<stdio.h> #includ ...

  10. Training: ASCII

    题目链接:http://www.wechall.net/challenge/training/encodings/ascii/index.php 让我们使用标准的美国信息交换编码格式解下面的ASCLL ...