写点什么

1 分钟带你入门 React 公共逻辑抽离 HOC...

用户头像
Leo
关注
发布于: 2020 年 10 月 21 日
1分钟带你入门 React 公共逻辑抽离HOC...

前言: 看到这标题你会想到什么 ? HOC ? Render Props ? 自定义Hooks ? mixin ? 哈哈, mixin 已经被React抛弃了,今天由我来个给你们理清这些看似高深的概念



HOC



High Order Component 高阶组件,它就是一个函数,你传入一个组件,然后它把公共逻辑复制到你传入的组件,然后再把这个加工好的组件返回给你用,从而达到公共逻辑复用的目的

听起来是不是像一个模具加工装置,说来就是工厂模式而已



function FactoryHOC(Component) {
class Hoc extends React.Component {
state = {
x: undefined,
y: undefined
}
render() {
return <div onMouseMove={e => {
this.setState({
x: e.clientX,
y: e.clientY
})
}}>
// {...this.props} 完全代理出去
<Component {...this.props} x={this.state.x} y={this.state.y}></Component>
</div>
}
}
return Hoc
}
const Mouse = FactoryHOC((props) => <div>mouse{props.x}{props.y}</div>)
  • 这里需要注意的是要把props传给所传入的Component组件

Render Props

function FactoryFunction(props) {
const [pos, setPos] = useState({ x: '', y: '' })
return <div onMouseMove={e => {
setPos({ x: e.clientX, y: e.clientY })
}}>
<h1>Function Component</h1>
{props.fn(pos)}
</div>
}
export default class extends React.Component {
render() {
return <>
<h1>HOC Component</h1>
...
<FactoryFunction fn={({ x, y }) => <h2>fn Component x:{x} y:{y}</h2>}></FactoryFunction>
</>
}
}
  • Render Porps 的方式是在props上传入一个函数,这函数返回的是React.Element

  • 然后在这个公共组件内将它渲染出来,已到达复用的作用

你可以参考这份ToDoList代码

自定义Hooks

function useMouse() {
const [pos, setPos] = useState({ x: "", y: "" });
return {
...pos,
onMouseMove(e) { // 将鼠标移动这个功能封装起来
setPos({ x: e.clientX, y: e.clientY });
},
};
}
function MouseHook() {
const { x, y, onMouseMove } = useMouse();
return (
<div>
<h2>Use Hook </h2>
<p onMouseMove={onMouseMove}> // 直接挂载onMouseXXX
hooks component X:{x} Y:{y}
</p>
</div>
);
}

小结

  • HOC这种设计模式相对于Render Props来说更加的通用,后者应该是React特有的功能

  • HOC有点的像黑盒的模式,你不清楚里面会有啥;另外需要注意props的完全代理,否则数据流就断层了!

  • Render Props像白盒模式,你渲染的是啥,传入的是啥都能第一眼的看到

  • 随着React Hooks的重磅推出,公共逻辑的抽离可以说更加的轻便,而且容易维护测试

参考:

发布于: 2020 年 10 月 21 日阅读数: 48
用户头像

Leo

关注

读书点亮生活, 2019.01.16 加入

Polo MI

评论

发布
暂无评论
1分钟带你入门 React 公共逻辑抽离HOC...