• react组件通信


    一、父传子通信

    实现步骤

    1.父组件提供要传递的数据-state

    2.给子组件标签添加属性值为state中的数据

    3.子组件通过props接受父组件中传过来的数据

          a.类组件使用this.props获取props对象

          b.函数式组件直接通过参数获取props对象

    代码实现:

    1. import React from 'react'
    2. // 函数式子组件
    3. function FSon(props) {
    4. console.log(props)
    5. return (
    6. <div>
    7. 子组件1
    8. {props.msg}
    9. </div>
    10. )
    11. }
    12. // 类子组件
    13. class CSon extends React.Component {
    14. render() {
    15. return (
    16. <div>
    17. 子组件2
    18. {this.props.msg}
    19. </div>
    20. )
    21. }
    22. }
    23. // 父组件
    24. class App extends React.Component {
    25. state = {
    26. message: 'this is message'
    27. }
    28. render() {
    29. return (
    30. <div>
    31. <div>父组件</div>
    32. <FSon msg={this.state.message} />
    33. <CSon msg={this.state.message} />
    34. </div>
    35. )
    36. }
    37. }
    38. export default App

    props说明:

        props是只读对象,不能进行修改

        props可以传递任意数据(数字,字符串,布尔值,数组,对象,函数,JSX)

    二、子传父通信

    实现步骤

    1.父组件提供一个回调函数,用于接受数据

    2.将函数作为属性的值,传给子组件

    3.子组件通过props调用 回调函数

    4.将子组件中的数据作为参数传递给回调函数

    代码实现

    1. import React from 'react'
    2. // 子组件
    3. function Son(props) {
    4. function handleClick() {
    5. // 调用父组件传递过来的回调函数 并注入参数
    6. props.changeMsg('this is newMessage')
    7. }
    8. return (
    9. <div>
    10. {props.msg}
    11. <button onClick={handleClick}>change</button>
    12. </div>
    13. )
    14. }
    15. class App extends React.Component {
    16. state = {
    17. message: 'this is message'
    18. }
    19. // 提供回调函数
    20. changeMessage = (newMsg) => {
    21. console.log('子组件传过来的数据:',newMsg)
    22. this.setState({
    23. message: newMsg
    24. })
    25. }
    26. render() {
    27. return (
    28. <div>
    29. <div>父组件</div>
    30. <Son
    31. msg={this.state.message}
    32. // 传递给子组件
    33. changeMsg={this.changeMessage}
    34. />
    35. </div>
    36. )
    37. }
    38. }
    39. export default App

    三、兄弟组件通信

    核心思路: 通过状态提升机制,利用共同的父组件实现兄弟通信

    实现步骤

    1.将共享状态提升到最近的公共组件中,由公共父组件管理这个状态

            提升共享状态

            提供操作共享状态的方法

    2.要接受数据状态的子组件通过props接受数据

    3.要传递数据状态的子组件通过props接受方法,调用方法传递数据

    代码实现

    1. import React from 'react'
    2. // 子组件A
    3. function SonA(props) {
    4. return (
    5. <div>
    6. SonA
    7. {props.msg}
    8. </div>
    9. )
    10. }
    11. // 子组件B
    12. function SonB(props) {
    13. return (
    14. <div>
    15. SonB
    16. <button onClick={() => props.changeMsg('new message')}>changeMsg</button>
    17. </div>
    18. )
    19. }
    20. // 父组件
    21. class App extends React.Component {
    22. // 父组件提供状态数据
    23. state = {
    24. message: 'this is message'
    25. }
    26. // 父组件提供修改数据的方法
    27. changeMsg = (newMsg) => {
    28. this.setState({
    29. message: newMsg
    30. })
    31. }
    32. render() {
    33. return (
    34. <>
    35. {/* 接收数据的组件 */}
    36. <SonA msg={this.state.message} />
    37. {/* 修改数据的组件 */}
    38. <SonB changeMsg={this.changeMsg} />
    39. </>
    40. )
    41. }
    42. }
    43. export default App

    四、跨组件通信 Context

    实现步骤

    1.创建Context对象 导出 Provider 和 Consumer对象

    2.使用Provider包裹上层组件提供数据

    3.需要用到数据的组件使用Consumer包裹获取数据

    代码实现

    1. import React, { createContext } from 'react'
    2. // 1. 创建Context对象
    3. const { Provider, Consumer } = createContext()
    4. // 3. 消费数据
    5. function ComC() {
    6. return (
    7. <Consumer >
    8. {value => <div>{value}</div>}
    9. </Consumer>
    10. )
    11. }
    12. function ComA() {
    13. return (
    14. <ComC/>
    15. )
    16. }
    17. // 2. 提供数据
    18. class App extends React.Component {
    19. state = {
    20. message: 'this is message'
    21. }
    22. render() {
    23. return (
    24. <Provider value={this.state.message}>
    25. <div className="app">
    26. <ComA />
    27. </div>
    28. </Provider>
    29. )
    30. }
    31. }
    32. export default App

  • 相关阅读:
    35岁危机来临前,程序员如何未雨绸缪?
    FCN的代码解读
    学习笔记-内存管理
    Stable Diffusion教程
    RabbitMQ消息可靠性保证机制--发送端确认
    Vue动态样式绑定
    “蔚来杯“2022牛客暑期多校训练营10
    2024绿色能源、城市规划与环境国际会议(ICGESCE 2024)
    Gradle 中 api、implementation、compileOnly、provide 区别与联系
    PolarDB-X 源码解读系列:DML 之 INSERT IGNORE 流程
  • 原文地址:https://blog.csdn.net/weixin_50999303/article/details/133775997