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 ...
随机推荐
- 【Azure 应用服务】PHP项目部署到App Service for Linux环境中,如何修改上传文件大小的限制呢?
问题描述 PHP项目部署到App Service for Linux环境中,如何修改上传文件大小的限制呢? 问题解答 经过查询Azure App Service官方文档,可能通过在项目根目录下添加.h ...
- 【Azure 应用服务】Azure App Service能否使用Storage Account File Share
问题描述 Azure App Service能否使用Storage Account File Share? 问题回答 如果部署的App Service为Linux环境,可以直接使用Mount stor ...
- C语言初学习——易错点合集(长篇)
转义字符 例题一 int main() { char s[] = "012xy\08s34f4w2"; int i, n = 0; for (i = 0; s[i] != 0; i ...
- Python笔记六之多进程
本文首发于公众号:Hunter后端 原文链接:Python笔记六之多进程 在 Python 里,我们使用 multiprocessing 这个模块来进行多进程的操作. multiprocessing ...
- CodeIgniter3.chm 打包编译 需要 hhc.exe - php框架
电子书地址 https://github.com/CodeIgniter-Chinese/rapid-php-application-development 我打包编译好了chm,https://fi ...
- 手把手的使用Toolkit插件在诗情画意中完成AI诗朗诵
本文分享自华为云社区<[云驻共创]手把手的使用Toolkit插件在诗情画意中完成AI诗朗诵>,作者: 红目香薰. 云原生时代,开发者们的编程方式.编程习惯都发生了天翻地覆的变化,大家逐渐地 ...
- 投屏Sink端音频底层解码并用OpenSLES进行播放
一.代码分析 在公司项目中,音频解码及播放是把数据传到Java层进行解码播放的,其实这个步骤没有必要,完全可以在底层进行处理. 通过代码发现其实也做了在底层进行解码,那么为啥不直接使用底层解码播放呢, ...
- JAVA 相关
1. google guava cache 2. presto 3. loadingcache 4. aspect
- 记录--Vue自定义指令实现加载中效果v-load(不使用Vue.extend)
这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 网站效果演示:ashuai.work:8888/#/myLoad GitHub仓库地址代码:github.com/shuirongshu- ...
- 记录--vue打印插件
这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 网页实现打印 可以选择性的打印某一部分 的vue组件 1.引入 把print.js 下载到本地,然后放在src 下面添加文件夹里. pri ...