React学习笔记之高阶组件应用


Posted in Javascript onJune 02, 2018

是什么

高阶组件是一个函数,能够接受一个组件并返回一个新的组件。没有任何副作用。

为什么用

封装并抽离组件的通用逻辑,让此部分逻辑在组件间更好地被复用。

如何用

//hoc为我们的高阶组件,可以使用es7装饰器语法来使用高阶组件
//当然也可以不用es7,如:let hocHello = hoc(Hello),只是es7的语法更优雅一些。
//高阶组件可以叠加使用,可以对一个组件使用多个高阶组件
@hoc       
class Hello extends React.Component {
 //
}

如何实现

属性代理

下面的例子是最简单的一个实现

function hoc(ImportComponent) {
 return class Hoc extends React.Component {
 static displayName = `Hoc(${getDisplayName(ImportComponent)})` //displayName是设置高阶组件的显示名称
 render() {
  return <ImportComponent {...this.props} />
 }
 }
}

function getDisplayName(Component) {
 return Component.displayName || Component.name || "Component"
}

作用:操作prop,refs获取组件实例

注意事项:静态方法无法传递,必须手动复制;refs无法传递。

反向继承

下面的例子是最简单的一个实现

export function hoc(ImportComponent) {
 return class Hoc extends ImportComponent {
 static displayName = `Hoc(${getDisplayName(ImportComponent)})`
 render() {
  return super.render()
 }
 }
}

作用: 操作state;渲染劫持(操作它的render函数)

注意事项:通过继承ImportComponent,除了一些静态方法,包括生命周期,state,各种function,我们都可以得到。

原则

  1. 不要修改原组件,高阶组件只是通过组合的方式将子组件包装在容器组件中,是一个无副作用的纯函数。
  2. 不要在render方法内部使用高阶组件。
  3. 高阶组件可以向组件添加功能,但是不应该大幅度地改变功能。
  4. 为了方便调试,选择一个显示名称,表示它是高阶组件的结果。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
JavaScript的面向对象(一)
Nov 09 Javascript
jquery事件机制扩展插件 jquery鼠标右键事件。
Dec 26 Javascript
前端js实现文件的断点续传 后端PHP文件接收
Oct 14 Javascript
利用Js的console对象,在控制台打印调式信息测试Js的实现
Nov 26 Javascript
angular实现表单验证及提交功能
Feb 01 Javascript
Webpack的dll功能使用
Jun 28 Javascript
ES6知识点整理之模块化的应用详解
Apr 15 Javascript
微信小程序开发技巧汇总
Jul 15 Javascript
详解用async/await来处理异步
Aug 28 Javascript
Vue 开发必须知道的36个技巧(小结)
Oct 09 Javascript
Vue使用Ref跨层级获取组件的步骤
Jan 25 Vue.js
Vue3中的Refs和Ref详情
Nov 11 Vue.js
浅谈node中的cluster集群
Jun 02 #Javascript
详解AngularJS 过滤器的使用
Jun 02 #Javascript
简化vuex的状态管理方案的方法
Jun 02 #Javascript
深入了解javascript 数组的sort方法
Jun 01 #Javascript
js 数组详细操作方法及解析合集
Jun 01 #Javascript
vue 中动态绑定class 和 style的方法代码详解
Jun 01 #Javascript
一个简单的node.js界面实现方法
Jun 01 #Javascript
You might like
一个高ai的分页函数和一个url函数
2006/10/09 PHP
30 个很棒的PHP开源CMS内容管理系统小结
2011/10/14 PHP
php 类自动载入的方法
2015/06/03 PHP
WordPress中使主题支持小工具以及添加插件启用函数
2015/12/22 PHP
通过PHP自带的服务器来查看正则匹配结果的方法
2015/12/24 PHP
详解PHP防止盗链防止迅雷下载的方法
2017/04/26 PHP
php 中htmlentities导致中文无法查询问题
2018/09/10 PHP
扩展jQuery 键盘事件的几个基本方法
2009/10/30 Javascript
JS实现获取键盘按下的按键并显示在页面上的方法
2015/11/04 Javascript
jQuery中借助deferred来请求及判断AJAX加载的实例讲解
2016/05/24 Javascript
原生JS实现-星级评分系统的简单实例
2016/08/21 Javascript
轻松实现js弹框显示选项
2016/09/13 Javascript
移动适配的几种方案(三种方案)
2016/11/25 Javascript
vue + socket.io实现一个简易聊天室示例代码
2017/03/06 Javascript
深入理解Vue transition源码分析
2017/07/30 Javascript
Vee-Validate的使用方法详解
2017/09/22 Javascript
JS改变页面颜色源码分享
2018/02/24 Javascript
使用Vue实现移动端左滑删除效果附源码
2019/05/16 Javascript
Nodejs + Websocket 指定发送及群聊的实现
2020/01/09 NodeJs
javascript-hashchange事件和历史状态管理实例分析
2020/04/18 Javascript
Jquery+AJAX实现无刷新上传并重命名文件操作示例【PHP后台接收】
2020/05/29 jQuery
详解Vue之事件处理
2020/07/10 Javascript
[03:14]2014DOTA2西雅图国际邀请赛 EG战队巡礼
2014/07/07 DOTA
Python 自动补全(vim)
2014/11/30 Python
python 循环while和for in简单实例
2016/08/16 Python
Pycharm新建模板默认添加个人信息的实例
2019/07/15 Python
Python中函数的返回值示例浅析
2019/08/28 Python
在python中logger setlevel没有生效的解决
2020/02/21 Python
使用tkinter实现三子棋游戏
2021/02/25 Python
使用 css3 实现圆形进度条的示例
2017/07/05 HTML / CSS
放飞梦想演讲稿800字
2014/08/26 职场文书
节约用电倡议书
2015/04/28 职场文书
高中开学感言
2015/08/01 职场文书
经典祝酒词大全
2015/08/12 职场文书
Nginx服务器添加Systemd自定义服务过程解析
2021/03/31 Servers
Python中的程序流程控制语句
2022/02/24 Python