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,一经查实,立即删除!

相关文章

好好的活,简简单单过!

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

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&#…

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

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

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

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

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

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

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

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

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

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

从0开始学Java——JSPServlet——HttpServletRequest相关的几个路径信息

在HttpServletRequest中有几个获取路径的接口&#xff1a;getRequestURI/getContextPath/getServletPath/getPathInfo 这些接口互相之间有什么区别&#xff0c;通过下面这段代码就可以分辨清楚了&#xff1a; 1 WebServlet("/hello.view")2 public class FirstServle…

C#编译和运行过程图例

一张图&#xff0c;描述C#编译和运行过程&#xff0c;比较容易记忆理解

C#中的堆和栈理解

引言&#xff1a;程序运行时&#xff0c;它的数据必须存在内存中&#xff0c;一个数据需要多大内存、存储在什么地方以及如何存储都依赖于该数据的数据类型。1、什么是栈栈是一个内存数组&#xff0c;是一个LIFO&#xff08;Last-In-First-Out 后进先出&#xff09;的数据结构。…

C# 基础:Sealed、new、virtual、abstract、override的理解

目录 1、sealed 2、new 3、virtual 4、abstract 5、override 1、sealed 密封类不能被继承&#xff0c;密封方法可以重写基类中的方法&#xff0c;但其本身不能在任何派生类&#xff08;子类&#xff09;中 进一步重写。当应用于属性或者方法时&#xff0c;sealed 修饰符必须始终…

U3D 脚本添加和获得对象

有时候&#xff0c;一开始可能没有对象&#xff0c;而是由于某种触发&#xff0c;产生的一个对象&#xff0c;这里讲解下&#xff0c;如何通过脚本来创建一个对象&#xff1a; 这是通过脚本创建一个立方体&#xff1a; using UnityEngine; using System.Collections;public cla…

50条超精辟的经典语录:哗众,可以取宠,也可以失宠!

在人生道路上给自己定位很重要&#xff0c;不要苛求自己达到不可能达到的高度。我们能把每一件平凡的事做好就是不平凡&#xff0c;把每一件简单的事做成功就是不简单。1.我们只有一个地球&#xff0c;所以你要爱护地球&#xff1b;地球上只有一个我&#xff0c;所以你也要爱护…

IP、TCP和DNS与HTTP的密切关系

看了上一篇博文的发表时间&#xff0c;是7月22日&#xff0c;现在是10月22日&#xff0c;已经有三个月没写博客了。这三个月里各种忙各种瞎折腾&#xff0c;发生了很多事情&#xff0c;也思考了很多问题。现在这段时间开始闲下来了&#xff0c;同时该思考的事情也思考清楚了&am…

【原创】关于ASP.NET WebForm与ASP.NET MVC的比较

WebForm的理解1、 WebForm概念ASP.NETWebform提供了一个类似于Winform的事件响应GUI模型&#xff08;event-drivenGUI&#xff09;&#xff0c;隐藏了HTTP、HTML、JavaScript等细节&#xff0c;将用户界面构建成一个服务器端的树结构控件&#xff08;Control&#xff09;&#…

Asp.Net页面传值的方法简单总结【原创】

1、QueryString当页面上form按照get的方式向页面发送请求数据的时候&#xff0c;web server会将请求数据放入一个QEURY_STRING的环境变量中&#xff0c;然后通过QeueryString方法从这个变量中获取相应的参数。例如&#xff1a;发送参数页面Test1.aspx 按钮单击代码&#xff1a;…

mysql 多字节编码漏洞_phpmyadmin 4.8.1 远程文件包含漏洞(CVE-2018-12613)

漏洞详情范围 phpMyAdmin 4.8.0和4.8.1原理 首先在index.php 50-63行代码$target_blacklist array (import.php, export.php);// If we have a valid target, lets load that script insteadif (! empty($_REQUEST[target])&& is_string($_REQUEST[target])&&…