加入收藏 | 设为首页 | 会员中心 | 我要投稿 核心网 (https://www.hxwgxz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 建站 > 正文

【React深入】从Mixin到HOC再到Hook

发布时间:2019-04-12 00:11:42 所属栏目:建站 来源:ConardLi
导读:导读 前端发展速度非常之快,页面和组件变得越来越复杂,如何更好的实现状态逻辑复用一直都是应用程序中重要的一部分,这直接关系着应用程序的质量以及维护的难易程度。 本文介绍了React采用的三种实现状态逻辑复用的技术,并分析了他们的实现原理、使用方
副标题[/!--empirenews.page--]

导读

前端发展速度非常之快,页面和组件变得越来越复杂,如何更好的实现状态逻辑复用一直都是应用程序中重要的一部分,这直接关系着应用程序的质量以及维护的难易程度。

本文介绍了React采用的三种实现状态逻辑复用的技术,并分析了他们的实现原理、使用方法、实际应用以及如何选择使用他们。

本文略长,下面是本文的思维导图,您可以从头开始阅读,也可以选择感兴趣的部分阅读:

【React深入】从Mixin到HOC再到Hook

Mixin设计模式

Mixin(混入)是一种通过扩展收集功能的方式,它本质上是将一个对象的属性拷贝到另一个对象上面去,不过你可以拷贝任意多个对象的任意个方法到一个新对象上去,这是继承所不能实现的。它的出现主要就是为了解决代码复用问题。

很多开源库提供了Mixin的实现,如Underscore的_.extend方法、JQuery的extend方法。

使用_.extend方法实现代码复用:

  1. var LogMixin = {  
  2.   actionLog: function() {  
  3.     console.log('action...');  
  4.   },  
  5.   requestLog: function() {  
  6.     console.log('request...');  
  7.   },  
  8. };  
  9. function User() {  /*..*/  }  
  10. function Goods() {  /*..*/ }  
  11. _.extend(User.prototype, LogMixin);  
  12. _.extend(Goods.prototype, LogMixin);  
  13. var user = new User();  
  14. var good = new Goods();  
  15. user.actionLog();  
  16. good.requestLog(); 

我们可以尝试手动写一个简单的Mixin方法:

  1. function setMixin(target, mixin) {  
  2.   if (arguments[2]) {  
  3.     for (var i = 2, len = arguments.length; i < len; i++) {  
  4.       target.prototype[arguments[i]] = mixin.prototype[arguments[i]];  
  5.     }  
  6.   }  
  7.   else {  
  8.     for (var methodName in mixin.prototype) {  
  9.       if (!Object.hasOwnProperty(target.prototype, methodName)) {  
  10.         target.prototype[methodName] = mixin.prototype[methodName];  
  11.       }  
  12.     }  
  13.   }  
  14. }  
  15. setMixin(User,LogMixin,'actionLog');  
  16. setMixin(Goods,LogMixin,'requestLog'); 

您可以使用setMixin方法将任意对象的任意方法扩展到目标对象上。

React中应用Mixin

React也提供了Mixin的实现,如果完全不同的组件有相似的功能,我们可以引入来实现代码复用,当然只有在使用createClass来创建React组件时才可以使用,因为在React组件的es6写法中它已经被废弃掉了。

例如下面的例子,很多组件或页面都需要记录用户行为,性能指标等。如果我们在每个组件都引入写日志的逻辑,会产生大量重复代码,通过Mixin我们可以解决这一问题:

  1. var LogMixin = {  
  2.   log: function() {  
  3.     console.log('log');  
  4.   },  
  5.   componentDidMount: function() {  
  6.     console.log('in');  
  7.   },  
  8.   componentWillUnmount: function() {  
  9.     console.log('out');  
  10.   }  
  11. }; 
  12. var User = React.createClass({  
  13.   mixins: [LogMixin],  
  14.   render: function() {  
  15.     return (<div>...</div>)  
  16.   }  
  17. });  
  18. var Goods = React.createClass({  
  19.   mixins: [LogMixin],  
  20.   render: function() {  
  21.     return (<div>...</div>)  
  22.   }  
  23. }); 

Mixin带来的危害

(编辑:核心网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读