关于组件公共逻辑的抽离
- mixin,已被React弃用
- 高阶组件HOC
- Render Props
什么是高阶组件
高阶组件就是一个函数,传给它一个组件,它返回一个新的组件。新的组件使用传入的组件作为子组件。
高阶组件的作用是用于代码复用,可以把组件之间可复用的代码、逻辑抽离到高阶组件当中。新的组件和传入的组件通过 props 传递信息。
HOC
import React from 'react'// 高阶组件const withMouse = (Component) => {class withMouseComponent extends React.Component {constructor(props) {super(props)this.state = { x: 0, y: 0 }}handleMouseMove = (event) => {this.setState({x: event.clientX,y: event.clientY})}render() {return (<div style={{ height: '500px' }} onMouseMove={this.handleMouseMove}>{/* 1. 透传所有 props 2. 增加 mouse 属性 */}<Component {...this.props} mouse={this.state}/></div>)}}return withMouseComponent}const App = (props) => {const { x, y } = props.mouse // 接收 mouse 属性return (<div style={{ height: '500px' }}><h1>The mouse position is ({x}, {y})</h1></div>)}export default withMouse(App) // 返回高阶函数
Render Props
render props的核心思想通过一个函数将class组件的state作为props传递给纯函数组件
import React from 'react'import PropTypes from 'prop-types'class Mouse extends React.Component {constructor(props) {super(props)this.state = { x: 0, y: 0 }}handleMouseMove = (event) => {this.setState({x: event.clientX,y: event.clientY})}render() {return (<div style={{ height: '500px' }} onMouseMove={this.handleMouseMove}>{/* 将当前 state 作为 props ,传递给 render (render 是一个函数组件) */}{this.props.render(this.state)}{/* 或者 */}{/* {this.props.children(this.state)} */}</div>)}}Mouse.propTypes = {render: PropTypes.func.isRequired // 必须接收一个 render 属性,而且是函数}const App = (props) => (<div style={{ height: '500px' }}><Mouse render={/* render 是一个函数组件 */({ x, y }) => <h1>The mouse position is ({x}, {y})</h1>}/>{/*或者*/}{/*<Mouse>{(x,y)=><h1>The mouse position is ({x}, {y})</h1>}</Mouse>*/}</div>)/*** 即,定义了 Mouse 组件,只有获取 x y 的能力。* 至于 Mouse 组件如何渲染,App 说了算,通过 render prop 的方式告诉 Mouse 。*/export default App
HOC vs Render Props
- HOC:模式简单,但会增加组件层级
- Render Props:代码简洁,学习成本较高
- 按需使用
