浅谈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之软键盘实现(js源码)
Jan 30 Javascript
一个JavaScript函数把URL参数解析成Json对象
Sep 24 Javascript
JavaScript+CSS实现的可折叠二级菜单实例
Feb 29 Javascript
详解JavaScript实现设计模式中的适配器模式的方法
May 18 Javascript
jQuery动态增减行的实例代码解析(推荐)
Dec 05 Javascript
jQuery基本选择器和层次选择器学习使用
Feb 27 Javascript
从零开始做一个pagination分页组件
Mar 15 Javascript
Javascript实现倒计时时差效果
May 18 Javascript
使用jQuery.Pin垂直滚动时固定导航
May 24 jQuery
Angular2管道Pipe及自定义管道格式数据用法实例分析
Nov 29 Javascript
详解Vue 全局引入bass.scss 处理方案
Mar 26 Javascript
vue图片裁剪插件vue-cropper使用方法详解
Dec 16 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
PHP小教程之实现双向链表
2014/06/12 PHP
Symfony2使用第三方库Upload制作图片上传实例详解
2016/02/04 PHP
PHP CURL实现模拟登陆并上传文件操作示例
2020/01/02 PHP
Laravel登录失败次数限制的实现方法
2020/08/26 PHP
js/ajax跨越访问-jsonp的原理和实例(javascript和jquery实现代码)
2012/12/27 Javascript
jQuery计算textarea中文字数(剩余个数)的小程序
2013/11/28 Javascript
Node.js开发之访问Redis数据库教程
2015/01/14 Javascript
使用Promise解决多层异步调用的简单学习心得
2016/05/17 Javascript
AngularJS中的包含详细介绍及实现示例
2016/07/28 Javascript
ionic进入多级目录后隐藏底部导航栏(tabs)的完美解决方案
2016/11/23 Javascript
基于javascript实现按圆形排列DIV元素(三)
2016/12/02 Javascript
bootstrap表格分页实例讲解
2016/12/30 Javascript
JS出现失效的情况总结
2017/01/20 Javascript
浅析bootstrap原理及优缺点
2017/03/19 Javascript
开发用到的js封装方法(20种)
2018/10/12 Javascript
vue图片上传本地预览组件使用详解
2019/02/20 Javascript
JavaScript一元正号运算符示例代码
2019/06/30 Javascript
vue中使用GraphQL的实例代码
2019/11/04 Javascript
linux平台使用Python制作BT种子并获取BT种子信息的方法
2017/01/20 Python
python实现K最近邻算法
2018/01/29 Python
使用python实现BLAST
2018/02/12 Python
python单例模式实例解析
2018/08/28 Python
Python中修改字符串的四种方法
2018/11/02 Python
如何使用repr调试python程序
2020/02/28 Python
520使用Python实现“我爱你”表白
2020/05/20 Python
浅析Python 责任链设计模式
2020/09/11 Python
纯css3显示隐藏一个div特效的具体实现
2014/02/10 HTML / CSS
关于毕业的广播稿
2014/01/10 职场文书
升国旗演讲稿
2014/09/05 职场文书
2015年社区工作总结
2015/04/08 职场文书
篮球拉拉队口号
2015/12/25 职场文书
《分数的意义》教学反思
2016/02/20 职场文书
2019最新劳动仲裁申请书!
2019/07/08 职场文书
使用numpy nonzero 找出非0元素
2021/05/14 Python
Python人工智能之混合高斯模型运动目标检测详解分析
2021/11/07 Python
Win11远程连接不上怎么办?Win11远程桌面用不了的解决方法
2022/08/05 数码科技