vue组件双向绑定

在Vue中,双向绑定是一个核心概念,它允许数据在视图(View)和组件的状态(或数据模型)之间自动同步。这种机制主要通过Vue的v-model指令来实现,但v-model实际上是一个语法糖,它背后依赖于.sync修饰符(在Vue 2.3.0+中引入,用于自定义组件的双向绑定,但在Vue 3中被移除,因为推荐使用v-model的自定义模型绑定方式)或者更基础的v-bind(用于绑定数据到子组件的props)和v-on(或@,用于监听子组件的事件)来实现。

使用v-model实现双向绑定

对于Vue的内置组件(如<input>, <select>, <textarea>等),v-model提供了非常方便的双向绑定功能。例如:

<template>
  <div>
    <input v-model="message" placeholder="edit me">
    <p>Message is: {{ message }}</p>
  </div>
</template>

<script>
export default {
  data() {
    return {
      message: ''
    }
  }
}
</script>

在这个例子中,message数据属性被绑定到<input>元素的value属性上,并且当<input>的值发生变化时,message也会自动更新,这就是双向绑定的效果。

自定义组件的双向绑定

对于自定义组件,Vue 2.2.0+允许你使用.sync修饰符来实现类似v-model的双向绑定效果,但Vue 3推荐使用自定义v-model的方式。

Vue 2中使用.sync修饰符

Vue 2.3.0+引入了.sync修饰符,它可以简化子组件更新父组件传入的prop的流程。但请注意,.sync并不是真正的双向绑定,它只是语法糖,用于$emit一个update:myPropName事件。

<!-- 子组件 -->
<template>
  <div>
    <button @click="$emit('update:title', newTitle)">Change title</button>
  </div>
</template>

<script>
export default {
  props: ['title'],
  data() {
    return {
      newTitle: 'New title'
    }
  }
}
</script>

<!-- 父组件 -->
<template>
  <div>
    <child-component :title.sync="parentTitle"></child-component>
  </div>
</template>

<script>
import ChildComponent from './ChildComponent.vue'

export default {
  components: {
    ChildComponent
  },
  data() {
    return {
      parentTitle: 'Old title'
    }
  }
}
</script>
Vue 3中的自定义v-model

在Vue 3中,.sync修饰符被移除了,推荐使用自定义v-model的方式来实现双向绑定。你可以通过指定modelValue作为prop名,并监听update:modelValue事件来实现。

<!-- 子组件 -->
<template>
  <div>
    <button @click="emitTitleUpdate">Change title</button>
  </div>
</template>

<script>
export default {
  props: {
    modelValue: String
  },
  emits: ['update:modelValue'],
  methods: {
    emitTitleUpdate() {
      this.$emit('update:modelValue', 'New title');
    }
  }
}
</script>

<!-- 父组件 -->
<template>
  <div>
    <child-component v-model="parentTitle"></child-component>
  </div>
</template>

<script>
import ChildComponent from './ChildComponent.vue'

export default {
  components: {
    ChildComponent
  },
  data() {
    return {
      parentTitle: 'Old title'
    }
  }
}
</script>

在这个例子中,v-model在父组件中被用作modelValue的简写,并且监听update:modelValue事件来更新parentTitle。这是Vue 3中推荐的自定义组件双向绑定的方式。

Vue组件双向绑定可以通过v-model指令或者通过prop和自定义事件实现。 使用v-model指令,可以将表单控件或者组件与数据进行双向绑定。例如,在一个input元素上使用v-model指令,可以将输入框的值与Vue实例中的数据进行关联,当输入框的值发生变化时,数据也会相应地更新。示例代码如下: ``` <div id="app"> <input type="text" v-model="text"> {{ text }} </div> <script> var vm = new Vue({ el: '#app', data: { text: 'hello world' } }); </script> ``` 另一种实现方式是通过prop和自定义事件实现双向绑定。在父组件中将数据通过prop传递给子组件,并在子组件中通过自定义事件将变化的值传递回来。示例代码如下: 父组件代码: ``` <template> <div> <child :data="num" @on-change="num=$event"></child> {{num}} </div> </template> <script> import child from './child' export default { components:{ child }, data(){ return { num:0 } } }; </script> ``` 子组件代码: ``` <template> <div> <input type="text" :value="data" @input="change"> </div> </template> <script> export default { props: { data: Number }, methods: { change(event) { this.$emit("on-change", Number(event.target.value)); } } }; </script> ``` 这样,当子组件的输入框的值发生变化时,通过自定义事件将变化的值传递给父组件,父组件接收到值后更新自己的数据,从而实现了双向绑定。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [vue实现双向绑定的方式](https://blog.csdn.net/weixin_52099241/article/details/130497149)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [vue组件之间的双向绑定](https://blog.csdn.net/yimawujiang/article/details/87439295)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值