背景

再很多场景中,我们可能想在子组件中修改父组件的数据,但事实上,vue不推荐我们这么做,因为数据的修改不容易溯源。

Vue2写法

在vue2中,我们使用.sync修饰符+自定义事件'update:xxx',来使父子组件数据同步。

// 父组件
<template>
<div>
<h2>我是父组件,我有{{ money }}¥</h2>
<hr>
<!-- 这里使用.sync修饰符,使**子组件pmoney**与**父组件money**同步 -->
<Son :pmoney.sync="money" />
</div>
</template> <script>
import Son from "./son.vue";
export default {
components: {
Son,
},
data() {
return {
money: 1000 // 父组件数据
};
},
};
</script>
// 子组件
<template>
<div>
<h2>我是子组件,我爹有{{ pmoney }}¥</h2>
<!-- 触发**update:pmoney**这个自定义事件,事件参数就是要更改的值 -->
<button @click="$emit('update:pmoney', pmoney - 100)">用了100¥</button>
</div>
</template> <script>
export default {
props: {
// 定义父组件传进来的数据
pmoney: {
type: Number,
default: 0
},
},
};
</script>

这里不作过多说明,有需要请自行了解。

Vue3写法

vue3的写法与vue2基本一致。最大的区别就是,使用v-model代替.sync修饰符

// 父组件
<template>
<div>
<!-- 父组件的数据 -->
<h2>我是父组件,我有{{ money }}¥</h2>
<hr>
<!-- 使用子组件 -->
<!-- 这里v-model的作用相当于vue2的.sync修饰符 -->
<Son v-model:pmoney="money" />
<!-- 也可以绑定多组数据 -->
<!-- <Son v-model:pmoney1="money" v-model:pmoney2="money" /> -->
</div>
</template> <script setup lang="ts">
import { ref } from 'vue'; // 引入子组件
import Son from './son.vue'; // 父组件的数据
const money = ref(1000);
</script>
// 子组件
<template>
<div>
<!-- 使用props中的数据 -->
<h3>我是子组件,我爹有{{ pmoney }}¥</h3>
<!-- 这里通过自定义事件,向父组件传递变更后的值,由父组件监听事件并修改数据 -->
<button @click="emit('update:pmoney', pmoney - 100)">我使用了100¥</button>
</div>
</template> <script setup lang="ts">
// 定义props,接收父组件的数据
defineProps(['pmoney']); // 定义emits,用于触发父组件的事件
const emit = defineEmits(['update:pmoney']);
</script>

原理剖析

下面的v-model:pmoney实际是v-bind:pmoney 属性绑定和@update:pmoney 事件绑定的语法糖。

这里事件绑定的@update:是固定的,这就是子组件的自定义事件要加update: 前缀的原因

<Son v-model:pmoney="money" />

相当于

<Son :pmoney="money" @update:pmoney="money = $event" />
  • $event:子组件通过自定义事件传给父组件的值。

父子组件数据同步的本质

本质是子组件通过自定义事件向父组件传参数,子组件触发自定义事件并传值,父组件监听自定义事件并取值,同时修改原本的数据,因为v-bind数据绑定,子组件数据也会更新到最新的值。

vue3探索——组件通信之v-model父子组件数据同步的更多相关文章

  1. vue第八单元(组件通信 子父,父子组件通信 自定义事件 事件修饰符 v-model props验证 )

    第八单元(组件通信 子父,父子组件通信 自定义事件 事件修饰符 v-model props验证 ) #课程目标 掌握使用props让父组件给子组件传参(重点) 掌握props属性的使用以及prop验证 ...

  2. 第四节:Vue表单标签和组件的基本用法,父子组件间的通信

    vue表单标签和组件的基本用法,父子组件间的通信,直接看例子吧. <!DOCTYPE html> <html> <head> <meta charset=&q ...

  3. vue组件定义方式,vue父子组件间的传值

    vue组件定义方式,vue父子组件间的传值 <!DOCTYPE html> <html lang="zh-cn"> <head> <met ...

  4. vue 自定义组件 v-model双向绑定、 父子组件同步通信

    父子组件通信,都是单项的,很多时候需要双向通信.方法如下: 1.父组件使用:msg.sync="aa"  子组件使用$emit('update:msg', 'msg改变后的值xxx ...

  5. vue 自定义组件 v-model双向绑定、 父子组件同步通信【转】

    父子组件通信,都是单项的,很多时候需要双向通信.方法如下: 1.父组件使用:msg.sync="aa"  子组件使用$emit('update:msg', 'msg改变后的值xxx ...

  6. 【VUE】7.组件通信(二)子组件修改父组件

    1. 前提&知识点 1./components/Father.vue 是父组件, Son.vue 是子组件 2.子组件修改父组件 emit 2. 组件通信 1. 首先对子组件绑定一个事件 ch ...

  7. 【VUE】6.组件通信(一)父组件向子组件传值

    1. 前提&知识点 1./components/Father.vue 是父组件, Son.vue 是子组件 2.父组件像子组件通信 props 2.组件通信 1. 新增一个路由入口 /fath ...

  8. vue组件命名和传值 and 父子组件传值

    https://www.cnblogs.com/lianxisheng/p/10907350.html

  9. angular组件共用服务打印日志父子组件传值2创建服务注入

  10. vue父子组件通信高级用法

    vue项目的一大亮点就是组件化.使用组件可以极大地提高项目中代码的复用率,减少代码量.但是使用组件最大的难点就是父子组件之间的通信. 子通信父 父组件 <template> <div ...

随机推荐

  1. SpringBoot2.x 启动过程详解

    spring 简化了java应用开发, 而springboot则简化了 spring应用的开发,用约定优于配置优于编码的方式快速构建spring对其他框架的整合. 官方文档 探究Hello,World ...

  2. C++ //count_if //按条件统计元素个数 //自定义和 内置

    1 //按条件统计元素个数 2 //count_if 3 4 #include <iostream> 5 #include<string> 6 #include<vect ...

  3. 使用内网nginx代理rancher

    需求: rancher 部署在 192.168.188.167服务器上 控制台访问地址 https://192.168.188.167:8443 在本地只有192.168.80.111有权限访问, 需 ...

  4. Alertmanager钉钉告警

    一.部署alertmanager 1.1 创建目录 mkdir -p /deploy/app/alertmanager/config chmod -R 777 /deploy/app/alertman ...

  5. RabbitMQ 快速复习

    目录 RabbitMQ学习笔记 1.消息队列概述 1.1 为什么学习消息队列 1.2 什么是消息中间件 1.3 消息队列应用场景 1.3.1 异步处理 1.3.2 解耦服务 1.3.3 流量削峰 1. ...

  6. centos python3虚拟环境

    为什么需要虚拟环境? 在使用 Python 语言时,通过 pip(pip3)来安装第三方包,但是由于 pip 的特性,系统中只能安装每个包的一个版本.但是在实际项目开发中,不同项目可能需要第三方包的不 ...

  7. [VueJsDev] 日志 - 更新日志

    [VueJsDev] 目录列表 https://www.cnblogs.com/pengchenggang/p/17037320.html 更新日志 ::: details 目录 目录 更新日志 Lo ...

  8. Centos安装常见软件

    一.vscode sudo rpm --import https://packages.microsoft.com/keys/microsoft.asc sudo sh -c 'echo -e &qu ...

  9. 回声消除AEC(Acoustic Echo Cancellation)概括介绍及基本原理分析

    回声消除的基本概念   回音消除(Acoustic Echo Cancelling)是透过音波干扰方式消除麦克风与喇叭因空气产生回受路径(feedback path)而产生的杂音.通俗一点来说,回声消 ...

  10. day22--Java集合05

    Java集合05 11.HashSet课堂练习 11.1课堂练习1 定义一个Employee类,该类包括:private成员属性name,age 要求: 创建3个Employee对象放入HashSet ...