浅谈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 相关文章推荐
js no-repeat写法 背景不重复
Mar 18 Javascript
原生javascript实现图片轮播效果代码
Sep 03 Javascript
js用typeof方法判断undefined类型
Jul 15 Javascript
使用jquery.qrcode生成彩色二维码实例
Aug 08 Javascript
innerHTML在IE中报错解决方案
Dec 15 Javascript
基于javascript显示当前时间以及倒计时功能
Mar 18 Javascript
js实现各种复制到剪贴板的方法(分享)
Oct 27 Javascript
Angular开发者指南之入门介绍
Mar 05 Javascript
JS实现处理时间,年月日,星期的公共方法示例
May 31 Javascript
JS继承定义与使用方法简单示例
Feb 19 Javascript
vue与iframe之间的信息交互的实现
Apr 08 Javascript
vue集成一个支持图片缩放拖拽的富文本编辑器
Jan 29 Vue.js
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
德劲1104的电路分析与改良
2021/03/01 无线电
php 判断网页是否是utf8编码的方法
2014/06/06 PHP
php发送http请求的常用方法分析
2016/11/08 PHP
Yii2 中实现单点登录的方法
2018/03/09 PHP
Javascript 遮罩层和加载效果代码
2013/08/01 Javascript
用javascript判断IE版本号简单实用且向后兼容
2013/09/11 Javascript
详解AngularJS中自定义指令的使用
2015/06/17 Javascript
jQuery实现的Div窗口震动效果实例
2015/08/07 Javascript
javascript实现图片左右滚动效果【可自动滚动,有左右按钮】
2016/09/19 Javascript
快速解决js中window.location.href不工作的问题
2016/11/02 Javascript
NodeJS爬虫实例之糗事百科
2017/12/14 NodeJs
详解通过源码解析Node.js中cluster模块的主要功能实现
2018/05/16 Javascript
Vue三种常用传值示例(父传子、子传父、非父子)
2018/07/24 Javascript
[02:09]EHOME夺得首届辉夜杯冠军—现场颁奖仪式
2015/12/28 DOTA
[00:15]TI9观赛名额抽取
2019/07/10 DOTA
python中合并两个文本文件并按照姓名首字母排序的例子
2014/04/25 Python
Python类的动态修改的实例方法
2017/03/24 Python
Python IDLE入门简介
2017/12/08 Python
使用pandas批量处理矢量化字符串的实例讲解
2018/07/10 Python
Python 一句话生成字母表的方法
2019/01/02 Python
对python列表里的字典元素去重方法详解
2019/01/21 Python
对Django中的权限和分组管理实例讲解
2019/08/16 Python
python3 selenium自动化 下拉框定位的例子
2019/08/23 Python
Macbook安装Python最新版本、GUI开发环境、图像处理、视频处理环境详解
2020/02/17 Python
python实现程序重启和系统重启方式
2020/04/16 Python
win7上tensorflow2.2.0安装成功 引用DLL load failed时找不到指定模块 tensorflow has no attribute xxx 解决方法
2020/05/20 Python
Python使用itcaht库实现微信自动收发消息功能
2020/07/13 Python
python 基于UDP协议套接字通信的实现
2021/01/22 Python
美国修容界大佬创建的个人美妆品牌:Kevyn Aucoin Beauty
2018/12/12 全球购物
后勤人员自我评价怎么写
2013/09/19 职场文书
社区安全生产月活动总结
2014/07/05 职场文书
优秀中职教师事迹材料
2014/08/26 职场文书
2014年团支书工作总结
2014/11/14 职场文书
个人工作能力自我评价
2015/03/05 职场文书
停电放假通知
2015/04/14 职场文书
小学运动会前导词
2015/07/20 职场文书