vue子组件改变父组件传递的prop值,sync实现数据双向绑定

最近开始在用elementUI作一个后台管理系统项目,遇到一个问题,需求是这样,在父组件有一个按钮,点击按钮会显示弹窗(子组件),在子组件中用的是elementUI 的el-diolog弹窗组件,在关闭弹窗时(elementUI自带事件)便会报错。话很少说直接上代码。html

DEMO
这是父组件的代码:vue

<template>
    <div>
         <app-refund :dialogVisible="refundVisible"></app-refund>
        // 下面是一个按钮,点击此按钮会触发refundFunc,并显示弹窗
         <el-dropdown-item @click.native="refundFunc">点击此按钮显示弹窗</el-dropdown-item>
    </div>
</template>
<script>
import refund from '@/pages/customer/refund'
export default {
    components: {
         "app-refund":refund
    },
    data(){
        return {
            refundVisible:false
        }
    },
      methods: {
      refundFunc:function(){
        this.refundVisible=true
        }
       }
}
</script>

如下是子组件的代码,为了使代码看起来更方便简洁,已经把其余冗余的代码删除,只留下能实现功能的必要代码app

<template>
  <div>
  <el-dialog
     title="退余额"
    :visible.sync="dialogVisible"
    width="630px">
    </el-dialog>
  </div>
</template>
<script>
     export default { 
         props:{
          dialogVisible: {
            type:Boolean,
            default: false,
          }
        },
    }
</script>

以上即是在父组件控制子组件的显示,而在子组件关闭弹窗的例子,这样确定是不行的,由于在vue中props数据是单向流,不能在子组件改变父组件传过来的prop值,而解决方式就是用emit来更新prop值,解决方案以下。ide

父组件代码,js部分和上面如出一辙,这里就不重复写了:ui

<template>
    <div>
         <app-refund :dialogVisible.sync="refundVisible"></app-refund>
        // 下面是一个按钮,点击此按钮会触发refundFunc,并显示弹窗
         <el-dropdown-item @click.native="refundFunc">点击此按钮显示弹窗</el-dropdown-item>
    </div>
</template>

子组件代码:this

<template>
  <div>
  <el-dialog
     title="退余额"
    :visible.sync="dialogVisible"
    :before-close="hidePanel"
    width="630px">
    </el-dialog>
  </div>
</template>
<script>
     export default { 
         props:{
          dialogVisible: {
            type:Boolean,
            default: false,
          }
        },
           methods: {  
         // 利用sync进行数据双向绑定,子组件修改dialogVisible的值,并响应到父组件
          hidePanel() {
              this.$emit('update:dialogVisible', false)
          }
        },
    }
</script>

这里用到了elementUI的before-close方法,是弹窗关闭前的回调,用在这里的意思是在element自带的关闭弹窗方法以前调用hidePanel方法,由咱们来控制弹窗的关闭,这样就能在关闭时更新dialogVisible的值,解决报错。.net

原理
不少时候咱们须要在子组件中修改prop的值,这样就破坏了vue的单项数据流,利用vue2.3的sync能够实现数据的双向绑定,这是官方解释 https://cn.vuejs.org/v2/guide... ,使用方式也很简单。
————————————————
版权声明:本文为CSDN博主「包子是只猫」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处连接及本声明。
原文连接:https://blog.csdn.net/qq_3495...双向绑定

相关文章
相关标签/搜索