React高阶组件替代Mixins

前端之家收集整理的这篇文章主要介绍了React高阶组件替代Mixins前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

React高阶组件替代Mixins

minins将死,ES6的Class不对其进行支持,HOC就是解决办法。

那什么是高级组件?首先你得先了解请求ES6中的class只是语法糖,本质还是原型继承。能够更好的进行说明,我们将不会修改组件代码。而是通过提供一些能够包裹组件组件, 并通过一些额外的功能来增强组件。这样的组件我们称之为高阶组件(Higher-Order Component)。

ES7中的新特性decorator(装饰器)就是使用高阶组件模式,transform-decorators-legacy是目前babel插件转换decorator的,可以研究下。下面看下如何实现React的PureRender功能(高阶组件和decorator一起讲解)。

PureRenderDecorator,decorator其实就是一个高阶组件。

  1. import _ from 'lodash';
  2.  
  3. function shallowEqual(objA,objB) {
  4. if (objA === objB) {
  5. return true;
  6. }
  7.  
  8. if (typeof objA !== 'object' || objA === null || typeof objB !== 'object' || objB === null) {
  9. return false;
  10. }
  11.  
  12. const keysA = Object.keys(objA);
  13. const keysB = Object.keys(objB);
  14.  
  15. if (keysA.length !== keysB.length) {
  16. return false;
  17. }
  18.  
  19. const bHasOwnProperty = hasOwnProperty.bind(objB);
  20. for (let i = 0; i < keysA.length; i++) {
  21. const keyA = keysA[i];
  22.  
  23. if (objA[keyA] === objB[keyA]) {
  24. continue;
  25. }
  26.  
  27. // special diff with Array or Object
  28. if (_.isArray(objA[keyA])) {
  29. if (!_.isArray(objB[keyA]) || objA[keyA].length !== objB[keyA].length) {
  30. return false;
  31. } else if (!_.isEqual(objA[keyA],objB[keyA])) {
  32. return false;
  33. }
  34. } else if (_.isPlainObject(objA[keyA])) {
  35. if (!_.isPlainObject(objB[keyA]) || !_.isEqual(objA[keyA],objB[keyA])) {
  36. return false;
  37. }
  38. } else if (!bHasOwnProperty(keysA[i]) || objA[keysA[i]] !== objB[keysA[i]]) {
  39. return false;
  40. }
  41. }
  42.  
  43. return true;
  44. }
  45.  
  46.  
  47. function shallowCompare(instance,nextProps,nextState) {
  48. return !shallowEqual(instance.props,nextProps) || !shallowEqual(instance.state,nextState);
  49. }
  50.  
  51. function shouldComponentUpdate(nextProps,nextState) {
  52. return shallowCompare(this,nextState);
  53. }
  54. /* eslint-disable no-param-reassign */
  55. function pureRenderDecorator(component) {
  56. //覆盖了component中的shouldComponentUpdate方法
  57. component.prototype.shouldComponentUpdate = shouldComponentUpdate;
  58. return component;//Decorator不用返回,直接使用高阶组件需要return
  59. }
  60. /*****
  61. *使用ES6 class 语法糖如下,decorator的没试过,decorator请使用上面的,不要return
  62. *let pureRenderDecorator = component => class {
  63. * constructor(props) {
  64. * super(props);
  65. * component.prototype.shouldComponentUpdate = shouldComponentUpdate;
  66. * }
  67. * render(){
  68. * var Component = component;//自定义组件使用时要大写
  69. * return (
  70. * <Component {...this.props}/>
  71. * )
  72. * }
  73. *}
  74. ******/
  75. export { shallowEqual };
  76. export default pureRenderDecorator;

如何使用?假设要使用的组件是Test

  • 直接使用

    1. import React from 'react';
    2. import { pureRenderDecorator } from "./pureRenderDecorator";
    3.  
    4. class Test extends React.Component {
    5. // component code here
    6. }
    7. export default pureRenderDecorator(Test)

  • 通过decorator

    1. import React from 'react';
    2. import { pureRenderDecorator } from "./pureRenderDecorator";
    3.  
    4. @pureRenderDecorator
    5. export default class Test extends React.Component {
    6. // component code here
    7. }

猜你在找的React相关文章