What are the methods for implementing two-way binding in Vue?

青灯夜游
Release: 2022-12-27 18:16:28
Original
10655 people have browsed it

Vue implements two-way binding: 1. Use the v-model instruction to implement binding. The v-model on the custom component is equivalent to passing the modelValue prop and receiving the thrown update:modelValue event; 2 , use the vue-better-sync plug-in to implement binding; 3. Use the v-bind.sync modifier, the syntax is "".

What are the methods for implementing two-way binding in Vue?

The operating environment of this tutorial: windows7 system, vue3 version, DELL G3 computer.

Vue several methods to implement two-way binding

1. v-model directive

<childcomponent></childcomponent>

<!-- 是以下的简写: -->

<childcomponent></childcomponent>
Copy after login

If you want to add attributes Or the event name is changed to another name, you need to add the model option in the ChildComponent component:

<!-- ParentComponent.vue -->

<ChildComponent v-model="pageTitle" />
Copy after login
// ChildComponent.vue

export default {
  model: {
    prop: &#39;title&#39;,
    event: &#39;change&#39;
  },
  props: {
    // 这将允许 `value` 属性用于其他用途
    value: String,
    // 使用 `title` 代替 `value` 作为 model 的 prop
    title: {
      type: String,
      default: &#39;Default title&#39;
    }
  }
}
Copy after login

So, in this example v-model is the abbreviation of:

<ChildComponent :title="pageTitle" @change="pageTitle = $event" />
Copy after login

In Vue 3.x, v-model on a custom component is equivalent to passing the modelValue prop and receiving the thrown update:modelValue event:

<ChildComponent v-model="pageTitle" />

<!-- 是以下的简写: -->

<ChildComponent
  :modelValue="pageTitle"
  @update:modelValue="pageTitle = $event"
/>
Copy after login

Vue3 You can bind multiple v-model, for example: <ChildComponent v-model:title="pageTitle" v -model:name="pageName" />

2, vue-better-sync plug-in

There is a demand for this: develop a Prompt component to synchronize the user's Enter and click the button to close the pop-up window.

What are the methods for implementing two-way binding in Vue?

Generally we will do this:

<template>
  <div v-show="_visible">
    <div>完善个人信息</div>
    <div>
      <div>尊姓大名?</div>
      <input v-model="_answer" />
    </div>
    <div>
      <button @click="_visible = !_visible">确认</button>
      <button @click="_visible = !_visible">取消</button>
    </div>
  </div>
</template>

<script>
export default {
  name: &#39;prompt&#39;,
  
  props: {
    answer: String,
    visible: Boolean
  },
  
  computed: {
    _answer: {
      get() {
        return this.answer
      },
      set(value) {
        this.$emit(&#39;input&#39;, value)
      }
    },
    _visible: {
      get() {
        return this.visible
      },
      set(value) {
        this.$emit(&#39;update:visible&#39;, value)
      }
    }
  }
}
</script>
Copy after login

It’s okay to write one or two components. Once the size of the component is expanded, writing two-way binding can really cause problems. So, in order to liberate productivity, we have the vue-better-sync wheel. Let’s see how it can be used to transform our Prompt component:

<template>
  <div v-show="actualVisible">
    <div>完善个人信息</div>
    <div>
      <div>尊姓大名?</div>
      <input v-model="actualAnswer" />
    </div>
    <div>
      <button @click="syncVisible(!actualVisible)">确认</button>
      <button @click="syncVisible(!actualVisible)">取消</button>
    </div>
  </div>
</template>

<script>
import VueBetterSync from &#39;vue-better-sync&#39;

export default {
  name: &#39;prompt&#39;,
  
  mixins: [
    VueBetterSync({
      prop: &#39;answer&#39;, // 设置 v-model 的 prop
      event: &#39;input&#39; // 设置 v-model 的 event
    })
  ],
  
  props: {
    answer: String,
    visible: {
      type: Boolean,
      sync: true // visible 属性可用 .sync 双向绑定
    }
  }
}
</script>
Copy after login

vue-better-sync unifies v-model and .sync to transfer data. method, you only need this.actual${PropName} = newValue or this.sync${PropName}(newValue) to pass new data to the parent component.

GitHub: fjc0k/vue-better-sync

3. Use v-bind.sync modifier

in In some cases, we may need to perform "two-way binding" on a certain prop (except for the previous case of using v-model to bind prop). For this we recommend using the update:myPropName throwing event. For example, for the ChildComponent with the title prop in the previous example, we can communicate the intention to assign a new value to the parent in the following way:

this.$emit(&#39;update:title&#39;, newValue)
Copy after login

If necessary, the parent can listen to the event and Update local data properties. For example:

<ChildComponent :title="pageTitle" @update:title="pageTitle = $event" />
Copy after login

For convenience, we can use the .sync modifier to abbreviate it as follows:

<ChildComponent :title.sync="pageTitle" />
Copy after login

vue3 Remove .sync

[Related recommendations: vuejs video tutorial, web front-end development]

The above is the detailed content of What are the methods for implementing two-way binding in Vue?. For more information, please follow other related articles on the PHP Chinese website!

Related labels:
source:php.cn
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template