Vue核心知识-Vue的组件之自定义双向绑定

实现类似 v-model 的功能

实现数据双向绑定

在组件内,添加 props;组件修改数据时 emit 事件,并把改的新值传出去;从而实现数据的双向绑定。

import Vue from 'vue'

const component = {
  props: ['value'],
  template: `
    <div>
      <input type="text" @input="handleInput" :value="value"/>
    </div>
  `,
  methods: {
    handleInput (e) {
      this.$emit('input', e.target.value)
    }
  }
}

new Vue({
  components: {
    CompOne: component
  },
  el: '#root',
  data () {
    return {
      value: '123'
    }
  },
  template: `
    <div>
      <comp-one
        :value="value"
        @input="value = arguments[0]"
      >
      </comp-one>
    </div>
  `
})
复制代码

直接使用 v-model

与上述例子,效果相同。

v-model 相当于给组件增加了 一个 props 属性以及一个事件监听,实现了双向绑定的逻辑。本质上与上个例子一样。

template: `
    <div>
      <comp-one v-model="value"></comp-one>
    </div>
  `
复制代码

自定义 v-model

当组件使用 value 实现了一个功能,但又需要实现双向绑定,这时就会有冲突。

通过 定义组件时的 model 选项,从而实现了自定义组件 v-model 功能。

类似编辑器的功能,可能用 v-model 的方式会更好,可以通过这种方式使用。

import Vue from 'vue'

const component = {
  model: {
    prop: 'value1',
    event: 'change'
  },
  props: ['value1'],
  template: `
    <div>
      <input type="text" @input="handleInput" :value="value1"/>
    </div>
  `,
  methods: {
    handleInput (e) {
      this.$emit('change', e.target.value)
    }
  }
}

new Vue({
  components: {
    CompOne: component
  },
  el: '#root',
  data () {
    return {
      value: '123'
    }
  },
  template: `
    <div>
      <comp-one v-model="value"></comp-one>
    </div>
  `
})
复制代码

转载于:https://juejin.im/post/5b92927df265da0af6099074

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值