vue子组件监听父组件数据变化并作出改变(亲测有效)

这篇具有很好参考价值的文章主要介绍了vue子组件监听父组件数据变化并作出改变(亲测有效)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

vue子组件监听父组件数据变化并作出改变(亲测有效)

1. 问题

1.1 封装组件时经常会遇到子组件需要根据父组件数据变化并执行对应的操作逻辑
1.2 监听方法中加了deep、immediate 等参数监听数组/对象还是没有生效
1.3 类型table组件需要根据父组件数据变化对表格数据进行更新
1.4 根据数据动态渲染组件需实时监听父组件变化
1.5 使用$refs 有些时候很难找到嵌套组件的ref

2. 思路

2.1 本文章主要的思路就是 provide / inject

vue子组件监听父组件数据变化并作出改变(亲测有效)

2.2 创建父组件时,无论有多少层级的子组件都可以进行数据的相互依赖
2.3 那么在子组件可以利用这些依赖对父组件数据进行监听

3. 解决方法

3.1 首先在父组件定义 provide,代码如下
//父组件提供参数给子组件(响应式时需设置为对象)
provide(){
  return {
    superParams:this
  }
},
data(){ //定义几个参数
	return {
		test:{
          testLevel1:{
            testLevel2:''
          }
        },
        testList:[]
	}
}
3.2 子组件添加 inject,代码如下
// 子组件:childrenComponent1
inject: ['superParams'],
watch:{ //监听数据变化
  'superParams.test':{
      immediate:true, // 将立即以表达式的当前值触发回调
      handler:function (val,oldVal) {
          console.log("监听test对象");
          console.log(val,oldVal);
      },
      deep:true,
  },
  'superParams.test.testLevel1':{
      immediate:true, // 将立即以表达式的当前值触发回调
      handler:function (val,oldVal) {
          console.log("监听testLevel1属性");
          console.log(val,oldVal);
      },
      deep:true,
  },
  'superParams.test.testLevel1.testLevel2':{
      immediate:true, // 将立即以表达式的当前值触发回调
      handler:function (val,oldVal) {
          console.log("监听testLevel1属性");
          console.log(val,oldVal);
      },
      deep:true,
  },
  'superParams.testList':{
      immediate:true, // 将立即以表达式的当前值触发回调
      handler:function (val,oldVal) {
          console.log("监听testList数组");
          console.log(val,oldVal);
      },
      deep:true,
  }
}
3.3 另外一个子组件触发父组件数据变化(同/不同层级都可以触发)
// 子组件:childrenComponent2
inject: ['superParams'],
mounted(){
   this.superParams.test.testLevel1.testLevel2 = 'testLevel22';
   this.superParams.testList.push({test:'test'})
}
举例一(子组件按顺序展示):先显示childrenComponent2 ,再到childrenComponent1,(下图的数据在childrenComponent1展示后输出)结果如图所示

vue子组件监听父组件数据变化并作出改变(亲测有效)

举例二(子组件都展示, 在父组件或其他地方触发数据更新)

在父组件添加一个按钮点击触发方法代码如下

updateText(){
  console.log("Text数据更新");
  this.test.testLevel1.testLevel2 = 'testLevel22';
  this.testList.push({test:'test'})
}

结果如下图所示
vue子组件监听父组件数据变化并作出改变(亲测有效)

注意

  1. 当前组件监听方法数据作出了改变,但组件却没有更新,这时需在组件本身找更新原因
  2. 组件显示时会对监听方法进行初始化
  3. 对于对象存在多层的监听问题,可监听整个对象
  4. 对于数组会不会存在漏监听的情况,经测试调用数组的pop、push、shift、unshift、splice、sort、reverse等方法时是可以监听到数组的变化
  5. immediate、deep 要了解

补充

针对注意点1,以el-input-number(element ui)组件为例

<el-input-number v-model="item.max" @change="handleChange" :min="0" :key="Math.random()" :max="superParams.max"></el-input-number>

在没有加上 :key=“Math.random()” 前组件并没有随着父组件数据(superParams.max)变化

加上后可根据父组件数据动态改变

父组件改变参数值代码如下图所示

'formData.isTrue':function (val,oldVal) {
 if(val){
   this.max = 100;
 }else {
   this.max = 50;
 }
},

并不是所有组件都能用 :key=“Math.random()” ,某些组件使用后会出现卡顿或者无法输入值文章来源地址https://www.toymoban.com/news/detail-403423.html

到了这里,关于vue子组件监听父组件数据变化并作出改变(亲测有效)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • vue watch监听数据变化

    监听数据变化,在Vue中是通过侦听器来实现的,你也可以将它理解为监听器,时刻监听某个数据的变化 这一次我们要添加的是watch属性。下面我们先来眼熟一下侦听器的添加位置: 侦听器更多的是用在异步操作中,所谓异步操作就是数据返回有所延迟的操作,比如说我们要请

    2024年02月12日
    浏览(35)
  • 微信小程序——自定义组件组件的创建和引用,修改组件的样式隔离选项,stylesolation的可选值,properties属性,data数据,methods方法,数据监听器,用法,监听对象属性的变化

    ①在项目的根目录中,鼠标右键,创建 components - test 文件夹 ②在新建的 components - test 文件夹上,鼠标右键,点击\\\"新建 Component \\\" ③键入组件的名称之后回车,会自动生成组件对应的4个文件,后缀名分别为 js , json ,. wxml 和. wxss 注意,为了保证目录结构的清晰,建议把不同的

    2024年02月15日
    浏览(49)
  • el-tree树回显删除某项,再次点开树形组件无变化,实际数据已改变

    页面有添加和删除已选选项的按钮,点击删除一个选项,再点添加,打开树形弹窗,发现弹窗被删除的选项还在 原因 : 发现是添加的时候,调的方法是,el-tree树形组件里check方法,这是错误的 初始化会根据default-checked-keys属性,默认已选项,直接勾选对应值,而不是通过

    2024年02月11日
    浏览(22)
  • docker搭建elk环境并实现logstash监听logback,亲测有效!!!

    原因:线上日志太多且没有长期保存,导致问题发现晚点就找不到日志了,当然可以更改日志保存时间,但是还有个问题就是不好查询,需要根据时间去查找到底查询哪个日志文件,于是想到了用elk收集日志,这样就好查询了。 简单了解了一下elk是什么,首先elk是三个中间件

    2024年01月17日
    浏览(41)
  • 监听H5浏览器返回事件,解决监听webviewH5返回事件,触发H5给小程序传参(亲测有效)

    在浏览器中,会有点击返回、后退、上一页等按钮实现自己的关闭页面、调整到指定页面、确认离开页面或执行一些其它操作的需求。可以使用 popstate 事件进行监听返回、后退、上一页操作。 1.window.history.back(),后退 2.window.history.forward(),前进 3.window.history.go(num),前进或后

    2024年02月16日
    浏览(30)
  • vue3监听路由的变化

    可以使用监听 router.currentRoute.value 的值,,来监听路由的变化。 引入: setup使用 : 控制台输出的值 newValue : 如果我们只需要监听当前路由 name 的变化,就可以这么监听 router.currentRoute.value.name immediate:true //true 就表示会立即执行。(watch默认绑定,页面首次加载时,是不会执行

    2024年02月12日
    浏览(34)
  • vue2 如何监听数组的变化

    在Vue 2中,底层是通过重写数组的原型方法来实现对数组变化的监听。具体来说,Vue 2使用了一个名为Observer的类来劫持数组的原型方法,使其在调用这些方法时能够触发相应的变化通知。 当Vue 2初始化一个响应式对象时,如果对象是一个数组,Vue会将数组的原型指向一个经过

    2024年02月12日
    浏览(37)
  • vue3 监听props 的变化

    再三说明 仅仅个人学习用,不误导别人 我觉得props 会创建对应的属性,去接受这些值,比如传递一个ref的基本值 age props.age = age.value 传递一个ref的引用值 person props.person= person.value 传递一个reactive的引用值 person props.person= person 最开始时候,props指向了一个响应式的reactive pe

    2024年02月11日
    浏览(28)
  • Vue2 、vue3 监听对象的变化

    vue响应式也叫作数据双向绑定 MVVM模型 (Model-Viem-ViewModel) DOM listeners:实现了页面与数据的绑定,当页面操作数据的时候 DOM 和 Model 也会发生相应的变化 Data Bindings:  实现了数据与页面的绑定,当数据发生变化的时候会自动渲染页面 2.1  实现原理 vue实现数据响应式,是通过

    2024年02月04日
    浏览(36)
  • Vue,js 监听window窗口尺寸变化

    1.监听window窗口变化 VueJs 监听 window.resize 方法,同时窗口拉伸时会频繁触发resize函数,导致页面性能 卡顿 ,可以搭配setTimeout来提升性能 在mounted中挂载resize方法 watch 监听 data中或props传递的数据

    2024年02月11日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包