vue父子组件的双向绑定实现方式


最近 做组件封转的时候用到了父子组件之间的数据双向绑定问题,主要应用场景为:

1、在实现一个具有插槽效果的弹出框时,控制弹出框显示的show值变为true 若是直接通过props传给子组件,子组件虽然打开了弹出框,但是子组件关闭弹出框=>即子组件接收父组件的show变为false后,因为组件参数的传递是单向的,父组件的show并没有被变成false,所以导致了弹出框只能被打开一次的情况出现。

这时候,就需要实现父子组件之间的show值的双向绑定才能对弹出框显示关闭的自由控制。

解决示例:

父组件调用<Dialog >子组件:

    <div class="dialogBox">
      <el-button @click="show = true">openDialog</el-button>
      <Dialog :visible.sync='show' width='30%' :buttonsGrounpSwitch="true"></Dialog>
    </div>

子组件:

    <div v-cloak id="dialog">
      <el-dialog :title="title" :visible.sync="show" :width="width" :close-on-click-modal='false' :show-close='false'>
        <div>弹出框内容</div>

        <div slot="footer" class="dialog-footer">
          <div v-if="!buttonsGrounpSwitch">
            <el-button v-if="isShowCancel" @click="cancel">{{cancelText}}</el-button>
            <el-button type="primary" @click="ack">{{ackText}}</el-button>
          </div>
        </div>

      </el-dialog>
    </div>

    props:{

      visible : {
        type : Boolean,
        default:false
      },

    }

    data(){
      return{
        show : false
      }
    },

    watch: {
      visible() {
         this.show = this.visible;
      },
    },

      methods:{

      cancel(){
        this.show = false;
        //双向绑定show 同步更改父组件的visible值
        this.$emit('update:visible',this.show);
      },
      ack(){
        this.show = false;
        //双向绑定show 同步更改父组件的visible值
        this.$emit('update:visible',this.show);
      }

    }

    

父组件中在传show值时在参数名后添加.sync 修饰符,在子组件中的关闭事件中加入this.$emit('update:visible',false);广播false给父级添加了修饰符的参数实现双向绑定。可以在父级使用观察者模式观察子组件关闭后父组件show值是否同步变化。

 

 

2、做搜索栏组件时,父组件的一个v-model参数与搜索子组件实现搜索关键字的双向绑定。

示例如下 :

父组件 :

  <SearchBar v-model="searchKey"></SearchBar>

子组件props使用value接受父组件v-model的搜索关键字:

  props:{
    value : {
      type: String,
      required: true
    }
  }

  使用watch观察者模式监听关键字输入的变化:

  watch : {

    value() {
      this.searchKey = this.value;
    },

  },

  methods:{
    inputSearch(){
      this.$emit('input',this.searchKey);
    },
  },

  将变化的值实时赋值给子组件内部真实的搜索关键字searchKey之后使用 this.$emit('input', this.searchKey);实时调用input事件广播子组件关键字


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM