首页 > 其他分享 >vue3探索——组件通信之v-model父子组件数据同步

vue3探索——组件通信之v-model父子组件数据同步

时间:2023-08-27 13:12:30浏览次数:47  
标签:自定义 update 事件 vue3 组件 model 数据 pmoney

背景

再很多场景中,我们可能想在子组件中修改父组件的数据,但事实上,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数据绑定,子组件数据也会更新到最新的值。

标签:自定义,update,事件,vue3,组件,model,数据,pmoney
From: https://www.cnblogs.com/cry0-0/p/17660166.html

相关文章

  • Django学习小记[2] —— Model
    开始学习django的model了,学习django的目的很简单,就是我想用django搭建一个自己的博客,现在开源的已经有django-zinnia这个博客引擎了,但是想要看懂它,并且修改它,就必须过django这一关。之前对django的了解,仅仅限于用到了什么,就知道什么,缺乏系统的学习,所以要把django的文档都过一遍,做......
  • entry组件
    ```python#获取Entry组件的值defget_entry_text(entry):  returnentry.get() #设置Entry组件的值defset_entry_text(entry,text):  entry.delete(0,tk.END)  entry.insert(0,text) #在Entry组件中插入文本definsert_text(entry,index,text):......
  • canvas组件
    以下是使用Python的Tkinter库中的Canvas组件的一些常用方法的示例代码: ```pythonimporttkinterastk defcreate_canvas(root):  canvas=tk.Canvas(root)  returncanvas #在Canvas组件上绘制图形defdraw_shape(canvas,shape,**kwargs):  canva......
  • Checkbutton组件
    以下是tkinter中Checkbutton的所有方法及其详细参数的示例代码: ```pythonimporttkinterastk root=tk.Tk() #创建Checkbutton对象check_var=tk.IntVar()check_button=tk.Checkbutton(root,text='选项',variable=check_var) #设置Checkbutton的状态che......
  • pyqt6组件
    PyQt6是Python的一套GUI工具包,它提供了许多常用的组件,以下是所有组件及其用途: 1.QApplication:创建GUI应用程序。2.QWidget:所有用户界面对象的基类。3.QMainWindow:主窗口,用于放置其他窗口部件。4.QDialog:模态对话框,用于获取用户输入。5.QLabel:显示文本或图像。6.QLin......
  • pyqt的组件
    PyQt是一个用于创建桌面应用程序的Python库,它提供了许多常用的组件,以下是一些常见的组件及其用途: 1.QApplication:创建GUI应用程序的主要类。2.QWidget:所有用户界面对象的基类。3.QLabel:用于显示文本或图像的小部件。4.QLineEdit:用于输入单行文本的小部件。5.QPushButt......
  • js_中文输入法情况下, 输入框v-model绑定值中没有输入值但却触发input事件的问题
    中文输入法情况下,输入框v-model绑定值中没有输入值但却触发input事件的问题今天写的一个搜索框,要求输入字符时不作处理,直到用户点击搜索按钮时才执行搜索逻辑;当用户将搜索框文本删除至空字符串时,执行一次无搜索值的搜索逻辑,用于将表格数据恢复至无筛选;在这个功能......
  • 【MySQL 8.0】密码复杂度验证组件与连接控制插件
    (root@node01)>installcomponent'file://component_validate_password';QueryOK,0rowsaffected(0.08sec)(root@node01)>select*frommysql.component;+--------------+--------------------+------------------------------------+|compo......
  • Vue3.3 + TS4 ,自主打造媲美 ElementPlus的组件库(16章)
    点击下载:Vue3.3+TS4,自主打造媲美ElementPlus的组件库(16章)提取码:n899 Vue3.3+TS4,自主打造媲美ElementPlus的组件库课程,又名:进阶必学,2023最新,打造媲美ElementPlus的组件库随着Web应用程序的复杂性不断增加,为了提高开发效率和维护性,我们往往需要构建可复用的组件库。Vue作为......
  • vue3中组件,api的自动导入
    vue3中ref,reactive等api和自定义组件等每个页面都要引入很麻烦,偷懒是人的天性,故引入自动导入插件,以此记录:1.vue3的api自动导入使用前:<scriptsetuplang="ts">import{ref,onMounted}from'vue'constimgUrl=ref("")constcanvas=ref()onMounted(()=>......