react高阶组件添加和删除props


Posted in Javascript onApril 26, 2019

唠叨几句啦

在看程墨老师的深入浅出高阶组件,开头一点提了一个需要,创建两个高阶组件,一个能给传入的元素自定义添加props,一个是删除特定的props。我刚刚做了一下,发现高阶组件需要区分好传入的是class还是react element, 同时也需要注意好return回去的是啥。顺便提一下高阶组件的概念,就说一个函数,能够接受一个组件作为参数,然后返回的时候,这个组件就带有这个高阶组件给的某些特性。我理解就跟掉泥坑了,得带点土出来一个道理。

对比一下两个组件,贴代码时刻来啦

删除属性的高阶组件

我们需要传入任何组件和参数,都把user参数给删除了,所以返回值是一个接收props属性的函数。

import React from "react"

function removeUserProp(WrappedComponent) {
  return function newRender(props) {
    const {user, ...otherProps} = props;// 删除user这个属性值
    return <WrappedComponent {...otherProps} />
  }
}

export default removeUserProp

使用的时候

const RemoveComponent = removeUserProp(reactComponentClass)({user: "aa"});// 这里返回的是一个react component
 render () {
  return <div>
        {RemoveComponent}
      </div>
 }

增加属性的高阶组件

import React from "react"

const addNewProps = function (WrappedComponent, newProps) {// 接收的是一个class作为参数,返回一个class
  return class WrappingComponent extends React.Component {
    render () {
      return <WrappedComponent {...this.props} {...newProps}/>
    } 
  }
}

export default addNewProps

使用的时候,返回值是class,所以要用<ReactClassName/>转换成可以渲染的react组件

const AddUserComponent = addNewProps(SampleComponent, {user: "aa"})
  render () {
    return <AddUserComponent />
  }

完整的使用的例子代码:

import React from "react"
import addNewProps from './addNewProps'
import removeUserProp from './removeUserProp'

class SampleComponent extends React.Component {

  constructor(props) {
    console.log(props)
    super(props)
  }

  render () {
    console.log(this.props)
    return <div>
        {
         this.props.user ? <p>哈哈哈</p> : <p>哈哈哈2</p>
        }   
        </div>
  }
}


class Test extends React.Component {

  render () {
    var obj = {aa: "aa"}
    const AddUserComponent = addNewProps(SampleComponent, {user: "aa"})
    const RemoveUserComponent = removeUserProp(SampleComponent)({user: "aa"})
   
    return <div>
         <AddUserComponent />
         {RemoveUserComponent}
        </div>
    
  }
}

export default Test

一点点小收获就是明白了高阶组件要看清楚输入输出。class跟react element的区别。

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

Javascript 相关文章推荐
javascript中的几个运算符
Jun 29 Javascript
AngularJS入门教程之学习环境搭建
Dec 06 Javascript
jQuery下拉友情链接美化效果代码分享
Aug 26 Javascript
jquery验证手机号是否正确实例讲解
Nov 17 Javascript
如何解决ligerUI布局时Center中的Tab高度大小
Nov 24 Javascript
jQuery过滤选择器用法示例
Sep 12 Javascript
KnockoutJS 3.X API 第四章之数据控制流if绑定和ifnot绑定
Oct 10 Javascript
微信公众号-获取用户信息(网页授权获取)实现步骤
Oct 21 Javascript
浅谈jQuery的bind和unbind事件(绑定和解绑事件)
Mar 02 Javascript
angular2中Http请求原理与用法详解
Jan 11 Javascript
JS中用EL表达式获取上下文参数值的方法
Mar 28 Javascript
原生js实现下拉框选择组件
Jan 20 Javascript
详解微信小程序-canvas绘制文字实现自动换行
Apr 26 #Javascript
vue 进阶之实现父子组件间的传值
Apr 26 #Javascript
详解JS判断页面是在手机端还是在PC端打开的方法
Apr 26 #Javascript
配置一个vue3.0项目的完整步骤
Apr 26 #Javascript
关于Vue源码vm.$watch()内部原理详解
Apr 26 #Javascript
JS异步错误捕获的一些事小结
Apr 26 #Javascript
原生JS实现图片懒加载之页面性能优化
Apr 26 #Javascript
You might like
让你同时上传 1000 个文件 (一)
2006/10/09 PHP
php foreach、while性能比较
2009/10/15 PHP
深入HTTP响应状态码速查表的详解
2013/06/07 PHP
php使用PDO执行SQL语句的方法分析
2017/02/16 PHP
执行iframe中的javascript方法
2008/10/07 Javascript
jquery的相对父元素和相对文档定位示例代码
2013/08/02 Javascript
jquery序列化form表单使用ajax提交后处理返回的json数据
2014/03/03 Javascript
node.js中的fs.readlink方法使用说明
2014/12/17 Javascript
jQuery如何防止这种冒泡事件发生
2015/02/27 Javascript
初步认识JavaScript函数库jQuery
2015/06/18 Javascript
javascript省市级联功能实现方法实例详解
2015/10/20 Javascript
基于jQuery实现以手风琴方式展开和折叠导航菜单
2016/01/28 Javascript
JavaScript获取select中text值的方法
2017/02/13 Javascript
vue.js2.0点击获取自己的属性和jquery方法
2018/02/23 jQuery
小程序云开发初探(小结)
2018/10/24 Javascript
vue 中 beforeRouteEnter 死循环的问题
2019/04/23 Javascript
最简单的vue消息提示全局组件的方法
2019/06/16 Javascript
详解基于原生JS验证表单组件xy-form
2019/08/20 Javascript
解决Layui当中的导航条动态添加后渲染失败的问题
2019/09/25 Javascript
JS数组方法reduce的用法实例分析
2020/03/03 Javascript
详解nginx配置vue h5 history去除#号
2020/11/09 Javascript
Python安装使用命令行交互模块pexpect的基础教程
2016/05/12 Python
tensorflow学习笔记之简单的神经网络训练和测试
2018/04/15 Python
python 借助numpy保存数据为csv格式的实现方法
2018/07/04 Python
Python实现网页截图(PyQT5)过程解析
2019/08/12 Python
Python openpyxl 插入折线图实例
2020/04/17 Python
numpy的Fancy Indexing和array比较详解
2020/06/11 Python
Django和Ueditor自定义存储上传文件的文件名
2021/02/25 Python
FragranceNet中文网:北美健康美容线上零售商
2020/08/26 全球购物
学校消防安全制度
2014/01/30 职场文书
施工安全责任书
2014/04/14 职场文书
男女朋友协议书
2014/04/23 职场文书
汽车维修求职信
2014/06/15 职场文书
学生会竞选演讲稿怎么写
2014/08/26 职场文书
销售人员工作自我评价
2014/09/21 职场文书
优秀员工自荐书
2015/03/06 职场文书