双向绑定的须要

在有些状况下,咱们可能须要对一个 prop 进行“双向绑定”。可怜的是,真正的双向绑定会带来保护上的问题,因为子组件能够变更父组件,且在父组件和子组件两侧都没有显著的变更起源。以下就是在vue2和vue3中如何实现双向绑定的实例

vue2中双向绑定的实现(2.3.0+)

在vue2中实现双向绑定,次要是在在父组件中应用 :属性名.sync修饰符和在子组件中this.emit('update:属性名',属性值)形式去实现

子组件

<template>  <div class="hello">    <div>      {{ num }}    </div>    <button @click="addNum"></button>  </div></template><script>export default {  name: "TwoWayBinding",  props: {    num: Number,  },  methods: {    addNum() {      this.$emit("update:num", this.num + 1);    },  },};</script>

父页面

<template>  <div id="app">    <TwoWayBinding :num.sync="num" />  </div></template><script>import TwoWayBinding from "./components/TwoWayBinding.vue";export default {  name: "App",  components: {    TwoWayBinding,  },  data() {    return {      num: 4,    };  },  mounted() {},};</script>

vue3.2中双向绑定的实现

在vue3中实现双向绑定,次要是在在父组件中应用v-model:属性名和在子组件中emit('update:属性名',属性值)的形式去实现

子组件

<template>  <div>{{num}}</div>  <button @click="addNum">加1</button></template><script  setup>import {defineProps,defineEmits} from 'vue'const props = defineProps({  num:Number})const emit = defineEmits('update:num')const addNum = () =>{  emit('update:num',props.num+1)}</script>

父页面

<template>  <div id="app">    <two-way-binding-vue v-model:num="num"></two-way-binding-vue>  </div></template><script setup>import { ref } from 'vue';import TwoWayBindingVue from './components/TwoWayBinding.vue';const num = ref(4)</script>