自定义组件实现双向绑定

父组件

<sbind-data v-model="keywords" />

子组件:

<template>
  <div>
    {{ childValue }}
    <el-input v-model="childValue" @input="change" />
  </div>
</template>
 
<script>
  export default {
    name: 'Index',
    props: {
      value: {
        type: [String, Array],
        default: () => {},
      },
    },
    data() {
      return {
        childValue: '',
      }
    },
    watch: {
      value(newValue, oldValue) {
        console.log(oldValue)
        this.childValue = newValue
      },
    },
    mounted() {
      this.childValue = this.value
    },
    created() {},
    methods: {
      change() {
        this.$emit('input', this.childValue)
      },
    },
  }
</script>
 
<style scoped></style>

 

33ee888aa4b4c89d40c95d2fafaa49d6.png

 

Vue 2 中的自定义组件双向绑定通常通过 `v-model` 指令来实现。在 Vue 2.x 版本中,默认情况下 `v-model` 在表单元素上提供了一种便捷的方式来创建双向数据流,对于自定义组件来说也可以类似地工作。 ### 实现步骤 1. **默认值**:当我们在 `<input>`、`<textarea>` 和选择器等原生 HTML 元素上使用 `v-model` 时,它会在内部自动将它们解析为 `value` 属性和 `input` 事件对儿;而对于自定义组件,则需要我们明确指定这两个部分。 2. **props 和 $emit() 方法**: 我们可以利用 props 接收来自父级的数据,并结合 `$emit()` 方法触发更新事件向上传递新的值给父组件,以此达到双向绑定的效果。 #### 示例代码: 假设我们要构建一个简单的输入框组件 `my-input` 并支持 `v-model`, 可以这样做: ```javascript // 子组件 MyInput.vue 文件内容如下: export default { name: "MyInput", props: ['value'], // 父级传递下来的初始值 methods:{ handleChange(event){ this.$emit('input', event.target.value); // 向上级发送新值 } }, template:`<input :value="value" @input="handleChange"/>` } ``` 然后,在父组件里你可以像下面这么用这个组件了: ```html <div id="app"> <label>请输入一些文字:</label> <!-- 使用 v-model 将其与 data 绑定 --> <my-input v-model.trim="message"></my-input> <p>Message is: {{ message }}</p> </div> <script type="text/javascript"> new Vue({ el:"#app", components:{ 'my-input': MyInput }, data(){ return{ message:'Hello' }; } }); </script> ``` 这里的关键点在于子组件接收了一个名为 value 的 prop 来代表当前的状态,并且每当用户修改输入框的内容时都会发出 input 事件通知父组件状态的变化,而这一切都是透明化的由 v-model 完成操作连接起来的过程。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值