美文网首页reactReact系列
第十节: React组件间的通信

第十节: React组件间的通信

作者: 曹老师 | 来源:发表于2022-06-27 21:53 被阅读0次
  1. 父子组件通信
    说明:

父组件通过props属性,将一般数据传递给子组件
react是单行数据流, 因此,如果子组件需要将数据传递给父组件
首先父组件通过props属性父组件的方法下发给子组件
子组件通过调用父组件将方法传参的方式将数据传递给父组件

示例代码:

父组件代码:

import React from 'react';
import './App.css';

import List from './List'

class App extends React.Component {
// 父组件定义状态
state = {
list: [
{
id: 0,
doing: "吃饭"
},
{
id: 1,
doing: "睡觉"
},
{
id: 2,
doing: "打豆豆"
}
],
nextId: 3,
inputValue:""
}

// 添加内容
addDoing = () =>{
    // 获取输入框中的内容
    let value = this.input.value.trim()

    // 判断内容是否为空
    if(!value){
        console.log("输入内容不能为空");
        return 
    }

    // 不为空就将内容添加到状态中
    let {list,nextId} = this.state

    list.unshift({
        id:nextId,
        doing:value
    })

    this.setState(() => ({
        nextId: ++nextId,
        list
    }))

    // 清空输入空内容
    this.input.value = ""
}


// 删除状态的方法
deleteList = (index) => {

    // 删除完成的内容
    let { list } = this.state
    list.splice(index,1)

    this.setState(() => ({
        list
    }))

}


render(){
    // 取出数据
    let {list} = this.state
    return (
        <div className="App">
            <h2>添加内容</h2>
            <div>
                <input type="text" ref={input => this.input = input}/>
                <button onClick={ this.addDoing }>添加</button>
            </div>
            {/* 
            
            // 父组件向子组件同信
            1. 父向子通信:将父组件的数据通过props 传递给子组件 
            2. 子向父通信: 将父组件的方法下发给子组件,子组件将调用向父组件传参
          */}
            <List 
                list={list}
                deleteList = {this.deleteList}
                />
        </div>
    )
}

}

export default App;
子组件代码:

import React from 'react'

class List extends React.Component{

// 子组件向父组件同信
complete = (index) => {
    // 1. 获取父组件传递过来的方法
    let {deleteList} = this.props
    // 2. 调用方法,将数据传递给父组件
    deleteList(index)
}

render(){
    // 通过props获取父组件传递过来的数据
    console.log(this.props)
    let {list} = this.props

    return (
        <div>
            <ul>
                {
                    list.map((item,index) => (
                        <li key={item.id}> 
                            {index}:{ item.doing}
                            <button onClick={() => (this.complete(index))}>
                                完成
                            </button>
                        </li>
                    ))
                }
            </ul>
        </div>
    )
}

}

export default List
这种传递方式有弊端,就是不是父子组件传递数据,不是很方便

  1. 使用消息订阅(subscribe)-发布(publish)机制
    2.1 发布订阅机制的了解
    订阅就像是绑定事件监听, 发布就像触发事件
    发布订阅机制需要使用到第三方的工具库 pubsub-js
    通过subscribe方法订阅或者叫绑定自定义事件
    通过publish 方法触发自定义事件的执行, 也叫发布
    优点: 对组件的关系没有限制

2.2 使用
下载安装

$ npm install pubsub-js --save
使用的语法:

// 发布消息(就相当于触发事件)
// 这里就相当于触发了search事件,并且传递实参hello world
PubSub.publish('seach', 'hello world')

// 订阅消息(就相当于绑定事件)
PubSub.subscribe('seach', function(msg,data){
// msg 是消息名 就是search
// data 就是发布消息时传递过来的数据
})

示例代码如下:

修改上面的示例:

父组件:

在父组件的componentDidMount生命周期函数中订阅消息

class App extends React.Component {
// 父组件定义状态
state = {
list: [
{
id: 0,
doing: "吃饭"
},
{
id: 1,
doing: "睡觉"
},
{
id: 2,
doing: "打豆豆"
}
],
nextId: 3,
inputValue:""
}

// 组件挂在完毕后订阅事件
componentDidMount(){
    PubSub.subscribe("delete",  (msg ,index) => {
        /*
            自定义事件接受两个参数
            1. 第一个参数为自定义事件名,也叫消息名
            2. 第二个参数是发布消息,也就是触发自定义事件时传递的参数
        */
        // 删除完成的内容
        let { list } = this.state
        list.splice(index,1)
        this.setState(() => ({
            list
        }))

    })
}



render(){
    // 取出数据
    let {list} = this.state
    return (
        <div className="App">
            <h2>添加内容</h2>
            <div>
                <input type="text" ref={input => this.input = input}/>
                <button onClick={ this.addDoing }>添加</button>
            </div>
            {/* 
            1. 父向子通信:将父组件的数据通过props 传递给子组件 
            2. 使用发布订阅机制就不用在向子组件传递函数了
          */}
            <List 
                list={list}
                />
        </div>
    )
}

}
子组件

通过publish发布消息, 也可以理解为触发自定义事件

class List extends React.Component{

// 在点击事件函数中发布消息, 并传递参数
complete = (index) => {
    // 发布事件,触发自定义事件的执行
    PubSub.publish("delete", index)
}

render(){
    // 通过props获取父组件传递过来的数据
    console.log(this.props)
    let {list} = this.props

    return (
        <div>
            <ul>
                {
                    list.map((item,index) => (
                        <li key={item.id}> 
                            {index}:{ item.doing}
                            <button onClick={() => (this.complete(index))}>
                                完成
                            </button>
                        </li>
                    ))
                }
            </ul>
        </div>
    )
}

}

  1. redux 状态管理
    通过redux可以实现任意组件间的通信,

集中式管理多个组件共享的状态,

而pubsub-js并不是状态管理,状态还是要定义在组件中,只不过是使用发布订阅机制通信

redux后面详谈

相关文章

  • React组件间通信

    不借助redux等状态管理工具的React组件间的通信解决方法 组件通信分类 React组件间通信分为2大类,3种...

  • React学习拾遗2

    组件间通信: 龟兔赛跑-React组件间通信Demo:http://js.jirengu.com/yowec/ed...

  • React Native 架构之 Redux介绍

    React 在 React 中,UI 以组件的形式来搭建,组件之间可以嵌套组合。另,React 中组件间通信的数据...

  • React父子组件间通信的实现方式

    React学习笔记之父子组件间通信的实现:今天弄清楚了父子组件间通信是怎么实现的。父组件向子组件通信是通过向子组件...

  • (1)React的开发

    1、React项目架构搭建2、JSX语法3、React组件化开发4、React组件间通信5、React中的事件6、...

  • 第十节: React组件间的通信

    1. 父子组件通信 说明: 父组件通过props属性,将一般数据传递给子组件 react是单行数据流, 因此,如果...

  • 第十节: React组件间的通信

    父子组件通信说明: 父组件通过props属性,将一般数据传递给子组件react是单行数据流, 因此,如果子组件需要...

  • 「React Native」Event Bus,消息总线

    (一)父子间组件通信:   一般使用props,回调函数进行通信。(二)跨组件之间通信:  (1)React Na...

  • React组件间通信

    父组件向子组件 定义组件的方法就是通过React.createClass,当我们使用组件并且给其属性的时候,这个属...

  • react组件间通信

    React 开发模式是组件化开发, 所以组件间的信息传递就尤为重要,React传递数据的方式主要有3种。 prop...

网友评论

    本文标题:第十节: React组件间的通信

    本文链接:https://www.haomeiwen.com/subject/aetgvrtx.html