当前位置: 首页 > news >正文

React Context的使用方法

背景:在某些场景下,你想在整个组件树中传递数据,但却不想手动地在每一层传递属性,你可以直接在React中使用强大的contextAPI 解决上述问题

在一个典型的React 中,数据通过Props属性自下而上(由父及子)进行传递的,但这种做法对于某些类型的属性而言机器繁琐,(地区偏好,UI主题)这些属性是应用程序中许多组件都需要的。Context提供了一种在组件之间共享此值的方式,而不必显式的通过组件树逐层传递props

contextType只能用在类组件里
Consumer一般用在函数组件中

import React from './react';
import ReactDOM from './react-dom';
let ThemeContext = React.createContext();
/* let ThemeContext = React.createContext();
let { Provider, Consumer } = ThemeContext; */
//ThemeContext={Provider,Consumer} Consumer一般用在函数组件中
function Header(){return (<ThemeContext.Consumer>{value=>(<div style={{ margin: '10px', border: `5px solid ${value.color}`, padding: '5px' }}>头部</div>)}</ThemeContext.Consumer>)
}
class Main extends React.Component {static contextType = ThemeContextrender() {return (<div style={{ margin: '10px', border: `5px solid ${this.context.color}`, padding: '5px' }}>主体<Content /></div>)}
}
class Content extends React.Component {static contextType = ThemeContextrender() {return (<div style={{ margin: '10px', border: `5px solid ${this.context.color}`, padding: '5px'}}>内容<button onClick={()=>this.context.changeColor('red')}>变红</button><button onClick={()=>this.context.changeColor('green')}>变绿</button></div>)}
}
class Page extends React.Component {constructor(props) {super(props);this.state = { color: 'red' };}changeColor = (color) => {this.setState({ color });}render() {let contextValue = { color: this.state.color, changeColor: this.changeColor };return (<ThemeContext.Provider value={contextValue}><div style={{ margin: '10px', border: `5px solid ${this.state.color}`, padding: '5px', width: '200px' }}>主页<Header /><Main /></div></ThemeContext.Provider>)}
}
ReactDOM.render(<Page />, document.getElementById('root'));

react.js中相关代码

function createContext(){function Provider({value,children}){Provider._value = value;return children;}function Consumer({children}){return children(Provider._value);}return {Provider,Consumer};
}
http://www.lryc.cn/news/305040.html

相关文章:

  • ElasticSearch索引数据备份与恢复
  • kubernetes日志收集 fluent-operator 动态索引名的实现
  • pip换源
  • 7.(数据结构)堆
  • AWS Elastic Beanstalk通过应用负载均衡配置https
  • AC自动机:文本搜索的加速器
  • 备战蓝桥杯---基础算法刷题1
  • 探索 Flutter 中的动画:使用 flutter_animate
  • 装机容量对光伏发电量的影响有多大?如何通过装机容量计算发电量?
  • 软考37-上午题-【数据库】-数据模型、数据库的三级模式和二级映像
  • 06 分频器设计
  • 力扣hot100题解(python版7-9题)
  • ECMAScript 6+ 新特性 ( 四 ) 迭代器 与 生成器
  • 【MySQL】事务的一致性究竟怎么理解?
  • 证件照(兼容H5,APP,小程序)
  • pytorch-textregression,中文文本回归实践,支持多值输出
  • go语言学而思【持续更新】
  • LVS-NAT之VMNET环境搭建
  • [TCP] TCP/IP 基础知识词典(2)
  • 【牛牛送书 | 第四期】《高效使用Redis:一书学透数据存储与高可用集群》带你快速学习使用Redis
  • Threejs 实现3D影像地图,Json地图,地图下钻
  • 根据Excel创建管道系统及材质
  • 第八篇【传奇开心果系列】python的文本和语音相互转换库技术点案例示例:Google Text-to-Speech虚拟现实(VR)沉浸式体验经典案例
  • ubuntu使用LLVM官方发布的tar.xz来安装Clang编译器
  • Windows 远程控制 Mac 电脑怎么操作
  • c# HttpCookie操作,建立cookie工具类
  • 【这个词(Sequence-to-Sequence)在深度学习中怎么解释,有什么作用?】
  • 挑战30天学完Python:Day16 日期时间
  • Web3之光:揭秘数字创新的未来
  • Stable Diffusio——采样方法使用与原理详解