vue组件的通信

news2024/12/24 9:06:21

文章目录

  • 组件通信
    • 父传子
      • 父传子:通过prop来进行通信
    • 子传父
      • 先在父组件用@注册方法 , 在子组件触发使用 emit 函数
    • 组件间通信-平行组件
      • 使用事件总线的方法,也就是把整个vue提出来,当为一个事件总线
    • 其他组件通信
      • 父组件 provide来提供变量,然后再子组件中通过inject来注入变量

组件通信

父传子

父传子:通过prop来进行通信

        // 1.在子组件中声明props接收在父组件挂载的属性
        // 2.可以在子组件的template中任意使用
        // 3.在父组件绑定自定义的属性
        
  
<body>
    <div id="app">
        <!-- 3.使用子组件 -->
        <App></App>

    </div>
    <script src="./vue.js"></script>
    <script>
        // 全局组件

        // 父传子:通过prop来进行通信

        // 1.在子组件中声明props接收在父组件挂载的属性
        // 2.可以在子组件的template中任意使用
        // 3.在父组件绑定自定义的属性
        Vue.component('Child',{
            template:`
                <div>
                    <h3>我是一个子组件</h3>   
                    <h4>{{childData}}</h4>
                </div>
            `,
            props:['childData']
        })

        const App = {
            data() {
                return {
                    msg: '我是父组件传进来的值'
                }
            },
            template: `
                <div>
                    <Child :childData = 'msg'></Child>
                </div>
            `,
            computed: {

            }
        }
        new Vue({
            el: '#app',
            data: {

            },
            components: {
                // 2.挂载子组件
                App
            }

        })
    </script>
</body>

效果

在这里插入图片描述

子传父

先在父组件用@注册方法 , 在子组件触发使用 emit 函数

<body>
    <div id="app">
        <!-- 3.使用子组件 -->
        <App></App>

    </div>
    <script src="./vue.js"></script>
    <script>
        // 全局组件

        // 子往父传值

        // 1. 在父组件中 子组件上绑定自定义事件
        // 2. 在子组件中 触发原生的事件 
        // 3. 在事件函数通过this.$emit触发自定义的事件
        Vue.component('Child', {
            template: `
                <div>
                    <h3>我是一个子组件</h3>   
                    <h4>{{childData}}</h4>
                    <input type="text" @input = 'handleInput'/>
                </div>
            `,
            props: ['childData'],
            methods:{
                handleInput(e){
                    const val = e.target.value;

                    this.$emit('inputHandler',val);
                }
            },
        })

        const App = {
            data() {
                return {
                    msg: '我是父组件传进来的值',
                    newVal:''
                }
            },
            methods:{
                input(newVal){
                    // console.log(newVal);
                    this.newVal = newVal;
                }
            },
            template: `
                <div>
                    <div class='father'>
                        数据:{{newVal}}
                    </div>
                    <Child :childData = 'msg' @inputHandler = 'input'></Child>
                </div>
            `,
            computed: {

            }
        }
        new Vue({
            el: '#app',
            data: {

            },
            components: {
                // 2.挂载子组件
                App
            }

        })
    </script>
</body>

效果 输入框输入数据 顶部数据同步变化

在这里插入图片描述

组件间通信-平行组件

使用事件总线的方法,也就是把整个vue提出来,当为一个事件总线

               const bus = new Vue();
               // 1. 中央事件总线 bus
              
               // 2. $on 绑定事件
               bus.$on('add',(n)=>{
                   this.count+=n;
               })
               
               // 3.触发绑定的函数 // $emit 触发事件
                  bus.$emit('add',1);

具体代码

<body>
    <div id="app">
        <!-- 3.使用子组件 -->
        <App></App>

    </div>
    <script src="./vue.js"></script>
    <script>
        const bus = new Vue();
        // 中央事件总线 bus
        Vue.component('B', {
            data() {
                return {
                    count: 0
                }
            },
            template: `
                <div>{{count}}</div>
            `,
            created(){
                // $on 绑定事件
                bus.$on('add',(n)=>{
                    this.count+=n;
                })
            }
        })

        Vue.component('A', {
            data() {
                return {
                    
                }
            },
            template: `
                <div>
                 <button @click='handleClick'>加入购物车</button> 
                    
                </div>
            `,
            methods:{
                 handleClick(){
                    // 触发绑定的函数 // $emit 触发事件
                     bus.$emit('add',1);
                 }
            }
        })


        const App = {
            data() {
                return {

                }
            },

            template: `
                <div>
                    <A></A>
                    <B></B>
                </div>
            `,
        }
        new Vue({
            el: '#app',
            data: {

            },
            components: {
                // 2.挂载子组件
                App
            }

        })
    </script>
</body>



点击加入购物车 下面数字自动加一

在这里插入图片描述

其他组件通信

如果层级很深的情况,比如有嵌套情况,可使用provide和inject

父组件 provide来提供变量,然后再子组件中通过inject来注入变量

<body>
    <div id="app">
        <!-- 3.使用子组件 -->
        <App></App>

    </div>
    <script src="./vue.js"></script>
    <script>
       
        // 插槽 留坑
        // props 验证规则
        // 组件的生命周期
        // UI库 element-ui
        // **** 如何设计组件? *****
        // provide
        // inject
        // 父组件 provide来提供变量,然后再子组件中通过inject来注入变量.无论组件嵌套多深
        // 中央事件总线 bus
        Vue.component('B', {
            data() {
                return {
                    count: 0
                }
            },
            inject:['msg'],
            created(){
                console.log(this.msg);
                
            },
            template: `
                <div>
                    {{msg}}
                </div>
            `,
        })

        Vue.component('A', {
            data() {
                return {

                }
            },
            created(){
                // console.log(this.$parent.$parent);
                // console.log(this.$children);
                console.log(this);
                
                
            },
            template: `
                <div>
                     <B></B>
                </div>
            `
        })


        const App = {
            data() {
                return {
                    title:"老爹"
                }
            },
            provide(){
                return {
                    msg:"老爹的数据"
                }
            },
            template: `
                <div>
                    <A></A>
                </div>
            `,
        }
        new Vue({
            el: '#app',
            data: {

            },
            components: {
                // 2.挂载子组件
                App
            }

        })
    </script>
</body>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1041156.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java之IO流概述

1.1 什么是IO 生活中&#xff0c;你肯定经历过这样的场景。当你编辑一个文本文件&#xff0c;忘记了ctrls &#xff0c;可能文件就白白编辑了。当你电脑上插入一个U盘&#xff0c;可以把一个视频&#xff0c;拷贝到你的电脑硬盘里。那么数据都是在哪些设备上的呢&#xff1f;键…

FlashDuty Changelog 2023-09-21 | 自定义字段和开发者中心

FlashDuty&#xff1a;一站式告警响应平台&#xff0c;前往此地址免费体验&#xff01; 自定义字段 FlashDuty 已支持接入大部分常见的告警系统&#xff0c;我们将推送内容中的大部分信息放到了 Lables 进行展示。尽管如此&#xff0c;我们用户还是会有一些扩展或定制性的需求…

【yolov5】detect.py

执行方法: 代码 # YOLOv5 &#x1f680; by Ultralytics, AGPL-3.0 license """ Run YOLOv5 detection inference on images, videos, directories, globs, YouTube, webcam, streams, etc.Usage - sources:$ python detect.py --weights yolov5s.pt --source …

面经分享 | 某康安全开发工程师

本文由掌控安全学院 - sbhglqy 投稿 一、反射型XSS跟DOM型XSS的最大区别 DOM型xss和别的xss最大的区别就是它不经过服务器&#xff0c;仅仅是通过网页本身的JavaScript进行渲染触发的。 二、Oracle数据库了解多吗 平常用的多的是MySQL数据库&#xff0c;像Oracle数据库也有…

PHP脚本导出MySQL数据库

背景&#xff1a;有时候需要同步数据库的表结构和部分数据&#xff0c;同步全表数据非常大&#xff0c;也不适合。还有一个种办法是使用数据库的dump命令执行备份&#xff0c;无法进入服务器&#xff1f;没有权限怎么办&#xff1f; 这里只要能访问服务器中的 information_sch…

前端项目练习(练习-003-webpack-01)

学习webpack前&#xff0c;首先&#xff0c;创建一个web-003项目&#xff0c;内容和web-002一样。&#xff08;注意将package.json中的name改为web-003&#xff09; 想想&#xff0c;我们开发Java 的时候&#xff0c;Maven帮我们做的主要是编译&#xff0c;打包等等内容。开发前…

org.quartz.SchedulerConfigException: DataSource name not set.

解决&#xff1a; JobStore配置 原&#xff1a; prop.put("org.quartz.jobStore.class", "org.quartz.impl.jdbcjobstore.JobStoreTX"); 改为&#xff1a; prop.put("org.quartz.jobStore.class", "org.springframework.scheduling.qu…

论文笔记:ST2Vec: Spatio-Temporal Trajectory SimilarityLearning in Road Networks

2022 KDD 1 intro 现有的轨迹相似性学习方案强调空间相似性而忽视了时空轨迹的时间维度&#xff0c;这使得它们在有时间感知的场景中效率低下 如上图&#xff0c;在拼车过程中&#xff0c;T1表示司机计划的行程&#xff0c;T2和T3是两个想要搭车的人。T1和T2在空间上更接近&am…

Mac 苹果系统使用nvm use 切换node版本号

windows在使用 nvm 管理并切换 node 时&#xff0c;通过 nvm use 切换node版本会全局切换。也就是node版本号切换后只要不手动更改就会一直保持当前版本号不变。 但博主最近换了苹果系统后&#xff0c;发现苹果系统不能全局更改node版本。我在 vscode中使用nvm use x.x.x之后&…

Django(21):使用Celery任务框架

目录 Celery介绍Celery安装Celery使用项目文件和配置启动Celery编写任务调用异步任务查看任务执行状态及结果 设置定时和周期性任务配置文件添加任务Django Admin添加周期性任务启动任务调度器beat Flower监控任务执行状态Celery高级用法与注意事项给任务设置最大重试次数不同任…

东郊到家app小程序公众号软件开发预约同城服务系统成品源码部署

东郊到家app系统开发&#xff0c;东郊到家软件定制开发&#xff0c;东郊到家小程序APP开发&#xff0c;东郊到家源码定制开发&#xff0c;东郊到家模式系统定制开发 一、上门软件介绍 1、上门app是一家以推拿为主项&#xff0c;个人定制型的o2o平台&#xff0c;上门app平台提…

Nginx的反向代理、动静分离、负载均衡

反向代理 反向代理是一种常见的网络技术&#xff0c;它可以将客户端的请求转发到服务器群集中的一个或多个后端服务器上进行处理&#xff0c;并将响应结果返回给客户端。反向代理技术通常用于提高网站的可伸缩性和可用性&#xff0c;并且可以隐藏真实的后端服务器地址。 #user…

泡泡玛特城市乐园开园在即,知名潮玩IP落地北京朝阳

今年以来&#xff0c;文旅产业成为亮眼消费赛道&#xff0c;大IP主题乐园再次受到市场关注。优质IP可以为园区引流&#xff0c;帮助乐园摆脱门票经济&#xff0c;平衡收入结构。 国内“潮玩第一股”泡泡玛特近日宣布&#xff0c;国内首个潮玩行业沉浸式IP主题乐园——泡泡玛特…

内存对齐--面试常问问题和笔试常考问题

1.内存对齐的意义 C 内存对齐的主要意义可以简练概括为以下几点&#xff1a; 提高访问效率&#xff1a;内存对齐可以使数据在内存中以更加紧凑的方式存储&#xff0c;从而提高了数据的访问效率。处理器通常能够更快地访问内存中对齐的数据&#xff0c;而不需要额外的字节偏移计…

hadoop组件HDFS

HDFS里面的几个组件&#xff0c;分别有哪些功能和作用&#xff1f; Namenode:主角色,负责和客户端进行沟通.Datanode:从角色,负责存储数据Secondary namenode:秘书,服务器数据的收集&#xff0c;将信息传递给namenode注&#xff1a;Namenode宕机时集群会通过选举机制&#xff…

vue安装依赖报错install i 报错提示npm audit fix --force,or `npm audit` for details

vue项目执行npm install初始化后报错 run npm audit fix to fix them, or npm audit for details 出现这类提醒&#xff0c;按照如下操作进行 1、首先安装模块依赖&#xff1a; npm install &#xff08;npm audit fix 含义&#xff1a; 检测项目依赖中的漏洞并自动安装需要…

Java笔记三

包机制&#xff1a; 为了更好地组织类&#xff0c;Java提供了包机制&#xff0c;用于区别类名的命名空间。 包语句的语法格式为&#xff1a;pack pkg1[. pkg2[. pkg3...]]; 般利用公司域名倒置作为包名&#xff1b;如com.baidu.com&#xff0c;如图 导包&#xff1a; 为了能够…

协议-TCP协议-基础概念03-Keep live保活机制-TCP RST-TCP连接

Keep live保活机制-TCP RST-TCP连接 参考来源&#xff1a; 《极客专栏-网络排查案例课》 Keep live保活机制 定时发送心跳探测包&#xff1b; 对于心跳回复包有超时限制&#xff1b; 要打开这个 TCP Keep-alive 特性&#xff0c;你需要使用 setsockopt() 系统调用&#xff0…

Ps:缩放工具

缩放工具 Zoom Tool 常用于对图像进行视图上的放大和缩小。在查看图像细节、处理图像时极为常用。 快捷键&#xff1a;Z ◆ ◆ ◆ 常用操作方法与技巧 1、快捷键 Z 是一个弹簧键。即&#xff0c;在其它工具的状态下&#xff0c;按住 Z 键不放就会临时切换到缩放工具&#xff…

什么是异步编程?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 处理异步操作的方法⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 欢迎来到前端入门之旅&#xff01;感兴趣的可以订阅本专栏哦&#xff01;这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们量身打…