浅谈React中组件间抽象


Posted in Javascript onJanuary 27, 2018

关于今天要学习的组件间抽象其实我这小白看了几次还没弄明白,这次决定一探究竟。在组件构建中,通常有一类功能需要被不同的组件公用,此时就涉及抽象的概念,在React中我们主要了解mixin和高阶组件。

mixin

mixin的特性广泛存在于各个面向对象语言中,在ruby中,include关键词就是mixin,是将一个模块混入到另外一个模块中,或者是类中。

封装mixin方法

const mixin = function(obj, mixins) {
 const newObj = obj
 newObj.prototype = Object.create(obj.prototype)

 for(let props in mixins) {
  newObj.prototype[props] = mixins[props]
 }

 return newObj
}

const BigMixin = {
 fly: () => {
  console.log('i can fly')
 }
}

const Big = function() {
 console.log('new big')
}

const FlyBig = mixin(Big , BigMixin)

const flyBig = new FlyBig()
FlyBig.fly() //'i can fly'

对于广义的mixin方法,就是用赋值的方式将mixin对象里的方法都挂载到原对象上去,来实现对对象的混入。

React中的mixin

React在使用createClass构建组件时提供了mixin属性,如官方的PureRenderMixin:

import React from 'react'
import PureRenderMixin from 'react-addons-pure-render-mixin'
React.createClass({
  mixins: [PureRenderMixin]
  
  render() {
    return <div>foo</foo>
  }
})

在createClass对象参数中传入数组mixins,里面封装了我们所需要的模块,mixins数组也可以增加多个mixin,其每一个mixin方法之间的有重合,对于普通方法和生命周期方法是有所区分的。

在不同的mixin里实现两个名字一样的普通方法,在React中是不会被覆盖的,会在控制台中报一个ReactClassInterface里的错误,指出你尝试在组件中多次定义一个方法。**因此在React中是不允许出现崇明普通方法的mixins,如果是React生命周期定义的方法,则会将各个模块的生命周期方法叠加在一起顺序执行**。

我们看到使用createClass的mixin为组价做了两件事情:

1. 工具方法:为组件共享了一些工具类方法,可以在各个组件中使用。

2. 生命周期继承:props和state合并,mixin能够合并生命周期方法,如果有很多mixin来定义componentDidMount这个周期,

那么React会非常智能的将他们合并一起执行。

ES6 CLASS和decorator

现在我们比较推崇使用es6 class方法去构建组件,但是它并不支持mixin。官方文档中也没有给出很好的办法。

decorator是ES 7 中定义的特性,和Java中的注解相似。decorator是运用在运行时的方法,在redux或者其他应用层框架中,越来越多的使用decorator实现对组件的装饰。

core-decorator库为开发者提供了一些实用的decorator,其中实现了我们正想要的@mixin。它将每个mixin对象的方法都叠加到target对象的原型上以达到mixin的目的。

import React, { Component } from 'react'
import { mixin } from 'core-decorator'

const PuerRender = {
  setTheme()
}

const Them = {
  setTheme()
}

@mixin(PuerRender, Them)
class MyComponent extends Component {
  render() {...}
}

如上decorator只是作用在类上面的,还有作用在方法上面的,它可以控制方法的自有属性。

注意:react 0.14开始剥离mixin

mixin的问题

破坏了原有组件的封装

mixin方法可以混入方法给组件带来新的特性,也会带来新的props和state,这意味着有些不可见的状态需要我们去维护。mixin也有可能存在相互依赖,这样形式依赖链,相互之间会影响。

  1. 命名冲突
  2. 增加复杂性

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
两种WEB下的模态对话框 (asp.net或js的分别实现)
Dec 02 Javascript
open 动态修改img的onclick事件示例代码
Nov 13 Javascript
点击标签切换和自动切换DIV选项卡
Aug 10 Javascript
jQuery的ready方法详解
Nov 27 Javascript
javascript编写实用的省市选择器
Feb 12 Javascript
JavaScript实现点击单元格改变背景色的方法
Feb 12 Javascript
ES6的新特性概览
Mar 10 Javascript
把普通对象转换成json格式的对象的简单实例
Jul 04 Javascript
js设置和获取自定义属性的方法
Oct 20 Javascript
详解React项目的服务端渲染改造(koa2+webpack3.11)
Mar 19 Javascript
Vue多组件仓库开发与发布详解
Feb 28 Javascript
vue实现短信验证码登录功能(流程详解)
Dec 10 Javascript
React Native中NavigatorIOS组件的简单使用详解
Jan 27 #Javascript
ejsExcel模板在Vue.js项目中的实际运用
Jan 27 #Javascript
使用D3.js创建物流地图的示例代码
Jan 27 #Javascript
javascript获取图片的top N主色值方法详解
Jan 26 #Javascript
Vue中render方法的使用详解
Jan 26 #Javascript
Angular利用trackBy提升性能的方法
Jan 26 #Javascript
微信小程序版翻牌小游戏
Jan 26 #Javascript
You might like
PHP+javascript模拟Matrix画面
2006/10/09 PHP
PHP5.3.1 不再支持ISAPI
2010/01/08 PHP
求PHP数组最大值,最小值的代码
2011/10/31 PHP
php ZipArchive压缩函数详解实例
2013/11/06 PHP
YiiFramework入门知识点总结(图文教程)
2015/12/28 PHP
YII Framework框架教程之安全方案详解
2016/03/14 PHP
PHP实现上传图片到 zimg 服务器
2016/10/19 PHP
PHP实现双链表删除与插入节点的方法示例
2017/11/11 PHP
laravel中短信发送验证码的实现方法
2018/04/25 PHP
firefox 和 ie 事件处理的细节,研究,再研究 书写同时兼容ie和ff的事件处理代码
2007/04/12 Javascript
jquery 页面滚动到指定DIV实现代码
2013/09/25 Javascript
让javascript加载速度倍增的方法(解决JS加载速度慢的问题)
2014/12/12 Javascript
JS取模、取商及取整运算方法示例
2016/10/13 Javascript
VueAwesomeSwiper在VUE中的使用以及遇到的一些问题
2018/01/11 Javascript
浅谈vue项目如何打包扔向服务器
2018/05/08 Javascript
如何使用pm2快速将项目部署到远程服务器
2019/03/12 Javascript
[19:59]2014DOTA2国际邀请赛 IG战队纪录片
2014/08/07 DOTA
[41:08]TNC vs VG 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
Python中的特殊语法:filter、map、reduce、lambda介绍
2015/04/14 Python
Python中实现三目运算的方法
2015/06/21 Python
举例详解Python中yield生成器的用法
2015/08/05 Python
python爬虫的工作原理
2017/03/05 Python
Python编程实现正则删除命令功能
2017/08/30 Python
Pyqt5 实现跳转界面并关闭当前界面的方法
2019/06/19 Python
Win10下Python3.7.3安装教程图解
2019/07/08 Python
Python 3.8正式发布重要新功能一览
2019/10/17 Python
PyTorch中反卷积的用法详解
2019/12/30 Python
快速解决jupyter启动卡死的问题
2020/04/10 Python
pyecharts动态轨迹图的实现示例
2020/04/17 Python
python爬虫中的url下载器用法详解
2020/11/30 Python
The North Face官方旗舰店:美国著名户外品牌
2020/09/28 全球购物
介绍一下MYSQL常用的优化技巧
2012/10/25 面试题
大学四年的个人自我评价
2014/01/14 职场文书
行政人事专员岗位职责
2014/03/05 职场文书
售后服务承诺函格式
2015/01/21 职场文书
面试复试通知单
2015/04/24 职场文书