枞阳做网站的,网站建设与网页制作教程,wordpress 全屏幻灯片,建站优化全包1. 是什么
高阶函数(Higher-order function),至少满足下列一个条件的函数
接受一个或多个函数作为输入输出一个函数
在React中#xff0c;高阶组件即接受一个或多个组件作为参数并且返回一个组件#xff0c;本质也就是一个函数#xff0c;并不是一个组件
const Enhanced…1. 是什么
高阶函数(Higher-order function),至少满足下列一个条件的函数
接受一个或多个函数作为输入输出一个函数
在React中高阶组件即接受一个或多个组件作为参数并且返回一个组件本质也就是一个函数并不是一个组件
const EnhancedComponent highOrderComponent(WrappedComponent);上述代码中该函数接受一个组件WrappedComponent作为参数返回加工过的新组件EnhancedComponent 高阶组件的这种实现方式本质上是一个装饰者设计模式
2. 如何编写
最基本的高阶组件的编写模版如下
import React, { Component } from react;
export default (WrappedComponent) {return class EnhancedComponent extends Component {// do somethingrender() {return WrappedComponent /; }}
}通过对传入的原始组件WrappedComponent做一些你想要的操作(比如操作props,提取state,给原始组件包裹其他元素等),从而加工出想要的组件EnhancedComponent把通用的逻辑放在高阶组件中对组件实现一致的处理从而实现代码的复用 所以高阶组件的主要功能是封装并分离组件的通用逻辑让通用逻辑在组件间更好地被复用但在使用高阶组件的同时一般遵循一些约定如下
props保持一致你不能在函数式(无状态)组件上使用ref属性因为它没有实例不要以任何方式改变原始组件WrappedComponent透传不相关props属性给被包裹的组件WrappedComponent不要再render()方法中使用高阶组件使用compose组合高阶组件包装显示名字以便于调试 这里需要注意的是高阶组件可以传递所有的props ,但是不能传递ref 如果向一个高阶组件添加refs引用那么 ref指向的是最外层容器组件实例的而不是被包裹的组件如果需要传递refs的话则使用React.forwardRef ,如下
function withLogging(WrappedComponent) {class Enhance extends WrappedComponent {componentWillReceiveProps() {console.log(Current props, this.props);console.log(Next props, nextProps); }render() {const {forwardedRef, ...rest} this.props;// forwardedRef refreturn WrappedComponent {...rest} ref{forwardedRef} /; } };// React.forwardRef props ref // ref React.forwardRef function forwardRef(props, ref) {return Enhance {...props} forwardRef{ref} /}return React.forwardRef(forwardRef);
}
const EnhancedComponent withLogging(SomeComponent);3. 应用场景 通过上面的了解高阶组件能够提高代码的复用性和灵活性在实际应用中常常用于与核心业务无关但又在多个模块使用的功能如权限控制、日志记录、数据校验、异常处理、统计上报等举个例子存在一个组件需要从缓存中获取数据然后渲染。