vue3探索——组件通信之v-model父子组件数据同步
背景
再很多场景中,我们可能想在子组件中修改父组件的数据,但事实上,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父子组件数据同步的更多相关文章
- vue第八单元(组件通信 子父,父子组件通信 自定义事件 事件修饰符 v-model props验证 )
第八单元(组件通信 子父,父子组件通信 自定义事件 事件修饰符 v-model props验证 ) #课程目标 掌握使用props让父组件给子组件传参(重点) 掌握props属性的使用以及prop验证 ...
- 第四节:Vue表单标签和组件的基本用法,父子组件间的通信
vue表单标签和组件的基本用法,父子组件间的通信,直接看例子吧. <!DOCTYPE html> <html> <head> <meta charset=&q ...
- vue组件定义方式,vue父子组件间的传值
vue组件定义方式,vue父子组件间的传值 <!DOCTYPE html> <html lang="zh-cn"> <head> <met ...
- vue 自定义组件 v-model双向绑定、 父子组件同步通信
父子组件通信,都是单项的,很多时候需要双向通信.方法如下: 1.父组件使用:msg.sync="aa" 子组件使用$emit('update:msg', 'msg改变后的值xxx ...
- vue 自定义组件 v-model双向绑定、 父子组件同步通信【转】
父子组件通信,都是单项的,很多时候需要双向通信.方法如下: 1.父组件使用:msg.sync="aa" 子组件使用$emit('update:msg', 'msg改变后的值xxx ...
- 【VUE】7.组件通信(二)子组件修改父组件
1. 前提&知识点 1./components/Father.vue 是父组件, Son.vue 是子组件 2.子组件修改父组件 emit 2. 组件通信 1. 首先对子组件绑定一个事件 ch ...
- 【VUE】6.组件通信(一)父组件向子组件传值
1. 前提&知识点 1./components/Father.vue 是父组件, Son.vue 是子组件 2.父组件像子组件通信 props 2.组件通信 1. 新增一个路由入口 /fath ...
- vue组件命名和传值 and 父子组件传值
https://www.cnblogs.com/lianxisheng/p/10907350.html
- angular组件共用服务打印日志父子组件传值2创建服务注入
- vue父子组件通信高级用法
vue项目的一大亮点就是组件化.使用组件可以极大地提高项目中代码的复用率,减少代码量.但是使用组件最大的难点就是父子组件之间的通信. 子通信父 父组件 <template> <div ...
随机推荐
- 批量删除mysql库中数据
-- 查询构建批量删除表语句(根据数据库名称) select concat('delete from ', TABLE_NAME, ' where org_id = "<条件id> ...
- js收藏网页功能,纠正网上乱转没求证的案例
网站一般流行以下收藏代码 function AddFavorite(title, url){ try{ //ie收藏 window.external.addFavorite(url, title); ...
- 基于python中librosa的声音混音实例解析
一 概念 1.一些概念 Librosa是一个用于音频.音乐分析.处理的python工具包,一些常见的时频处理.特征提取.绘制声音图形等功能应有尽有,功能十分强大.本文主要介绍libros的基本用法 ...
- pyecharts + Django你不知道这个架构有多美
pyecharts + Django你不知道这个架构有多美 何为echarts? pyecharts 是一个用于生成 Echarts 图表的类库.Echarts 是百度开源的一个数据可视化 JS ...
- electron程序运行在某些 windows 上白屏
现象: 打包后的 electron 程序 运行在某些 windows 上白屏 项目情况: vue3.0 项目使用 vue-cli 创建 使用 vue add electron-builder 添加打 ...
- Client请求外部接口标准处理方式
简单记录下client外部请求代码的我认为比较标准的书写格式 public List<GdtDailyBalanceReportAO> getGdtDailyReportList2(Lon ...
- 使用JdbcTemplate
1.使用JdbcTemplate的execute()方法执行SQL语句 Java代码 收藏代码 jdbcTemplate.execute("CREATE TABLE USER (user_ ...
- 关于easyExcel导出文字合并居中和服务器导出失败踩了一天的坑
参考:https://blog.csdn.net/hanyi_/article/details/118117484,https://blog.csdn.net/sunyuhua_keyboard/ar ...
- 【Atcoder F - Cumulative Cumulative Cumulative Sum】线段树
要特别注意下精度,long,int范围.WA了几次 import java.util.Scanner; class Main { // static long[] A2 ;//i^2*AI // st ...
- 谷歌Linux 运维工程师面试真题
谷歌Linux 运维工程师面试真题 下面是谷歌 Linux 运维工程师面试真题: 1.如何查看当前的 Linux 服务器的运行级别? 答: 'who -r' 和 'runlevel' 命令可以用来查看 ...