React组件间传值及跨组件通信详解

 更新时间:2022年09月24日 09:21:00   作者:勇敢*牛牛  
这篇文章主要介绍了React组件间传值及跨组件通信的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

组件间传值

props

父传子:通过自定义属性向子组件传值,值可以是任何类型

子传父:通过父组件把方法传给子组件,子组件调用传过去的方法完成传值

注:

1.定义方法时尽可能的去使用箭头函数定义

2.调用时,尽可能的写小括号

父组件中的方法
// 成员方法 箭头函数来定义,这样就没有this指向问题
setNum = (n = 1) => this.setState(state => ({ num: state.num + n }))
<Child num={num} setNum={this.setNum} />

子组件中
<button onClick={() => setNum(2)}>+++++</button>
子去修改父传过来的数据,props它是单向数据流,子不能直接去修改

ref

  • 父子间传值:通过ref引用对象完成对于【类组件】之间通信
  • this.childRef.current 得到当前Child组件的实例对象
childRef = createRef()
<Child ref={this.childRef} />
++++++++++++++++++++++++++++++++
this.setState({
	title: this.childRef.current.state.title
})
this.childRef.current.setState({ title: this.state.msg })
this.childRef.current.setTitle(this.state.msg)

状态提升

此方案用来解决兄弟组件间的传值问题,就是把共用的状态信息提升到父组件状态中。

import React, { Component } from 'react'
class Child1 extends Component {
  render() {
    let { setMsg } = this.props
    return (
      <div>
        <input type="text" onChange={e => setMsg(e.target.value)} />
      </div>
    )
  }
}
class Child2 extends Component {
  render() {
    let { msg } = this.props
    return (
      <div>
        <h3>{msg}</h3>
      </div>
    )
  }
}
class App extends Component {
  state = {
    msg: ''
  }
  setMsg = msg => this.setState({ msg })
  render() {
    return (
      <div>
        <h1>{this.state.msg}</h1>
        <Child1 setMsg={this.setMsg} />
        <Child2 msg={this.state.msg} />
      </div>
    )
  }
}
export default App

或者:

class App extends Component {
  state = {
    msg: '',
    setMsg: msg => this.setState({ msg })
  }
  render() {
    let { msg, setMsg } = this.state
    return (
      <div>
        <h1>{msg}</h1>
        {/* <Child1 setMsg={setMsg} /> */}
        {/* <Child2 msg={msg} /> */}
        <Child1 {...this.state} />
        <Child2 {...this.state} />
      </div>
    )
  }
}

跨组件通信

context实现在跨组件通信,一般用于自定义组件

  • context一个项目中可以有N个,但是一般情况下我们使用它,都是把它放在App组件中,一个项目一个。
  • 因为Context会让组件变得不纯粹,因为依赖了全局变量。所以这决定了Context一般不会大规模的使用。所以一般在一个组件中使用一个Context就好。
  • context实现在跨组件通信,一般用于自定义组件所用
  • context绑定消费是一定是一个对象
import { createConext } from 'react'
const ctx = createContext()
const { Provider, Consumer } = ctx
export {
	ctx as default,
	Provider,
	Consumer
}
  • Provider,Consumer 都是组件
  • Provider 生产数据的组件
  • Consumer 消费的组件

导入

在App组件中生产数据,这样下面的子孙组件就可以调用此context对象来消费数据,value属性就是生产的数据源

app.jsx

import Child from './pages/Child'
import { Provider } from './context/appContext'
class App extends Component {
    state = {
        name: "张三",
        setName: (name) => this.setState({ name }),
    };
=======================================================
render() {
       return (
           <div>
               {/* value属性就是生产的数据源 */}
               <Provider value={this.state}>
                   <Child />
               </Provider>
           </div>
       );
   }
}

child.jsx文件

两种方法来消费(获取)数据

类组件中context还可以换一个方案来消费,定义好后,就可以通过成员属性 this.context来获取数据

方式1:通过组件消费:

由于Consumer的特性,里面的代码必须是这个函数的返回值。

// 假设现在当前组件是App组件下面的很深的子孙组件
import ctx, { Consumer } from '../../context/appContext'
.....
<Consumer>{state => <h3>{state.name}</h3>}</Consumer>

方式2:通过绑定静成属性来消费

首先用static 来声明contextType

static contextType = ctx

这样在运行是就会获得一个新的属性,我们来接收它,这样consumer就可以完全不再使用了。

const battery = this.context
// 假设现在当前组件是App组件下面的很深的子孙组件
import ctx, { Consumer } from '../../context/appContext'
static contextType = ctx
const battery = this.context
//就可以通过成员属性 this.context来获取数据
.....
<h3>{this.context.name}</h3>
<h3>{battery.name}</h3>

到此这篇关于React组件间传值及跨组件通信详解的文章就介绍到这了,更多相关React组件间传值内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • React 19中向Vue那样自定义状态和方法暴露给父组件的最佳实践

    React 19中向Vue那样自定义状态和方法暴露给父组件的最佳实践

    在 React 的函数组件中,我们通常通过 props 将数据从父组件传递给子组件,而子组件通过状态(useState)和副作用(useEffect)来管理自身的行为,本文将深入探讨 useImperativeHandle 的用法、原理以及最佳实践,帮助你更好地掌握这一强大的 Hook,感兴趣的朋友一起看看吧
    2025-05-05
  • JS中使用react-tooltip插件实现鼠标悬浮显示框

    JS中使用react-tooltip插件实现鼠标悬浮显示框

    前段时间遇到的一个需求,要求鼠标悬停显示使用描述, 用到了react-tooltip插件,今天写一个总结,感兴趣的朋友跟随小编一起看看吧
    2019-05-05
  • React Router中Link和NavLink的学习心得总结

    React Router中Link和NavLink的学习心得总结

    这篇文章主要介绍了React Router中Link和NavLink的学习心得总结,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-12-12
  • React+Redux实现简单的待办事项列表ToDoList

    React+Redux实现简单的待办事项列表ToDoList

    这篇文章主要为大家详细介绍了React+Redux实现简单的待办事项列表ToDoList,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-09-09
  • React反向代理与CSS模块化的使用案例

    React反向代理与CSS模块化的使用案例

    这篇文章主要介绍了React反向代理与CSS模块化的使用案例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧
    2023-02-02
  • React使用Hooks从服务端获取数据的完整指南

    React使用Hooks从服务端获取数据的完整指南

    本文将从基础到高级用法,详细介绍如何在 React 项目中优雅地使用 Hooks 进行服务端数据获取,涵盖错误处理、加载状态、性能优化等核心场景,并提供可直接复用的代码模板,需要的朋友可以参考下
    2025-03-03
  • React使用Props实现父组件向子组件传值

    React使用Props实现父组件向子组件传值

    在React中,组件之间的数据传递通常是通过属性(Props)来实现的,父组件可以通过属性向子组件传递数据,这是React组件通信的基础模式之一,本文将探讨如何使用Props来实现父组件向子组件传递数据,需要的朋友可以参考下
    2025-04-04
  • react无限滚动组件的实现示例

    react无限滚动组件的实现示例

    本文主要介绍了react无限滚动组件的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-05-05
  • React中react-redux和路由详解

    React中react-redux和路由详解

    这篇文章主要介绍了React中react-redux和路由详解,redux早期被设计成可以在各个框架中使用,因此在不同的框架中使用的时候,要引入相应的插件,感兴趣的朋友可以继续学习下面文章
    2022-08-08
  • 浅谈React Event实现原理

    浅谈React Event实现原理

    这篇文章主要介绍了浅谈React Event实现原理,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-09-09

最新评论