浅谈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 相关文章推荐
基于Jquery 解决Ajax请求的页面 浏览器后退前进功能,页面刷新功能实效问题
Dec 11 Javascript
js绑定事件this指向发生改变的问题解决方法
Apr 23 Javascript
JavaScript中toString()方法的使用详解
Jun 05 Javascript
JQuery中ajax方法访问web服务实例
Jul 18 Javascript
两种js监听滚轮事件的实现方法
May 13 Javascript
js对字符串进行编码的方法总结(推荐)
Nov 10 Javascript
Node.js用readline模块实现输入输出
Dec 16 Javascript
JavaScript canvas实现围绕旋转动画
Nov 18 Javascript
vue根据值给予不同class的实例
Sep 29 Javascript
浅谈JavaScript 代码简洁之道
Jan 09 Javascript
vue两组件间值传递 $router.push实现方法
May 15 Javascript
微信小程序button标签open-type属性原理解析
Jan 21 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 文件上传代码(限制jpg文件)
2010/01/05 PHP
php设计模式 Observer(观察者模式)
2011/06/26 PHP
php解决安全问题的方法实例
2019/09/19 PHP
javascript 延迟加载技术(lazyload)简单实现
2011/01/17 Javascript
背景图跟随鼠标移动的Mootools插件实现代码
2011/12/12 Javascript
JQuery操作tr和td内容的方法实例
2013/03/06 Javascript
JavaScript继承基础讲解(原型链、借用构造函数、混合模式、原型式继承、寄生式继承、寄生组合式继承)
2014/08/16 Javascript
javascript入门教程基础篇
2015/11/16 Javascript
移动端滑动插件Swipe教程
2016/10/16 Javascript
webpack4 SplitChunks实现代码分隔详解
2019/05/23 Javascript
vue动态注册组件实例代码详解
2019/05/30 Javascript
keep-Alive搭配vue-router实现缓存页面效果的示例代码
2020/06/24 Javascript
[51:11]2014 DOTA2国际邀请赛中国区预选赛5.21 LGD-CDEC VS DT
2014/05/22 DOTA
[02:58]献给西雅图的情书_高清
2014/05/29 DOTA
修改Python的pyxmpp2中的主循环使其提高性能
2015/04/24 Python
浅谈python字典多键值及重复键值的使用
2016/11/04 Python
教你用 Python 实现微信跳一跳(Mac+iOS版)
2018/01/04 Python
python装饰器-限制函数调用次数的方法(10s调用一次)
2018/04/21 Python
python分块读取大数据,避免内存不足的方法
2018/12/10 Python
python scatter散点图用循环分类法加图例
2019/03/19 Python
pandas删除指定行详解
2019/04/04 Python
解决Pytorch训练过程中loss不下降的问题
2020/01/02 Python
python3 kubernetes api的使用示例
2021/01/12 Python
各大浏览器 CSS3 和 HTML5 兼容速查表 图文
2010/04/01 HTML / CSS
将HTML5 Canvas的内容保存为图片借助toDataURL实现
2013/05/20 HTML / CSS
美国手机支架公司:PopSockets
2019/11/27 全球购物
JD Sports澳洲官网:英国领先的运动鞋和运动时尚零售商
2020/02/15 全球购物
将"引用"作为函数参数有哪些特点
2013/04/05 面试题
初二政治教学反思
2014/01/12 职场文书
银行员工辞职信范文
2014/01/20 职场文书
建设投标担保书
2014/05/13 职场文书
承租经营合作者协议书
2014/10/01 职场文书
2015年医院后勤工作总结
2015/05/20 职场文书
本科毕业论文答辩稿
2015/06/23 职场文书
员工工作失职检讨书范文!
2019/07/03 职场文书
如何把新闻人物写得立体、鲜活?
2019/08/14 职场文书