vue.js --父子组件通信

2023-10-26

父子组件通信

父子组件通信:子组件使用父组件数据(属性和方法)。vue是单项数据流,因此在通常情况下都是父组件传递数据给子组件使用,子组件触发父组件的事件,并传递给父组件所需要的参数。

父组件向子组件通信

子组件通过props接收

父组件调用子组件并通过自定义属性传入数据,子组件通过props接收父组件传递的数据,进行验证使用。
代码演示:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>vue父子组件通信</title>
    <!-- 使用CDN引入Vue -->
    <script src="https://unpkg.com/vue@next"></script>
</head>
<body>
    <div id="root"></div>
    <script>
        const app = Vue.createApp({
            data(){
                return {
                    num: 0
                }
            },
            //父组件通过自定义属性 count 传参
            template:`<demo :count="num"/>`
        })
        app.component('demo', {
        	//子组件通过 props 接收父组件传递的参数
            props:['count'],
            //子组件在模板中使用父组件传递过来的参数
            template:`<div>{{count}}</div>`
        })
        const vm = app.mount('#root');
    </script>
</body>
</html>

页面效果:
在这里插入图片描述

子组件向父组件通信

$emit自定义事件

子组件通过$emit自定义事件,向父组件进行传值;

父组件使用子组件自定义事件,通过事件方法接收子组件的传值;

代码演示:

	    <script>
        const app = Vue.createApp({
            data(){
                return {
                    num: 0
                }
            },
            methods: {
                handleAddOne( param ){
                    this.num = param;
                }
            },
            //父组件使用子组件自定义事件
            template:`<demo :count="num" @add-one="handleAddOne"/>`
        })
        app.component('demo', {
            props:['count'],
            methods: {
                handleClick(){
                	//子组件通过$emit自定义事件,向父组件传值
                    this.$emit('addOne', this.count + 5);
                }

            },
            template:`<div @click="handleClick">{{count}}</div>`
        })
        const vm = app.mount('#root');
    </script>

页面效果:

初始状态
在这里插入图片描述
点击一次
在这里插入图片描述
点击两次
在这里插入图片描述

点击触发事件,页面效果符合预期。

v-model改造$emit传递父组件数据

$emit传递单个父组件数据

代码演示:

<script>
        const app = Vue.createApp({
            data(){
                return {
                    num: 0
                }
            },
            methods: {
                handleAddOne( param ){
                    this.num += param;
                }
            },
            template:`<demo v-model="num"/>`
        })
        app.component('demo', {
            props:['modelValue'],   // props 接受参数必须是 modelValue
            methods: {
                handleClick(){
                    this.$emit('update:modelValue', this.modelValue + 5);
                     // update:modelValue 也是固定写法
                }

            },
            template:`<div @click="handleClick">{{modelValue}}</div>`
        })
        const vm = app.mount('#root');
    </script>

props 参数可以换成其他参数名(如:app),但要在子组件上修改为 v-model:其他参数名(如:v-model:app)。

	<script>
        const app = Vue.createApp({
            data(){
                return {
                    num: 0
                }
            },
            methods: {
                handleAddOne( param ){
                    this.num += param;
                }
            },
            template:`<demo v-model:app="num"/>`
        })
        app.component('demo', {
            props:['app'],  
            methods: {
                handleClick(){
                    this.$emit('update:app',this.app + 5); 
                }

            },
            template:`<div @click="handleClick">{{app}}</div>`
        })
        const vm = app.mount('#root');
    </script>

$emit传递多个父组件数据

代码演示:

<script>
        const app = Vue.createApp({
            data(){
                return {
                    num: 0,
                    num1: 0
                }
            },
            methods: {
                handleAddOne( param ){
                    this.num += param;
                }
            },
            template:`<demo v-model:app="num" v-model:app1="num1"/>`
        })
        app.component('demo', {
            props:['app',"app1"],  
            methods: {
                handleClick(){
                    this.$emit('update:app',this.app + 5); 
                },
                handleClick1(){
                    this.$emit('update:app1',this.app1 + 5); 
                }

            },
            template:`
            <div @click="handleClick">{{app}}</div>
            <div @click="handleClick1">{{app1}}</div>
            `
        })
        const vm = app.mount('#root');
    </script>

总结

父子组件通信vue是单项数据流,父组件传递数据给子组件使用,子组件触发父组件事件对数据进行处理

父组件向子组件通信:使用props传递数据

子组件向父组件通信:使用$emit触发父组件的事件

(完)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

vue.js --父子组件通信 的相关文章

随机推荐

  • 在proteus中继电器的驱动与使用

    在进行proteus仿真驱动继电器时候 因为第一次接触和学习继电器遇到了无论采用电源驱动还是三极管放大驱动都无法驱动的问题 所以就查了继电器的资料和proteus中的默认设置 发现原来是proteus中继电器默认驱动电压为12V 所以我们需
  • CF 709C

    感谢这个题让我进了前1000 思路 特殊条件切入 一开始想跑网络流 但边数 点数太多 所以就需要找此题和常规网络流的区别 看到 M 2 gt 尽可能使用M 2这个条件构造解 gt 少于M 2的全选 gt 剩下的全是大于M 2的 gt 如果每
  • linux-docker

    unix liunx windows linux 文件系统 所有的资源都是目录在 root 根目录下 一 指令 ip addr ifconfig cd ls vim sudo 管理员身份 代表换行输入 pwd 查看所在目录 sudo sys
  • 12306模拟登陆一直提示系统繁忙_12306买高铁火车票显示待核验怎么办,最新解决方案...

    知道有些人没耐心 先说解决核心是12306里面人脸识别 亲测有效 全文没几个字一定要看不用去车站走冤枉路啊 身份信息不能自动核验 相信吃过亏的不止我一个 网上找了很多方法不行 问客服也没用 终于自己找到一个方法 相继解决了我妈和我朋友的待核
  • Maven项目中properties文件的加载方式

    Maven项目中 读取properties配置文件 1 properties文件在src main java的根目录中时加载文件使用 PropertyConfigurator configure log4j properties 2 pro
  • FFmpeg进阶: 音频滤镜大全

    在做音频处理模块的时候 为了对声音进行优化处理 我很多时候会使用各种算法对音频进行变换 效果包括变音变调 声音降噪等等 其实FFmpeg库里的滤镜模块包含了很多有用的音频滤镜算法 这对于提升开发效率避免重复造轮子是很有帮助的 这里翻译了一下
  • Android apk 项目一键打包并上传到蒲公英

    项目一键打包并上传到蒲公英 缘由 测试流程由 打包 找包准备上传 填写更新信息 然后上传 过于复杂 所以想要简化开发 阅读须知 需要读者了解如何在项目里面建立一个空的gradle plugin的过程 否则这篇文章不适合你 开始分析 我想要的
  • jdbc控制自动提交功能

    import java sql Connection import java sql DriverManager import java sql ResultSet import java sql SQLException import j
  • opencv-python入门学习(1)

    opencv python入门 环境安装与配置 图像入门 图片的读取 显示和保存 cv imread 读取图像 cv imshow 显示图像 cv imwrite 储存图像 视频的读取 显示和保存 从摄像机 文件中读取并显示视频 保存编辑后
  • npm安装composer-rest-server等出现错误node-pre-gyp install --fallback-to-build --library

    npm安装composer rest server等出现错误node pre gyp install fallback to build library grpc 1 10 1 install usr local lib node modu
  • 20大中国式弱点营销

    什么是弱点营销 宇宙的精灵 万物的灵长 说的是人类 但现实中 人性的弱点也不少 贪婪 恐惧 嫉妒 懒惰 好色 贪慕虚荣 难抵诱惑 害怕孤独 热爱免费 重视等级 迷信专家 崇拜名人 喜随波逐流 关于人性的一切弱点 正在被消费社会利用和营销 一
  • vector中find 的用法

    vector没有自带的find函数 需要用普通的find函数 使用如下 vector
  • CH2-Java编程基础(7个案例实现)

    案例2 1 库房出入货物程序设计 案例介绍 任务描述 现要对华为和小米两种手机产品进行入库 本案例要求编写一个模拟商品入库的程序 可以在控制台输入入库商品的数量 最后打印出仓库中所有商品详细信息以及所有商品的总库存数和库存商品总金额 商品信
  • 斗地主发牌算法JAVA

    首先定义一个卡牌类 public class Card private String numb private String color private int index public Card public Card String nu
  • 【vue】使用了 keep-alive 的 include,但是切换 router-view,页面还是会刷新

  • 二分图最大匹配与最大独立集

    一 概念部分 1 什么是二分图 通俗的说法 就是可以把图分成两部分 每一部分任意两点之间没有关系 同一部落 两部分之间点可能存在多种关系 2 怎么判断二分图 1 理论判定 如果某个图为二分图 那么它至少有两个顶点 且其所有回路的长度均为偶数
  • Ansible-基本概述

    为什么要自动化运维 纯手动软件安装部署方式 我们以 10 台机器部署 Nginx 为例 部署步骤如下 1 通过 ssh 登录一台机器 2 yum install y nginx 或者 获取安装包自行编译安装 3 配置 Nginx 4 启动
  • 微信小程序知识点GET

    1 app json中的pages用来设置小程序包含哪些页面以及页面的路径 window用来设置默认页面的窗口表现形式 tabBar用来设置小程序底部tab的表现 2 app js中的App 函数用来注册一个小程序 接受的对象参数用来指定小
  • mstsc远程报:这可能是由于CredSSP 加密Oracle修正的两种完美解决方法

    win10很完美 用的也很舒服 当然人无完人 也总有不尽如人意的时候 比如说我们经常用的远程mstsc 就出现了一个坑 既然出现坑了 我们就得把坑解决掉吧 下面就记录一下这个坑的解决方法 本文地址 https www cnblogs com
  • vue.js --父子组件通信

    目录 父子组件通信 父组件向子组件通信 子组件通过props接收 子组件向父组件通信 emit自定义事件 v model改造 emit传递父组件数据 emit传递单个父组件数据 emit传递多个父组件数据 总结 父子组件通信 父子组件通信