1. with 开头是 class的高阶组件命名规范
  2. use 开头是 hooks的命名规范
  3. 都是操作函数
  4. 高阶组件案例
    1. react-redux
    2. react-router
  5. 高阶组件很简单,就是函数传入的参数是个组件
    1. 返回值也是一个组件
  1. const hoc = higherOrder(wrappedComponent)
  2. const EnhancedComponent = higherOrderComponent(WrappedComponent)

HOC

  1. HOC就是返回值是组件的函数
  2. 通过组件嵌套的方式,赋予组件更多的功能
  3. 高阶组件文档 https://zh-hans.reactjs.org/docs/higher-order-components.html
    1. 本质就是 AOP,面向切片编程

高阶组件的好处

  1. 抽取重复代码,实现组件复用
  2. 条件渲染,控制组件的渲染逻辑,渲染劫持
  3. 捕获、劫持被处理组件的生命周期

高阶组件模板

  1. import React from 'react'
  2. function withAddToCart (ChildComponent: React.ComponentType) {
  3. // return class组件
  4. return class extends React.Component {}
  5. // return hooks
  6. return props => {
  7. return <ChildComponent {...props}/>
  8. }
  9. }

购物车高阶组件

withAddToCart

  1. import React from 'react'
  2. function withAddToCart (ChildComponent: React.ComponentType) {
  3. // return class组件
  4. return class extends React.Component {}
  5. return (props) => {
  6. const setState = useContext(appSetStateContext)
  7. const addToCart = (id, name) => {
  8. if (setState) {
  9. setState((state) => {
  10. return {
  11. ...state,
  12. shoppingCart: {
  13. items: [...state.shoppingCart.items, { id, name }],
  14. },
  15. };
  16. });
  17. }
  18. }
  19. return <ChildComponent {...props} addToCart={addToCart} />
  20. };
  21. }
  22. export default withAddToCart

useAddToCart

  1. import React, { useContext } from 'react'
  2. import {SetStateContext} from './context.js'
  3. function useAddToCart (ChildComponent: React.ComponentType) {
  4. const setState = useContext(SetStateContext)
  5. return function addToCart({id, name, desc}) {
  6. if (!setState) return
  7. setState(state => {
  8. return {
  9. ...state,
  10. shoppingCart: {
  11. items: [
  12. ...state.shoppingCart.items,
  13. {id, name, desc}
  14. ]
  15. }
  16. }
  17. })
  18. }
  19. }
  20. export default useAddToCart