首页 > 其他分享 >组件通讯

组件通讯

时间:2023-08-23 09:03:14浏览次数:61  
标签:订阅 通讯 传递数据 context props 组件 接收数据

1. 组件通讯

1.1 props

  1. 主要用于父传子,只能一级一级传递

  2. 传递数据的方法:属性名={值},属性名自定义

  3. 如果是函数组件接收数据,则通过形参props接收数据

  4. props是对象{arr:[...]},对象上的属性就是传递数据时,组件上的属性

  5. 如果是类组件接收数据,使用this.props

  6. props可以传递任何类型的数据(普通的数据类型、虚拟dom、组件类型、组件实例)

  7. props数据是只读的,不要修改

  8. 批量传递:<Text {...obj} />===>

  9. 写在组件子节点的内容,默认为props对象中children属性的值

    <Text >测试</Text>
    function Text(props){
    	// 显示‘测试’两个字    
        return <div> {props.children}</div>
    }
    

1.2 context

  1. react提供的方案,自上而下传递,允许跨级传递(爷===>父爷===>孙

  2. 适用于父级组件传递数据给孙组件,父组件===》孙组件

  3. 步骤:App => Far => Son

  4. 传递数据:

    1. 创建context对象:const context = React.createContext( '默认值'),默认值在不写 Provider 的时候生效

    2. 解构出Provider: const {Provider} = context

    3. 用Provider包裹整个组件

    4. 要传递的数据通过给Provider添加属性value的值添加

      <Provider value={data}>
      	<div>
          	App
      		<Far></Far>
          </div>
      </Provider>
      
  5. 接收数据:方式一

    //利用context接收数据:
    const  {Consumer} = context// 结构出Consumer
    export default class Son extends Component{
        render(){
            return (
            	<Consumer>
                	{(data)=>{
                return <div>Son,{data}</div>
            }}
                </Consumer>
            )
        }
    }
    
  6. 接收数据:方式二

    export default class Son extends Component{
     // 给接收数据的组件添加一个静态属性 contextType
        static contextType =context
    	render(){
       		// 使用this.context,这就是传递过来的数据     
            return <div>Son:{this.context}</div>
        }
    }
    

1.3 pubsub-js

  1. pubsub-js是一个独立的js库,props和context是react技术

  2. 组件之间不需要有嵌套关系,props和context需要组件之间有嵌套关系

  3. 是一个发布订阅模式的js库,传递数据的组件就是发布者,接收数据的组件就是订阅者

  4. 一个组件既可以是发布者(传递数据),也可以是订阅者(接收数据)

  5. 一个发布者(传递数据)可以对应多个订阅者(接收数据)

  6. 操作步骤:

    1. 安装:npm i publish-js

    2. 导入对象,提高发布 / 订阅功能:import PubSub from 'pubsub-js'

    3. 提供的一些方法

      1. 接收数据:(订阅)PubSub.subscribe(话题,callback),一般正在挂载的时候

        // subId:方法的返回值,当前订阅的唯一标识符,用于清除当前订阅,一般在组件挂载时订阅
        var subId = PubSub.subscribe('car' , function(meassage , data){
        // meassage:话题;data接收的数据
            console.log(data)
        })
        
      2. 传递数据:(发布)PubSub.Publish("话题",data)

        PubSub.publish('car','Hello Word!')
        // car:是话题
        // Hello Word!:是需要传递的数据内容
        
      3. 取消指定的订阅(获取数据),一般在组件卸载的时候,清除之前的订阅数据,节约内存

        PubSub.unsubscribe(subId)
        // 利用订阅的唯一标识符
        
      4. 取消某个话题的所有订阅

        PubSub.unsubscribe(话题)
        
      5. 取消所有订阅

        PubSub.clearAllSubscriptions()
        
  7. 为什么要取消订阅?

    // 因为pubsub-js内部,管理了一个对象.每一次订阅的就是往对象中添加属性,值是数组,数组中存放了当前话题所对应的所有订阅的回调函数
       {
          car: [callback1, callback2]
       }
     //如果组件卸载了,但是组件的订阅还在,这就浪费了内存. 所以组件卸载的时候要清除订阅.
    
    
    

高阶组件HOC

解决代码复用问题,将相同的state和逻辑封装起来

操作步骤:

  1. 创建一个公共组件(Common)
  2. 在公共组件(Common)中定义相同的状态和逻辑
  3. 在公共组件(Common)中,给每个需要使用公共组件中的状态和逻辑的组件创建一个组件实例

标签:订阅,通讯,传递数据,context,props,组件,接收数据
From: https://www.cnblogs.com/chichi0002/p/17650101.html

相关文章

  • 下拉选择组件 指定搜索字段
     show-search后可开启搜索模式。把搜索的值内容改为optionFilterProp=label想同时搜索label和value两个字段把label设置成label="v.roleName+v.roleId"<a-selectref="select"v-model:value="value1"show-searchoptionFilterProp="label">&l......
  • 通过作用域插槽封装高级列表组件
    1、应用范围一个项目可能有多个页面用到了table,都是从后台请求数据进行渲染。分页。等通用功能。ui或许有些许不同,但是大部分都是重复的功能。所以看了官方文档,我们可以通过作用域插槽封装高级列表组件,一个组件通用所有项目。2、使用方式封装通用组件<FancyList:api-url="u......
  • CAN通讯-使用Python收发CAN数据保姆级教程(包含完整代码)
    CAN通讯-使用Python收发CAN数据配置环境1.环境配置1.1安装CAN通讯需要的包1.2安装kvaser_drivers以及KvaserCanKing2.使用Python收发数据2.1接发数据代码如下:2.1.1接收数据代码2.1.2发送数据代码2.2验证发送数据2.2.1使用KvaserCanKing接收数据2.2.2......
  • vue拖拽组件的使用(vuedraggable)
    vuedraggable官方文档链接:https://www.itxst.com/vue-draggable/tutorial.html按装npmi-Svuedraggable页面引入importdraggablefrom"vuedraggable"注册组件components:{draggable},使用<template><div><el-popoverplacement=&q......
  • vue3父子组件通信小结
    父子组件中的attrsprops理解/继承首先,父组件可以给子组件传入属性、监听函数(类似onClick),class,style,id,总结起来就是大三类-属性,监听函数,样式!爷爷组件--有两个监听函数import{computed,defineComponent,reactive,ref}from"vue";import{css}from"@emotion/css"......
  • 组件传值
    父组件向子组件传值props只能是父组件向子组件进行传值,props使得父子组件之间形成了一个单向下行绑定。子组件的数据会随着父组件不断更新。props可以显示定义一个或一个以上的数据,对于接收的数据,可以是各种数据类型,同样也可以传递一个函数。props属性名规则:若在props中使用......
  • 界面组件DevExpress Reporting——增强的SQL和实体框架数据源引入
    DevExpressReporting是.NETFramework下功能完善的报表平台,它附带了易于使用的VisualStudio报表设计器和丰富的报表控件集,包括数据透视表、图表,因此您可以构建无与伦比、信息清晰的报表。本文总结了v23.1中针对DevExpress报表和BIDashboard产品中使用的SQL和实体框架数据源引......
  • 阿里相关组件-阿里Cola状态机相关
    使用State:状态Event:事件,状态由事件触发,引起变化Transition:流转,表示从一个状态到另一个状态ExternalTransition:外部流转,两个不同状态之间的流转InternalTransition:内部流转,同一个状态之间的流转Condition:条件,表示是否允许到达某个状态Action:动作,到达某个状态之后,可以做什......
  • Spring Cloud微服务网关Gateway组件
    网关简介大家都都知道在微服务架构中,一个系统会被拆分为很多个微服务。那么作为客户端要如何去调用这么多的微服务呢?如果没有网关的存在,我们只能在客户端记录每个微服务的地址,然后分别去用。  这样的架构,会存在着诸多的问题:每个业务都会需要鉴权、限流、权限校验、跨域等逻......
  • keep-alive组件的作用与原理
    什么是keep-alive“keep-alive”是Vue.js中的一个特殊组件,用于缓存组件的状态,以提高应用性能。在Vue.js中,组件通常是动态创建和销毁的,当切换到另一个页面或组件时,之前的组件会被销毁,再次进入时会重新创建和初始化。这样可能导致组件的状态丢失,需要重新初始化,增加了资源的消耗......