Mixins

NOTE: 使用 ES6 class 定义的组件已经不支持 mixin 了,因为使用 mixin
的场景都可以用组合组件这种模式来做到,参见 @dan_abramov/mixins-are-dead-long-live-higher-order-components-94a0d2f9e750#.xe4ubc7lu">Mixins Are Dead. Long Live
Composition

这里暂时留存这部分内容。


虽然组件的原则就是模块化,彼此之间相互独立,但是有时候不同的组件之间可能会共用一些功能,共享一部分代码。所以 React
提供了 mixins 这种方式来处理这种问题。

Mixin 就是用来定义一些方法,使用这个 mixin
的组件能够自由的使用这些方法(就像在组件中定义的一样),所以 mixin
相当于组件的一个扩展,在 mixin 中也能定义“生命周期”方法。

比如一个定时器的 mixin:

  1. var SetIntervalMixin = {
  2. componentWillMount: function() {
  3. this.intervals = [];
  4. },
  5. setInterval: function() {
  6. this.intervals.push(setInterval.apply(null, arguments));
  7. },
  8. componentWillUnmount: function() {
  9. this.intervals.map(clearInterval);
  10. }
  11. };
  12. var TickTock = React.createClass({
  13. mixins: [SetIntervalMixin], // Use the mixin
  14. getInitialState: function() {
  15. return {seconds: 0};
  16. },
  17. componentDidMount: function() {
  18. this.setInterval(this.tick, 1000); // Call a method on the mixin
  19. },
  20. tick: function() {
  21. this.setState({seconds: this.state.seconds + 1});
  22. },
  23. render: function() {
  24. return (
  25. <p>
  26. React has been running for {this.state.seconds} seconds.
  27. </p>
  28. );
  29. }
  30. });
  31. React.render(
  32. <TickTock />,
  33. document.getElementById('example')
  34. );

React 的 mixins 的强大之处在于,如果一个组件使用了多个 mixins,其中几个 mixins
定义了相同的“生命周期方法”,这些方法会在组件相应的方法执行完之后按 mixins
指定的数组顺序执行。