VUE 自定义组件的双向数据绑定 和替代钩子

父组件 

   <task-checkbox v-model="checked"></task-checkbox>

子组件

1、定义model

  // 步骤一、model
  model: {
    prop: 'value', //(value取名为checked)接收到的双向绑定值 如果不写model 默认为value
    event: 'update' //给父组件传值的方法名
  },

2、// 步骤二、props接收值

 // 步骤二、props接收值
  props: {
    checked: {
      // type: String,
      default() {
        return '123'
      },
      require: true
    }
  },

3、必须用计算属性或者data对接收到的值做处理

 
  computed: {
    _checked: {
      get() {
        return this.checked
      },
      set(val) {
        this.$emit('update', val)
      }
    }
  },

4、可以加一些方法,注意不要和update重名就行

子组件代码如下:

<template>
  <div>
    <input type="checkbox" v-model="_checked" id="checkAll" />
  </div>
</template>

<script>
export default {
  name: 'task-checkbox',

  // 步骤一、model
  model: {
    prop: 'checked', //(value取名为checked)接收到的双向绑定值 如果不写model 默认为value
    event: 'update' //给父组件传值的方法名
  },

  // 步骤二、props接收值
  props: {
    checked: {
      // type: String,
      default() {
        return '123'
      },
      require: true
    }
  },

  // 必须用计算属性或者data对接收到的值做处理
  computed: {
    _checked: {
      get() {
        return this.checked
      },
      set(val) {
        this.$emit('update', val)
      }
    }
  },

  methods: {
    checkAll() {
      this.$emit('all')
    }
  }
}
</script>

<style></style>
View Code

其实不用组件双向数据绑定呀~

用ref 也可以实现相似的功能

父组件这么写:

html

    <task-checkbox @click.native="all" ref="zxd"></task-checkbox>

js:

  all() {
      console.log('点到了')
      let val = this.$refs.zxd.rez
      console.log(this.$refs.zxd, val)
      this.checked = val
    },

子组件:data+html

    <input type="checkbox" v-model="rez" id="checkAll" />

 data() {
    return {
      rez: true
    }
  },
 
原文地址:https://www.cnblogs.com/zhuangdd/p/14939467.html