React组件抽象(一): mixin
React组件抽象(一)-Mixin
写业务组件的时候常常会有一些功能反复被不同的组件公用,这时候就需要取出相同部分功能,这个过程涉及组件抽象。抽象方式有许多种,如高阶组件(High-order components)
和mixin
。
一、MIxin是什么,为什么要使用Mixin
一些古老的面向对象的语言,如C++,有个很强大但是很危险的功能:多重继承
。
多重继承
举个例子:
有个程序员写了一本书,那我们可以称这位程序员为作家。
以下例子使用类似JavaScript的语法,因为C++我已经忘记了。
class Person{name = "人类"writing(){// 用笔写字}
}
class Writer extends Person{name = "作家"writing(){// 写文章}
}
class Coder extends Person{name = "程序员"writing(){//写代码}
}
张三恰好是程序员作家,于是继承了两个类
class ZhangSan extends Writer,Coder{}
那么问题来了,当张三writing的时候写代码还是写文章?这就是弊端二义性
。如果类数量多了,那将会很难受。当然处理方法是有,主要是麻烦。Java等语言为了规避这么麻烦的事情又要使用继承,出了interface
接口。
继承接口
Java允许继承多个接口,如
public class ZhangSan extends Person implements WriterInterface,CoderInterface{}
接口内部不会有实现,子类必须实现interface的方法除非是Abstract
。这样就防止了二义性的发生。
然而,其他一些语言引入了其他的方式:mixin
mixin
通过改变prototype的一些属性来给组件注入新的能力。
直接直接举个栗子吧
const mixin = (clazz,plugins) =>{Object.entires(clazz).forEach(plugin =>{const [key,value] = plugin;clazz.prototype[key] = value;})return clazz;
}
class Zhangsan {}const mixins = {writing(){// 写作}
}const WriterZhangSan = mixin(Zhangsan,mixin);// 是不是很像
//const WriterZhangSan = Object.assign(ZhangSan.prototype,mixin)
二、怎么在React中使用
React.createClass
官方预留接口
React.createClass({mixins:[mixins],render(){return <div>Hello World</div>}
})
注意:
- 多个mixin如果有相同name的实现会报错,并不会后面的覆盖前面的。
- 定义生命周期如
componentDidMount
的mixin,并不会覆盖组件方法,而是两个方法都会执行
import createClass from "create-react-class"
const MixinDemo = createClass({mixins: [{componentDidMount() {console.log("mixin")}}],componentDidMount(){console.log("Demo")},render() {return <div>123</div>}
})
// minxin
// Demo
ES6 class & ES7 decorator :类语修饰器
const mixin = (...mixins) => {return target =>{mixins.forEach(mixin =>{Object.assign(target.prototype,mixin)})return target;}
}
const didMountSayHello = {componentDidMount(){console.log("Hello World")}
}@mixin(didMountSayHello)
class MixinDemo extends React.Component{render(){return <div>2333</div>}
}
// Helloworld
举个贴近生产的例子:
每个组件需要国际化语言处理
const languageText = {'en_US':user:{userName:"User Name"},'zh_CN':user:{userName:"用户名"}
}
const injectLanguage = (nameSpace) =>{return targetComponent =>{targetComponent.prototype.getLanguage = function(){return "en_US"}targetComponent.prototype.getText = function(){const currentLanguage = this.getLanguage();return languageText[currentLanguage]}return targetComponent;}
}@languageText("user")
class User extends React.Component{render(){return <div>{this.props.getText().userName}:<input/></div>}
}
三、Mixin的缺点
墙倒众人推,破鼓万人捶。
社区开始不待见这个方式,导致成了“反模式”
Daniel Avramov 发现并提出问题:
- 破坏原组件的封装
mixin给组件注入新功能的时候,也可能导致加入一些隐藏的状态,维护组件的人难免会踩坑;
- 命名冲突
引用多个mixin的时候难免会有作者取名雷同,这时候就要花时间去解决这种冲突。
- 增加复杂性
引入多个mixin的时候尽管你能规避命名和隐藏的功能,但是几个月后或者其他人来看却是难以理解。一个组件内居然实现了这么多功能。
四、替代品
mixin被打入冷宫称为"反模式",必定会有"正模式"来替代它,没错,他就是官方推荐的高阶组件
。
我们下期再见!
React组件抽象(一): mixin相关推荐
- React 组件设计指南
前言 在我过往的经历里, 在面试与被面之间通常都会夹杂一些关于组件设计方面的问题, 但通常面试官和候选人都只能通过一些实际的项目经历来就设计进行讨论, 相比服务端面试中可能还涉及一些设计原则和基本思路 ...
- 使用react实现select_使用 Hooks 优化 React 组件
奇技指南 本文内容主要是我之前分享的文字版,若想看重点的话可以看之前的Slide: https://ppt.baomitu.com/d/75fc979a 本文作者奇舞团前端开发工程师李喆明. 需求描述 ...
- React组件复用的方式
React组件复用的方式 现前端的工程化越发重要,虽然使用Ctrl+C与Ctrl+V同样能够完成需求,但是一旦面临修改那就是一项庞大的任务,于是减少代码的拷贝,增加封装复用能力,实现可维护.可复用的代 ...
- 一文详解 React 组件类型
本文的目标是让开发者清晰地了解 React 组件类型,哪些在现代 React 应用中依然在使用,以及为何一些类型现在不再使用了. 作者 | Robin Wieruch 译者 | 弯月 责编 | 屠敏 ...
- React组件设计实践总结05 - 状态管理
今天是 520,这是本系列最后一篇文章,主要涵盖 React 状态管理的相关方案. 前几篇文章在掘金首发基本石沉大海, 没什么阅读量. 可能是文章篇幅太长了?掘金值太低了? 还是错别字太多了? 后面静 ...
- React学习(1)——JSX语法与React组件
为什么80%的码农都做不了架构师?>>> 本文记录了在官网学习如何使用JSX+ES6开发React的过程. 全文共分为3篇内容: JSX语法与React组件 状态.事件与动态渲 ...
- react 组件引用组件_React Elements VS React组件
react 组件引用组件 A few months ago I posted to Twitter what I thought was a simple question: 几个月前,我在Twitt ...
- 可以改动的option组件_告别秃头!设计让开发者省心的React组件(内含详细代码)...
全文共7556字,预计学习时长20分钟 来源:Pexels 用"你秃了,你也强了"这句话来形容程序员再合适不过了. 但是,为了变强就必须付出"秃头"这种巨大代价 ...
- react 把前后台的axios请求放在一起_可靠React组件设计的7个准则之SRP
我喜欢React组件式开发方式.你可以将复杂的用户界面分割为一个个组件,利用组件的可重用性和抽象的DOM操作. 基于组件的开发是高效的:一个复杂的系统是由专门的.易于管理的组件构建的.然而,只有设计良 ...
- React组件的生命周期函数
文章目录 React组件生命周期 认识生命周期 生命周期函数 不常用生命周期函数 React组件生命周期 认识生命周期 很多的事物都有从创建到销毁的整个过程,这个过程称之为是生命周期: React组件 ...
最新文章
- 连接linux系统软件,Windows系统上有哪些不错的终端软件可以远程连接Linux?
- PyTorch之深入理解list、ModuleList和Sequential。
- 008_JsonConfig对象
- 用c语言实现随机无向图的生成,C ++程序为给定数量的边生成随机无向图
- Mahout快速入门教程
- H5+JS实现《Just Do 8》游戏源码分享
- 融合时代 存储迎来无限可能
- websocket 应用实例
- 解决新用户注册Kaggle无法显示验证码的问题
- Photoshop设计精讲精练(读书笔记)
- Android 手动显示和隐藏软键盘
- 大疆图像算法面试流程
- python读取配置文件 分段_python分割文件的常用方法
- Spark 应用监控告警-Graphite_exporter
- IE浏览器和火狐浏览器兼容问题——CSS篇
- WPF Border 设置只加一边
- Android - 跳转到应用商店进行应用打分功能实现,安卓开发面试基础
- IDA 和 IDA-Python 学习笔记
- 计算机毕业设计SSM大学生学习交友平台【附源码数据库】
- XNA 3.0小例子
热门文章
- 三点共线判断方法分析
- win8连接wifi成功但受限制_用于 手机热点或WIFI网络的IM143DTU使用手册
- chromium目录下各个dll的作用
- 三十种共识算法,直抵背后的灵魂
- 一个服务器放多个网站seo,服务器建立多个网站 同一IP对SEO有影响吗
- processing交互应用——双人对战游戏
- 深度学习环境搭建(ubuntu16.04+Titan Xp安装显卡驱动+Cuda9.0+cudnn+其他软件)
- 5分钟通过Sails.js从零开始开发RESTful API
- Java中的数组注意点
- caj转成Word文件是怎么转换的