Vue2子组件绑定 v-model,实现父子组件通信方式

作者:潮汐未见潮落 时间:2024-05-02 17:04:13 

前言

v-model 可以在组件上使用以实现双向绑定。

首先让我们回忆一下 v-model 在原生元素上的用法:

<input v-model="firstName" />

在代码背后,模板编译器会对 v-model 进行更冗长的等价展开。因此上面的代码其实等价于下面这段:

<input
 :value="firstName"
 @input="firstName = $event.target.value"
/>

默认用法

父组件

<template>
 <div>
   <h1>{{ first }}-{{ last }}</h1>
   <UserName
     :firstName="first"
     :lastName="last"
     @update:firstName="func1"
     @update:lastName="func2"
   />
 </div>
</template>

<script>
import UserName from "./UserName.vue";
export default {
 name: "V-Model",
 components: {
   UserName,
 },
 data() {
   return {
     first: "000",
     last: "123",
   };
 },
 methods: {
   // 默认用法
   func1(val) {
     this.first = val;
   },
   func2(val) {
     this.last = val;
   },
 },
};
</script>

子组件

<template>
 <div>
   <input v-model="first" type="text" @input="input1" />
   <input v-model="last" type="text" @input="input2" />
 </div>
</template>

<script>
export default {
 name: "UserName",
 props: ["firstName", "lastName"],

data() {
   return {
     first: this.firstName,
     last: this.lastName,
   };
 },
 methods: {
   input1() {
     this.$emit("update:firstName", this.first);
   },
   input2() {
     this.$emit("update:lastName", this.last);
   },
 },
};
</script>

以上就可以实现 父子组件的双向绑定

Vue2子组件绑定 v-model,实现父子组件通信方式

.sync写法

传参的时候加上 .sync 会简化上面的写法,父组件不需要定义更新触发函数(update)

<UserName :firstName.sync="first" />

会被扩展为:

<UserName :firstName="first" @update:firstName="val => first = val"></UserName>

当子组件需要更新 firstName 的值时,它需要显式地触发一个更新事件:

this.$emit('update:firstName', newValue)

父组件

<template>
 <div>
   <h1>{{ first }}-{{ last }}</h1>
   <UserName :firstName.sync="first" :lastName.sync="last" />
 </div>
</template>

<script>
import UserName from "./UserName.vue";
export default {
 name: "V-Model",
 components: {
   UserName,
 },

data() {
   return {
     first: "000",
     last: "123",
   };
 },
 methods: {

},
};
</script>

子组件

<template>
 <div>
   <input type="text" :value="firstName" @input="$emit('update:firstName', $event.target.value)" />
   <input type="text" :value="lastName" @input="$emit('update:lastName', $event.target.value)" />
 </div>
</template>

<script>
export default {
 name: "UserName",
 components: {},
 props: ["firstName", "lastName"],
 data() {
   return {};
 },
 methods: {},
};
</script>

以上也可以实现 父子组件的双向绑定

Vue2子组件绑定 v-model,实现父子组件通信方式

绑定单个 v-model

当使用在一个组件上时,v-model 会被展开为如下的形式:

<UserName v-model="first"  />
<!-- 上面等同于下面的写法 -->
<UserName
 :modelValue="first"
 @input="first= $event.target.value"
/>

父组件

<template>
 <div>
   <h1>{{ first }}-{{ last }}</h1>
   <UserName v-model="first"  />
 </div>
</template>

<script>
import UserName from "./UserName.vue";
export default {
 name: "V-Model",
 components: {
   UserName,
 },

data() {
   return {
     first: "000",
     last: "123",
   };
 },
 methods: {

},
};
</script>

子组件

<template>
 <div>
   <input
     type="text"
     :value="firstName"
     @input="$emit('update', $event.target.value)"
   />
 </div>
</template>

<script>
export default {
 name: "UserName",
 components: {},
 props: ["firstName"],
 model: {
   prop: "firstName",
   event: "update",
 },

data() {
   return {};
 },
};
</script>

现在可以实现单个 输入框绑定

Vue2子组件绑定 v-model,实现父子组件通信方式

来源:https://blog.csdn.net/qq_52855464/article/details/129762831

标签:Vue2,子组件,v-model,父子组件,通信
0
投稿

猜你喜欢

  • 从 msxml6.dll 中获取 DOMDocument 对象的方法与属性

    2009-02-22 18:46:00
  • 一行代码给你的WordPress Blog添加下雪效果

    2008-12-14 09:43:00
  • Python绘图Matplotlib之坐标轴及刻度总结

    2023-10-01 15:56:39
  • python函数map()和partial()的知识点总结

    2023-10-04 14:58:11
  • python光学仿真面向对象光学元件类的实现

    2022-10-11 19:45:06
  • 基于Python爬取股票数据过程详解

    2021-02-27 08:42:18
  • asp.net中上传图片文件实现防伪图片水印并写入数据库

    2024-01-17 01:36:49
  • Python drop方法删除列之inplace参数实例

    2023-07-23 23:26:49
  • python try except 捕获所有异常的实例

    2023-03-22 18:49:50
  • PHP的PDO连接讲解

    2023-06-12 20:40:33
  • JetBrains(IEDA、CLion、Pycharm) 学生获得免费使用资格

    2022-02-21 09:25:35
  • python中Matplotlib绘制直线的实例代码

    2022-09-24 18:27:52
  • python实现图片批量压缩程序

    2021-11-27 03:50:11
  • pandas DataFrame索引行列的实现

    2023-12-16 09:52:55
  • Sql注入原理简介_动力节点Java学院整理

    2024-01-27 23:51:27
  • oracle 常用的几个SQL

    2009-12-01 12:36:00
  • python+flask编写一个简单的登录接口

    2021-06-09 21:19:02
  • Python发送邮件的实例代码讲解

    2021-06-05 02:35:10
  • pandas的qcut()方法详解

    2022-07-23 03:36:21
  • 有关perl正则表达式的一些杂项

    2023-08-08 01:12:11
  • asp之家 网络编程 m.aspxhome.com