React系列-Mixin、Hoc、Render props 和 Hook

284 阅读2分钟

面试了许多求职者,很多求职者只知其然,而不知所以然,写此文章为广大前端小伙伴指引迷津。纯干货!纯干货!纯干货!

目录

Mixin、Hoc、Render props 和 Hook

Mixin

是一种通过扩展收集功能的方式,它本质上是将一个对象的属性拷贝到另一个对象上面去,可以拷贝多个属性到一个对象上,为了解决代码复用问题。

var LogMixin = {
  log: function() {
    console.log('log');
  },
  componentDidMount: function() {
    console.log('in');
  },
  componentWillUnmount: function() {
    console.log('out');
  }
};

var User = React.createClass({
  mixins: [LogMixin],
  render: function() {
    return (<div>...</div>)
  }
});

var Goods = React.createClass({
  mixins: [LogMixin],
  render: function() {
    return (<div>...</div>)
  }
});
  • 缺点
    • Mixin 可能会相互依赖,相互耦合,不利于代码维护
    • 不同的 Mixin 中的方法可能会相互冲突
    • 现在大量使用 ES6 语法后,React.createClass 已经取消,这种方式也不再推荐
Hoc

React中用于复用组件逻辑的一种高级技巧。HOC 自身不是 React API 的一部分,它是一种基于 React 的组合特性而形成的设计模式。  (高阶组件是参数为组件,返回值为新组件的函数。)

const MouseHoc = (MouseComponent, props) => {
    props.text = props.text + "---I can operate props";
    return class extends React.Component {
        render() {
            return (
                <div style={{ height: "100%" }} onMouseMove={this.handleMouseMove}>
                    <MouseComponent {...props} mouse={this.state} />
                </div>
            );
        }
    };
};
MouseHoc(Mouse, {
    text: "some thing..."
});
  • 解决的问题

    • 高阶组件就是一个没有副作用的纯函数,各个高阶组件不会互相依赖耦合
    • 高阶组件也有可能造成冲突,但我们可以在遵守约定的情况下避免这些行为
    • 高阶组件并不关心数据使用的方式和原因,而被包裹的组件也不关心数据来自何处。高阶组件的增加不会为原组件增加负担
  • 存在的问题

    • HOC 需要在原组件上进行包裹或者嵌套,如果大量使用 HOC,将会产生非常多的嵌套,这让调试变得非常困难
    • 当存在多个 HOC 时,你不知道 Props 是从哪里来的。
Render props

通过一个名为“render”(属性名也可以不是 render,只要值是一个函数即可)的属性,该属性是一个函数,这个函数接受一个对象并返回一个子组件,会将这个函数参数中的对象作为 props 传入给新生成的组件。tip: 类似于vue插槽。

Hook

使用函数代替 class:为了解决 class 组件的一系列问题,比如 this 指向、绑定事件、自定义hook代替Hoc等等。质上就是一类有状态的特殊的函数。

减少状态逻辑复用的风险

避免Hoc地狱式嵌套

小白也是新手面试官,欢迎领导莅临指导工作,提出建议,小白不胜感激,不喜勿喷,点赞收藏随机送程序媛小姐姐一枚哦!!!