react 给一个引用的组件添加新属性_高阶组件在React中的应用

197d5595dd4026e5b669aab5beefb949.png

高阶组件的定义

接受React组件作为输入,输出一个新的React组件。

概念源自于高阶函数,将函数作为参数,或者输出一个函数,如map,reduce,sort。

用haskell的函数签名来表示:

hocFactory:: W: React.component => E: React.component 

使用场景

可以用来对组件进行二次加工和抽象,比如:对Input组件进行样式改动、添加新的props属性;某些可以复用的逻辑抽象后再注入组件。

所以 HOC 的作用大概有以下几点:

  • 代码复用和逻辑抽象
  • 对 state 和 props 进行抽象和操作
  • Render 劫持

如何实现

  • 属性代理(props proxy):高阶组件通过被包裹的React组件来操作props,从而能够实现控制props、引用refs、抽象state。

1.1 控制props

import React, { Component, Fragment } from 'react';const MyContainer = WrappedComponent =>class extends Component {render() {const newProps = {text: 'newText',};return (<><span>通过 props proxy 封装HOC</span><WrappedComponent {...this.props} {...newProps} /></>);}};

从这里可以看到,在render中返回来传入WrappedComponent 的React组件,这样我们就可以通过HOC在props中传递属性、添加组件及样式等等。

使用也是非常简单:

import React, { Component } from 'react';
import MyContainer from './MyContainer.jsx';class App extends Component {...
}export default MyContainer(App);

当然也可以使用装饰器@decorator:”接收一个类作为参数,返回一个新的内部类“,与HOC的定义如出一辙,十分契合。

import React, { Component } from 'react';
import MyContainer from './MyContainer.jsx';@MyContainer
class App extends Component {...
}export default App;

1.2 通过refs使用引用

import React, { Component } from 'react';const RefsHOC = WrappedComponent =>class extends Component {proc(wrappedComponentInstance) {wrappedComponentInstance.refresh();}render() {const props = Object.assign({}, this.props, { ref: this.proc.bind(this) });return <WrappedComponent {...props} />;}};export default RefsHOC;

render() 时会执行 ref 回调,即proc方法,该方法可以获取 WrappedComponent 的实例,其中包含组件的 props,方法,context等。我们也可以在 proc 中进行一些操作,如控制组件刷新等。

1.3 抽象state

我们可以通过向 WarppedComponent 提供 props 和 回调函数抽象state,将原组件抽象成展示型组件,隔离内部state。

import React, { Component } from 'react';const MyContainer = WrappedComponent =>class extends Component {constructor(props) {super(props);this.state = {name: '',};}onHandleChange = e => {const val = e.target.value;this.setState({name: val,});};render() {const newProps = {name: {value: this.state.name,onChange: this.onHandleChange,},};return <WrappedComponent {...this.props} {...newProps} />;}};

我们将 input 组件中 name props 的 onChange方法提取到了高阶组件中,这样就有效的抽象了同样的state操作。

import React, { Component } from 'react';
import MyContainer from './MyContainer.jsx';@MyContainer
class MyInput extends Component {render() {return <input type="text" {...this.props.name} />;}
}export default MyInput;

参考链接

深入React技术栈​book.douban.comJavascript 中的装饰器​aotu.io
90185c597c6d63a550b4c97124ca6601.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/272866.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

杂想 · 警醒

今天无意间看到CSDN上一位大牛师姐的博客&#xff0c;真的是好惊讶啊&#xff01;很多时候总是太过自以为是&#xff0c;以为自己做不到的事情别人也很难做到。恰恰相反&#xff0c;成功总是伴随那些谦逊、努力、认真的人的&#xff01;曾几何时&#xff0c;自己或许也是一个认…

好好的活,简简单单过!

生命&#xff0c;每个人只有一次&#xff0c;或长或短&#xff1b;生活&#xff0c;每个人都在继续&#xff0c;或悲或欢&#xff1b;人生&#xff0c;每个人都在旅途&#xff0c;或起或伏。人无完人&#xff0c;事无完美&#xff0c;有些小人&#xff0c;你不须计较&#xff0…

SQL Server 中创建数据库、更改主文件组示例

以下示例在 SQL Server 实例上创建了一个数据库。该数据库包括一个主数据文件、一个用户定义文件组和一个日志文件。主数据文件在主文件组中&#xff0c;而用户定义文件组包含两个次要数据文件。ALTER DATABASE 语句将用户定义文件组指定为默认文件组。然后通过指定用户定义文件…

lunixs 退出mysql_MySQL的基本操作

1、数据库登录格式&#xff1a;mysql -h主机地址 -u用户名 -p用户密码 -P端口 -D数据库 -e “SQL内容”[rootwulaoer ~]# mysql -uroot -p2、修改密码格式&#xff1a;mysqladmin -u用户名 -p旧密码 password 新密码[rootwulaoer ~]# mysqladmin -uroot password 123456注&…

交际中你所不知道的说话的12个技巧!

1.“有一说一”和“自以为是”不同&#xff0c;别把粗鲁当成真性情与 他人相处&#xff0c;要遵循一个基本原则&#xff1a;己所不欲&#xff0c;勿施于人。你可以真挚地描述自己的感受&#xff0c;前提是不要带有攻击性&#xff0c;至于对他人做出评价和判断&#xff0c;则需要…

宽客的人amp;amp;事件映射

看完《宽客》这本书&#xff0c;叙事介绍20世纪华尔街对冲基金、股票、投资者依赖股市从直觉交易数学家的早期演化、物理学家用数学模型开发过程中的交易&#xff0c;这些进入金融数学家、物理学家依靠大数据分析、稍纵即逝的交易机会来买入卖出&#xff1b;同一时候找出交易模…

社交中的黄金法则,你要细细体会品味

1&#xff0c;不要急着用你的嘴&#xff0c;来为你的眼睛辩护什么。因为天知道你的嘴说出什么来。2&#xff0c;假如有人朝你扔石头&#xff0c;就收起来。因为那会是你日后建高楼的基石。3&#xff0c;能忍则忍&#xff0c;忍不了就改变&#xff0c;改变不了就认了哇。4&#…

Jsp笔记(1)

1. jsp页面中出现中文乱码怎么解决&#xff1f; 1 <% page contentType"text/html; charsetGB2312"%> 2 <% page language"java" import"java.util.*" pageEncoding"UTF-8"%> 用上面这两行代码去替换自动生成的代码&#…

这些略带幽默句子,笑的同时多感悟一下吧(收好)

1、穷&#xff0c;并不可怕&#xff0c;我怕穷着穷着就习惯了。2、世界上唯一不用努力&#xff0c;就能得到的只有年龄。3、我是你转身就忘的路人甲&#xff0c;凭什么陪你蹉跎年华到天涯&#xff1f;4、世界上最快乐的事情就是吃&#xff0c;第二快乐的是待会再吃。5、琴棋书画…

java 异常机制_深入理解Java异常处理机制

一、引子try…catch…finally恐怕是大家再熟悉不过的语句了&#xff0c;而且感觉用起来也是很简单&#xff0c;逻辑上似乎也是很容易理解。不过&#xff0c;我亲自体验的“教训”告诉我&#xff0c;这个东西可不是想象中的那么简单、听话。不信&#xff1f;那你看看下面的代码&…

ThreadLocal http://blog.jobbole.com/20400/

d转载于:https://www.cnblogs.com/hansongjiang/p/4875332.html

做人:失信是最大的破产!

一个人最大的破产是信用的破产&#xff01;哪怕你一无所有&#xff0c;但只要信用还在&#xff0c;就还有翻身的本金。保护好信用&#xff0c;珍惜别人给你的每一次信任&#xff01;因为有时候我们只有一次机会&#xff01;朋友有时候就像钞票&#xff0c;有真也有假。我们需要…

c#和WIN32 调用

作者&#xff1a;刘铁猛日期&#xff1a;2005-12-20关键字&#xff1a;C# .NET Win32 API版权声明:本文章受知识产权法保护&#xff0c;如果阁下想转载,在转载的时候烦劳阁下连同在下的姓名一起转载,并向bladeytom.com发一个Mail,我很想知道我的文章都去哪里了.谢谢.小序Win32 …

【干货】微信公众号运营必备工具(完整版)

做微信公众号运营最基本的要素有两点&#xff1a;一是内容要强大&#xff08;内&#xff09;&#xff0c;二是排版要美观&#xff08;外&#xff09;。做好前者&#xff0c;你需要有充足的知识储备以及精彩独到的文笔作为支撑&#xff0c;而做好后者则相对简单许多&#xff0c;…

java定时线程池_java 定时器线程池(ScheduledThreadPoolExecutor)的实现

前言定时器线程池提供了定时执行任务的能力&#xff0c;即可以延迟执行&#xff0c;可以周期性执行。但定时器线程池也还是线程池&#xff0c;最底层实现还是ThreadPoolExecutor&#xff0c;可以参考我的另外一篇文章多线程–精通ThreadPoolExecutor。特点说明1.构造函数public…

iOS 关于关键字高亮

- (NSMutableAttributedString *)colorStr: (NSString *)originalStr // originalStr : 需要高亮传入的字符串 { NSMutableAttributedString *dataStr [[[NSMutableAttributedString alloc] initWithString:originalStr] autorelease]; for (int i 0; i < originalStr.l…

成功,要“借力”,不要“尽力”(深刻!)

01每个人都喜欢成功&#xff0c;却又时常感觉自己力不从心一个小男孩在院子里搬一块石头&#xff0c;父亲在旁边鼓励&#xff1a;“孩子&#xff0c;只要你全力以赴&#xff0c;一定搬得起来&#xff01;”但是石头太重&#xff0c;最终孩子也没能搬起来。他告诉父亲&#xff1…

java 网站开发实例_完整的javaweb项目

【实例简介】主要功能有以下几个&#xff1a;1.用户注册 2.用户登录 3.用户列表展示 4.用户信息修改 5.用户信息删除【实例截图】【核心代码】javaweb└── javaweb├── src│ └── com│ ├── dao│ │ ├── UserDaoImpl.java│ │ └── UserDao.java│…

Nginx+Php-fpm+MySQL+Redis源码编译安装指南

说明&#xff1a;本教程由三部分组成如下&#xff1a; 1. 源码编译安装Nginx 2. 源码编译安装php以及mysql、redis扩展模块 3. 配置虚拟主机 文中所涉及安装包程序均提供下载链接&#xff0c;欢迎使用 执行环境以及前置条件&#xff1a;Ubuntu 12.04 LTS 已安装…

NetFramework各个版本的特性笔记

我的博客&#xff1a;http://www.cnblogs.com/hgmyz/p/6916064.html公式记忆&#xff1a;.Net 2.0CLRBCLC#(VB.Net)Win FormWeb Form.Net 3.0.Net 2.0WCFWPFWFWCS.Net 3.5.Net 3.0Asp.Net AjaxSliverlightLinq.Net 4.0 增加了并行的支持&#xff0c;与旧的Framwork并行工作。默…