首页 > 其他分享 >Vue2中的父子通信

Vue2中的父子通信

时间:2023-11-11 20:44:07浏览次数:43  
标签:Bus 通信 prop 父子 修改 Vue2 props 组件 校验

父子通信流程图:

  • 父组件通过props将数据传递给子组件
  • 子组件利用$emit通知父组件修改更新
    image

父组件传递子组件

image

注意点

但是需要注意的是,通过props传递的数据是只读状态的,也就是说,我们不能去修改这个值。
注意:props是只读的,如果直接对props中的数据进行修改,Vue就会发出警告。如果需要对props进行修改,就把props中的内容复制一份到data中,然后修改data中的数据。
image

子组件传递父组件

子组件利用$emit通知父组件,进行修改更新
image
效果如下:
image
image

说白了就是子组件通过$emit去定义一个监听事件,并且携带需要修改的数据传递到父组件中,父组件触发了这个事件,随之做相应的操作。

什么是prop

  • Prop定义:组件上注册的一些自定义属性
  • Prop作用:向子组件传递数据

特点:

  • 可以传递任意数量的prop
  • 可以传递任意类型的prop

image

由于prop的特性,使得prop也具有了一定的危险性,在组件的通信过程中,如果传递的数据并不是某个子组件具体需要的值,那么就会导致子组件的某些突发情况,正因为如此,此时可以通过 props校验 去完成。

props校验

作用:为组件的prop指定验证要求,不符合要求,可以在控制台错误提示

语法:

  • 类型校验
  • 非空校验
  • 默认值
  • 自定义校验
 props:{
    username:{
      type:String, // 类型校验
      default:'张三', // 默认值
      require:true, // 非空校验
      // 自定义校验
      validator(value){
        if(value.length<=0 || value.length>=10){
          // 不放行
          return false
        }else{
          // 放行
          return true;
        }
      }
    },
    age:{},
    isSingle:{},
    car:{},
    hobby:{}
  }

prop 和 data 的区别

共同点:都可以给组件提供数据。
区别:

  • data的数据是自己的,可以修改
  • prop的数据是外部的,不能直接修改,要遵循单向数据流

其实对于子组件修改属性有两种方式:
个人认为

  • 第一是 父组件通过:xxx="xxx"的方式传递给子组件,子组件通过this.$emit去通知父组件,虽然父组件通过监听去实现数据的修改
  • 第二是 子组件通过自身的data去拷贝一份父组件传递过来的prop属性

总而言之,谁的数据,谁负责去修改

非父子通信

  • 通过provide & inject 或 eventbus

eventbus

作用:非父子组件,进行简易消息传递。复杂场景还是使用vuex
步骤:

  • 1.创建一个都能访问到的事件总线(空Vue 实例)-> utils/EventBus.js
import Vue from 'vue'
const Bus = new Vue()
export default Bus
  • 2.A组件(接收方) ,监听Bus实例的事件
created(){
    <!--相当于这个 bus组件 监听了 sendMsg 这个事件 -->
    Bus.$on('sendMsg',(msg)=>{
     this.msg = msg
    })
}
  • 3.B组件(发送方),触发Bus实例的事件
Bus.$emit('sendMsg',"xxxxx消息")

那么,接收方A ,就会收到这个消息了

图解形式:
image

provide & inject

作用: 跨层级共享数据
image

步骤:

  • 1.父组件 provide 提供数据
export default{
    provide(){
        return{
            //普通消息【非响应式】
            color:this.color,
            // 复杂消息【响应式】
            userInfo:this.userInfo,
        }
    }
}
  • 2.子/孙组件 inject取值使用
export default{
   inject:['color','userInfo']
   created():{
       console.log(this.color,this.userInfo)
   }
}

.sync 修饰符

作用:可以实现子组件与父组件数据的双向绑定,简化代码
特点:prop属性名,可以自定义,非固定为value
场景:封装弹窗类的基础组件,visible属性,true显示 false隐藏

父组件使用:

<BaseDialog :visible.sync = 'isSshow'/>
// 等价 采用上面的即可
<BaseDialog
    :visible='isShow'
    @update:visible='isShow = $event'/>

子组件使用:

props:{visible:Boolean}

xxx(){this.$emit('update:visible',false)}

代码:
image

通用方案

  • vuex

标签:Bus,通信,prop,父子,修改,Vue2,props,组件,校验
From: https://www.cnblogs.com/zgf123/p/17826328.html

相关文章

  • vue2 vue.min.js和vue-cli-service build --target lib 构建的.min.js的压缩原理,使用
    1vue-cli-service --targetlibhttps://github.com/vuejs/vue-cli/blob/f0f254e4bc81ed322eeb9f7de346e987e845068e/packages/%40vue/cli-service/lib/commands/build/index.js#L5可以看到这里formats:'commonjs,umd,umd-min',默认有三种格式,其中的umd-min经过了压缩再去搜u......
  • 基于OFDM的水下图像传输通信系统matlab仿真
    1.算法运行效果图预览  2.算法运行软件版本matlab2022a 3.算法理论概述      基于OFDM的水下图像传输通信系统是一种用于在水下环境中传输图像数据的通信系统。它采用了OFDM(OrthogonalFrequencyDivisionMultiplexing)技术,这种技术在水下通信中具有一些优......
  • vue2 vant2 智慧商城
       最近学这个......
  • 关于透明传输在通信中的应用浅谈
    关于透明传输在通信中的应用浅谈随着现代通信技术的飞速发展,数据传输的需求和复杂性日益增长。在这样的背景下,透明传输技术成为了通信领域的重要研究对象。透明传输是指在不改变原始数据的前提下,将数据完整、准确地传输到目的地。本文将详细探讨透明传输在通信中的应用。透明传输是......
  • 关于透明传输在通信中的应用浅谈
    关于透明传输在通信中的应用浅谈随着现代通信技术的飞速发展,数据传输的需求和复杂性日益增长。在这样的背景下,透明传输技术成为了通信领域的重要研究对象。透明传输是指在不改变原始数据的前提下,将数据完整、准确地传输到目的地。本文将详细探讨透明传输在通信中的应用。透明传......
  • 无线通信的核心技术有哪些?
    无线通信的核心技术有哪些?无线通信的核心技术包括调制与解调技术、编码与解码技术、非正交多址接入技术等。1、调制与解调技术:调制是将数字信号转换成适合在无线信道上传输的模拟信号的过程,解调则是将接收到的模拟信号转换回数字信号的过程。调制与解调技术包括各种调制方案,如调幅(......
  • 无线通信的核心技术有哪些?
    无线通信的核心技术有哪些?无线通信的核心技术包括调制与解调技术、编码与解码技术、非正交多址接入技术等。1、调制与解调技术:调制是将数字信号转换成适合在无线信道上传输的模拟信号的过程,解调则是将接收到的模拟信号转换回数字信号的过程。调制与解调技术包括各种调制方案,如调......
  • react组件间通信
    1.父组件向子组件通信import{useState}from'react';functionButton(props){return(<div>{props.name}</div>)}functionApp(){constmsg=useState('神雕侠侣')return(<divclassName="App">&l......
  • 如何使用 RestTemplate 进行 Spring Boot 微服务通信示例
    概述下面我们将学习如何创建多个Springboot微服务以及如何使用RestTemplate类在多个微服务之间进行同步通信。微服务通信有两种风格:同步通讯异步通信同步通讯在同步通信的情况下,客户端发送请求并等待服务的响应。这里重要的一点是协议(HTTP/HTTPS)是同步的,客户端代码只......
  • maven项目聚合和父子项目
    maven项目聚合聚合项目又称为多模块项目,这种结构的目的是为了统一构建项目,也就是说当对根项目的任何mvn命令操作,都会相应的执行到每一个被聚合的module项目中,目的是为了方便管理多个项目的编译打包等操作。想象一下,如果你创建了10个项目,如果你要对这10个项目进行mvninstall操......