• 兄弟组件通信context


    context介绍 

    在平常我们使用react中,数据都是自顶而下的传递方式,如果在顶层组件中的state中存储数据,在不借助任何第三方的状态管理框架的情况下,想在子组件中获取顶层组件的数据,唯一的方法就是一层层进行数据的传递,即使两者之间的组件根本不需要该数据,如果层级越深,层层传递数据可谓是灾难,所以context的出现就解决了这一问题,context是一种跨越层级传递值的一种方法,

    context实现步骤

    兄弟组件起到的作用类似中间人的模式,先子传父,再父传子

    context状态传递数据

            先定义一个空对象,抛出一个React.createContext(默认值),结构赋值获取Provider和Consumer组件

            根组件中定义在需要的位置使用Context的provider

           定义contextType获取数据,或者也可以使用Consumer获取多个内容

    代码展示

    context.js组件

    1. import React from 'react';
    2. //定义一个对象的数据
    3. let context = React.createContext(null);
    4. //抛出对象的内容
    5. export const {Provider,Consumer} = context;

    App.js组件

    层级关系:App->Text->Span

    我们直接在顶层的组件里使用Provider组件,并且Provider组件有一个value属性用于传递context的实际的value。然后我们就可以在底层的Child组件中得到这些value来使用。

    1. import React from 'react';
    2. import './App.css';
    3. import { Provider, Consumer } from "./context/index";
    4. class App extends React.Component {
    5. constructor() {
    6. super();
    7. this.state = {
    8. color: "#FF0000"
    9. }
    10. }
    11. changeColor = () => {
    12. console.log(this.refs.colors.value)
    13. this.setState({
    14. color: this.refs.colors.value
    15. })
    16. }
    17. render() {
    18. let { color } = this.state;
    19. return (
    20. <Provider value={{ color: color, fontSize: "24px" }}>
    21. <div>
    22. <input type="color" ref="colors" onChange={this.changeColor} />
    23. <Text />
    24. div>
    25. Provider>
    26. )
    27. }
    28. }
    29. function Text(props) {
    30. return (
    31. <div>
    32. <h4>Text子组件h4>
    33. <Span />
    34. div>
    35. )
    36. }
    37. function Span(props) {
    38. return (
    39. <div>
    40. {/* 接受Provier传递的数据 */}
    41. <Consumer>
    42. {
    43. (context) => {
    44. console.log(context)
    45. return (
    46. <span style={context}>Hello Reactspan>
    47. )
    48. }
    49. }
    50. Consumer>
    51. div>
    52. )
    53. }
    54. export default App;

    使用场景:

    当我们想要跨层级传递数据时,而数据本身要传递的地方不多,这个时候往往不想再引入一个更复杂的状态管理框架(如redux等),这个时候,context会是一个十分不错的选择

  • 相关阅读:
    Prompt Learning——Template
    年度盘点,四年的精华合集「GitHub 热点速览」
    阿里后端优化这么恐怖?看完这20W字Java性能实战经验手册,最少P7
    openXBOW的使用(2)
    coreldraw2024版本有哪些新增功能?
    哈希表 or HashMap模拟实现
    虚拟环境和包
    阿里云ossutil使用
    【架构-18】缓存雪崩?缓存穿透?缓存击穿?
    黑马头条:app端文章查看
  • 原文地址:https://blog.csdn.net/qq_60976312/article/details/126063008