vue.js 父子组件间 props 数据同步处理

常见的场景:

在一个vue组件A中,使用另外一个组件B。A将自己的数据通过B组件的Props属性(propX)传递到B组件实例内部,B组件内部会修改该Props属性(propX)的值,此时在A组件内部的数值是否会收到影响呢?如下:

复制代码
<template>
............
<el-dialog title="XXXX" :visible="show">
   ...............
</el-dialog>
.............
</template>

<script>
export default {
  name: "A",
  data() {
    return {
        show:true
    };
  },
  methods:{
    ............
  }
}
复制代码

上面的组件A中使用了 el-dialog,并绑定了 el-dialog 的 visible值为show。在程序运行起来后 el-dialog 默认弹出,手动关闭 el-dialog 此时在组件A中show的值会是什么呢?仍然是true,并不是false。

造成这种问题的原因就是 el-dialog 内部 对 visible 属性的修该,并不能同步回到父组件A中的show。要解决上面的 el-dialog 不能同步回 visible 变化的问题很简单:

<el-dialog title="XXXX" :visible.sync="show">
   ...............
</el-dialog>

这样 el-dialog 对 visible 的修改就能同步到父组件A的show上。

问题完美解决了,那到底是如何解决的呢?不如打开 el-dialog 的源码学习一下:

hide(cancel) {
        if (cancel !== false) {
          this.$emit('update:visible', false);
          this.$emit('close');
          this.closed = true;
        }
      }

实际上是在关闭时调用hide函数通过this.$emit('update:visible', false)来更新 visible 的值。

既然如此,我们自定义的组件也可以如法炮制,使其Props属性支持sync

子组件:

复制代码
<template>
    <div>
        <button @click="click">点我</button>
    </div>
</template>
<script>
export default {
    name:"cx",
    props:{
        propx:{
            type:Boolean,
            default:false
        }
    },
    data(){
        return {

        }
    },
    methods:{
        click(){
            this.$emit("update:propx",false)
        }
    }
    
}
</script>
复制代码

父组件:

复制代码
<template>
  <div id="app">
    <cx :propx.sync="v"></cx>
  </div>
</template>

<script>

import cx from './packages/cx'
export default {
  name: 'app',
  components:{
    "cx":cx
  },
  data () {
    return {
      v:true
    }
  },
  methods:{
  }
}
</script>
复制代码

效果:

 

点击后:

 

posted @ 2019-07-20 15:33  DW039  阅读(3178)  评论(0)    收藏  举报
编辑推荐:
· 如何通过向量化技术比较两段文本是否相似?
· 35+程序员的转型之路:经济寒冬中的希望与策略
· JavaScript中如何遍历对象?
· 领域模型应用
· 记一次 ADL 导致的 C++ 代码编译错误
阅读排行:
· 独立项目运营一周年经验分享
· 一款开源免费、通用的 WPF 主题控件包
· 独立开发,这条路可行吗?
· 【定时任务核心】究竟是谁在负责盯着时间,并在恰当时机触发任务?
· 解决了AI聊天的10个痛点后,我又做了一个新功能:交叉分析表
点击右上角即可分享
微信分享提示