位置: IT常识 - 正文
推荐整理分享vue子组件监听父组件数据变化并作出改变(亲测有效)(vue子组件监听父组件),希望有所帮助,仅作参考,欢迎阅读内容。
文章相关热门搜索词:vue子组件监听父组件传过来的数组变化,vue子组件监听父组件变化watcheffect,vue子组件监听父组件,vue子组件监听父组件数据,vue子组件监听父组件事件,vue子组件监听父组件属性变化,vue子组件监听父组件传值变化,vue子组件监听父组件属性变化,内容如对您有帮助,希望把文章链接给更多的朋友!
2.2 创建父组件时,无论有多少层级的子组件都可以进行数据的相互依赖2.3 那么在子组件可以利用这些依赖对父组件数据进行监听3. 解决方法3.1 首先在父组件定义 provide,代码如下//父组件提供参数给子组件(响应式时需设置为对象)provide(){ return { superParams:this }},data(){ //定义几个参数return {test:{ testLevel1:{ testLevel2:'' } }, testList:[]}}3.2 子组件添加 inject,代码如下// 子组件:childrenComponent1inject: ['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 另外一个子组件触发父组件数据变化(同/不同层级都可以触发)// 子组件:childrenComponent2inject: ['superParams'],mounted(){ this.superParams.test.testLevel1.testLevel2 = 'testLevel22'; this.superParams.testList.push({test:'test'})}举例一(子组件按顺序展示):先显示childrenComponent2 ,再到childrenComponent1,(下图的数据在childrenComponent1展示后输出)结果如图所示举例二(子组件都展示, 在父组件或其他地方触发数据更新)在父组件添加一个按钮点击触发方法代码如下
updateText(){ console.log("Text数据更新"); this.test.testLevel1.testLevel2 = 'testLevel22'; this.testList.push({test:'test'})}结果如下图所示
注意当前组件监听方法数据作出了改变,但组件却没有更新,这时需在组件本身找更新原因组件显示时会对监听方法进行初始化对于对象存在多层的监听问题,可监听整个对象对于数组会不会存在漏监听的情况,经测试调用数组的pop、push、shift、unshift、splice、sort、reverse等方法时是可以监听到数组的变化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()” ,某些组件使用后会出现卡顿或者无法输入值
上一篇:微信小程序项目实例——我有一支画笔(画画)(微信小程序项目中app.js文件是全局样式文件)
下一篇:使用vite 搭建vue 3的项目(vite搭建vue3)
友情链接: 武汉网站建设