[React] Implement a Higher Order Component
Sometimes you have some boilerplate for components that would be nice to abstract away slightly with a simple helper function. In this lesson we'll learn how to create a "Higher Order Component" which is a component factory function. We'll use it to give a given component a prop for our context value.
// higher order components import React, {Fragment} from 'react' import hoistNonReactStatics from 'hoist-non-react-statics' import {Switch} from '../switch' const ToggleContext = React.createContext() class Toggle extends React.Component { static Consumer = ToggleContext.Consumer toggle = () => this.setState( ({on}) => ({on: !on}), () => this.props.onToggle(this.state.on), ) state = {on: false, toggle: this.toggle} render() { return ( <ToggleContext.Provider value={this.state} {...this.props} /> ) } } function withToggle(Component) { function Wrapper(props, ref) { return ( <Toggle.Consumer> {toggleContext => ( <Component toggle={toggleContext} {...props} ref={ref} /> )} </Toggle.Consumer> ) } Wrapper.displayName = `withToggle(${Component.displayName || Component.name})` return hoistNonReactStatics(React.forwardRef(Wrapper), Component) } const Layer1 = () => <Layer2 /> const Layer2 = withToggle(({toggle: {on}}) => ( <Fragment> {on ? 'The button is on' : 'The button is off'} <Layer3 /> </Fragment> )) const Layer3 = () => <Layer4 /> const Layer4 = withToggle(({toggle: {on, toggle}}) => ( <Switch on={on} onClick={toggle} /> )) function Usage({ onToggle = (...args) => console.log('onToggle', ...args), }) { return ( <Toggle onToggle={onToggle}> <Layer1 /> </Toggle> ) } Usage.title = 'Higher Order Components' export {Toggle, withToggle, Usage as default}
hoist-non-react-statics: Copies non-react specific statics from a child component to a parent component. Similar to Object.assign
, but with React static keywords prevented from being overridden.
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
2017-09-01 [D3] Adding Arrows to Links