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. Python全栈工程师之从网页搭建入门到Flask全栈项目实战(3) - 入门Flask微框架

    1.安装Flask 方式一:使用pip命令安装 pip install flask 方式二:源码安装 python setup.py install 验证 第一个Flask程序 程序解释 参数__na ...

  2. Windows7下驱动开发与调试体系构建——4.在x64下使用汇编代码(x86下的_asm)

    目录/参考资料:https://www.cnblogs.com/railgunRG/p/14412321.html asm文件设置 在vs x64中无法使用_asm关键字,需要使用.asm文件. 按第 ...

  3. JavaSPI详解

    目录 一个问题 什么是SPI API 与 SPI 一个简单的例子 SPI机制的实现 Java SPI的问题 为什么SPI机制打破了双亲委派模型 参考资料 一个问题 在项目开发中,经常会使用到数据库驱动 ...

  4. 从小白到架构师(4): Feed 流系统实战

    「从小白到架构师」系列努力以浅显易懂.图文并茂的方式向各位读者朋友介绍 WEB 服务端从单体架构到今天的大型分布式系统.微服务架构的演进历程.读了三篇万字长文之后各位想必已经累了(主要是我写累了), ...

  5. 云原生之旅 - 8)云原生时代的网关 Ingress Nginx

    前言 当我们在Kubernetes部署的服务需要暴露给外部用户使用时,有三种选择:LoadBalancer,NodePort, Ingress. LoadBalancer类型得结合各个Cloud Pr ...

  6. pycharm系列---基本配置

    自动加入头文件 # _*_ coding: utf-8 _*_ # @Time : ${DATE} ${TIME} # @Author : xiechunhui # @Version:V 0.1 # ...

  7. VBA工程设置密码

    VBA 工程设置密码 Alt + F11,进入程序界面: 工具---> VBAProject属性---> 保护---> 查看时锁定工程前打勾,并在下面的密码区输入密码.

  8. Burpsuite系列1--自动扫描

    第一章 简述     Burpsuite是基于Java的用于web安全的工具,能够进行爬虫.代理.编码.密码爆破等任务,并支持对XSS漏洞.文件包含等漏洞的主动扫描或被动扫描.burpsuite2.0 ...

  9. ThinkPhp5 自定义异常处理类

    在项目的开发过程中异常抛出尤为重要不仅能够做出友好提示帮助掩盖我们伟大的程序员们尴尬的瞬间,还能做到提示开发人员代码白编写的错误,下面进行自定义异常抛出类,纯属个人理解,希望大家指正 首先在框架中我们 ...

  10. 读 Clean Code,关于变量命名和可维护代码

    原文见 http://mindprod.com/jgloss/unmain.html 如何写出不能维护的代码 如何程序命名 容易输入的名字.比如:Fred,asdf 单字母的变量名.比如:a,b,c, ...