浅谈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 相关文章推荐
javaScript中两个等于号和三个等于号之间的区别介绍
Jun 27 Javascript
关于JavaScript的变量的数据类型的判断方法
Aug 14 Javascript
jQuery 1.9.1源码分析系列(十五)之动画处理
Dec 03 Javascript
JavaScript实现点击按钮就复制当前网址
Dec 14 Javascript
js放大镜放大购物图片效果
Jan 18 Javascript
js记录点击某个按钮的次数-刷新次数为初始状态的实例
Feb 15 Javascript
vue 中动态绑定class 和 style的方法代码详解
Jun 01 Javascript
vue和webpack安装命令详解
Jun 15 Javascript
vue .js绑定checkbox并获取、改变选中状态的实例
Aug 24 Javascript
vue动态删除从数据库倒入列表的某一条方法
Sep 29 Javascript
浅谈Vue.js中如何实现自定义下拉菜单指令
Jan 06 Javascript
js类的继承定义与用法分析
Jun 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实现12306火车票余票查询和价格查询(12306火车票查询)
2014/01/14 PHP
php输出1000以内质数(素数)示例
2014/02/16 PHP
php使用文本统计访问量的方法
2016/05/12 PHP
遍历指定目录,并存储目录内所有文件属性信息的php代码
2016/10/28 PHP
php实现的二分查找算法示例
2017/06/20 PHP
利用Homestead快速运行一个Laravel项目的方法详解
2017/11/14 PHP
php图片合成方法(多张图片合成一张)
2017/11/25 PHP
浅析PHP反序列化中过滤函数使用不当导致的对象注入问题
2020/02/15 PHP
JQquery的一些使用心得分享
2012/08/01 Javascript
JS、DOM和JQuery之间的关系示例分析
2014/04/09 Javascript
JavaScript设计模式之工厂方法模式介绍
2014/12/28 Javascript
jquery通过load获取文件的内容并跳到锚点的方法
2015/01/29 Javascript
NodeJS连接MongoDB数据库时报错的快速解决方法
2016/05/13 NodeJs
AngularJS实现网站换肤实例
2021/02/19 Javascript
详解Vue生命周期的示例
2017/03/10 Javascript
angular2 ng build部署后base文件路径问题详细解答
2017/07/15 Javascript
基于vue-ssr的静态网站生成器VuePress 初体验
2018/04/17 Javascript
Vue filter格式化时间戳时间成标准日期格式的方法
2018/09/16 Javascript
vue router 源码概览案例分析
2018/10/09 Javascript
nodejs中方法和模块用法示例
2018/12/24 NodeJs
ES6中Set和Map数据结构,Map与其它数据结构互相转换操作实例详解
2019/02/28 Javascript
JS实现利用闭包判断Dom元素和滚动条的方向示例
2019/08/26 Javascript
nodejs语言实现验证码生成功能的示例代码
2019/10/13 NodeJs
JS常见错误(Error)及处理方案详解
2020/07/02 Javascript
Python使用Mechanize模块编写爬虫的要点解析
2016/03/31 Python
Python实现的旋转数组功能算法示例
2019/02/23 Python
Pycharm简单使用教程(入门小结)
2019/07/04 Python
如何基于Python创建目录文件夹
2019/12/31 Python
深入浅析Python 命令行模块 Click
2020/03/11 Python
图解Python中深浅copy(通俗易懂)
2020/09/03 Python
WoolOvers澳洲官方网站:英国针织服装公司
2018/05/13 全球购物
50道外企软件测试面试题
2014/08/18 面试题
2015年教导处教学工作总结
2015/07/22 职场文书
2016预备党员培训心得体会
2016/01/08 职场文书
2016年中学清明节活动总结
2016/04/01 职场文书
vue中控制mock在开发环境使用,在生产环境禁用方式
2022/04/06 Vue.js