您的位置: 翼速应用 > 业内知识 > web前端 > 正文

在react中高阶组件是什么?

操作Windows10系统、react17.0.1版、Dell G3电脑时eact中的高阶组件是什么


react高阶组件是什么意思


高阶组件是一个函数(而不是组件),它接受一个组件作为参数,返回一个新的组件。这个新的组件会使用你传给它的组件作为子组件 -引用自React.js小书


高阶组件(Higher-Order Components)是 React 中用于重用组件逻辑的高级技术。 HOC 本身不是 React API 的一部分。 它们是从 React 构思本质中浮现出来的一种模式。


在我们项目中使用react-redux框架的时候,有一个connect的概念,这里的connect其实就是一个高阶组件。也包括类似react-router-dom中的withRouter的概念


如图示


构建一个简单的hoc


function hello (){

    console.log("hello i  love react ")

}

function hoc(fn){

    return ()=>{

          console.log("first");

          fn();

          console.log("end");

    }

}

hello = hoc(hello);

hello();


实现高阶组件的方法


实现高阶组件的方法有如下两种:


  • 属性代理。高阶组件通过呗包裹的React组件来操作props

  • 向继承。高阶组件继承于被包裹的React组件


接下来我们分别来阐述这两种方法。


属性代理


属性代理是我们react中常见高阶组件的实现方法,我们通过一个例子来说明:


import React,{Component} from 'react';

const MyContainer = (WraooedComponent) => 

    class extends Component {

        render(){

            return <WrappedComponent {...this.props} />

        }

    }


从这里看到最重要部分是render 方法中返回了传入 WrappedComponent的React组件。这样,我们就可以通过高阶组件来传递props。这种方法即为属性代理。


自然,我们想要使用MyContainer这个高阶组件就变得非常容易:


import React,{Component} from 'react';

class MyComponent extends Component{

    //...

}

export default MyContainer(MyComponent);


这样组件就可以一层层地作为参数被调用,原始组件就具备了高阶组件对它的修饰。就这么简单,保持单个组件封装性的同时还保留了易用性。当然,我们也可以用decorator来转换。


当使用属性代理构建高阶组件时,调用顺序不同于mixin。上述执行生命周期的过程类似于堆栈调用:


didmount ->HOC didmount ->(HOCs didmount)->(HOCs will unmount)->HOC will unmount -> unmount


反向继承


另一种构建高阶组件的方法称为反向继承,从字面意思上看,它一定与继承性相关。我们同样来看一个简单的实现。


const MyContainer = (WrappedComponent)=>{

    class extends WrappedComponent {

        render(){

            return super.render();

        }

    }

}

如上代码。高阶组件返回的组件继承于 WrappedComponent 。因为被动地继承了 WrappedComponent,所有的调用都会反向,这也是种方法的由来。


这种方法与属性代理不太一样。它通过继承WrappedComponent来实现,方法可以通过super来顺序调用。因为依赖于继承机制。HOC的调用顺序和队列是一样的。


didmount -> HOC didmount ->(HOCs didmount) -> will unmount ->HOC will unmount ->(HOCs will unmount)


在反向继承方法中,高阶组件可以使用 WrappedComponent 引用,这意味着它可以使用 WrappedComponent 的state 、props。生命周期和render方法。但它不能保证完整的子组件树被解析。它有两个比较大的特点,下面我们展开来讲一讲。


渲染劫持


渲染劫持就是指的是高阶组件可以控制 WrappedComponent的渲染过程,并渲染各种各样的结果。我们可以在这个过程中在任何React元素输出的结果中读取、增加、修改、删除props,或读取或修改React元素树,或条件显示。又或者用样式包裹元素树


控制state


高阶组件可以读取、修改或删除WrappedComponent实例中的state,如果需要的话,也可以增加state。


组件命名


当包裹一个高阶组件时,我们失去了原始 WrappedComponent的displayName,而组件名字是方便我们开发与调试的重要属性。


组件参数


有时,我们调用高阶组件需要传入一些参数,这可以用非常简单的方式来实现。


import React from 'react'

function HOCFactoryFactory(...params){

    return function HOCFactory(WrappedComponent){

        return class HOC extends Component{

            render(){

                return <WrappedComponent {...this.props} />

            }

        }

    }

}


当你使用的时候,可以这么写:


HOCFactoryFactory(params)(WrappedComponent)

//or

@HOCFactoryFactory(params)class WrappedComponent extends React.Component{}


这也是利用了函数式编程的特征。可见,在React抽象的过程中,处处可见它的影子。




以上就是在react中高阶组件是什么的全部内容,想了解更多的话请关注翼速网络应用平台获取更多内容!


我来说两句

0 条评论

推荐阅读

  • 响应式布局CSS媒体查询设备像素比介绍

    构建响应式网站布局最常见的是流体网格,灵活调整大小的站点布局技术,确保用户在使用的幕上获得完整的体验。响应式设计如何展示富媒体图像,可以通过以下几种方法。

    admin
  • 提升网站的性能快速加载的实用技巧

    网站速度很重要,快速加载的网站会带来更好的用户体验、更高的转化率、更多的参与度,而且在搜索引擎排名中也扮演重要角色,做SEO,网站硬件是起跑线,如果输在了起跑线,又怎么跟同行竞争。有许多方法可提升网站的性能,有一些技巧可以避免踩坑。

    admin
  • 织梦CMS TAG页找不到标签和实现彩色标签解决方法

    织梦cms是我们常见的网站程序系统的一款,在TAG标签中常常遇到的问题也很多。当我们点击 tags.php 页的某个标签的时候,有时会提示:“系统无此标签,可 能已经移除!” 但是我们检查程序后台,以及前台显示页面。这个标签确实存在,如果解决这个问题那?

    admin
  • HTML关于fieldset标签主要的作用

    在前端开发html页面中常用的标签很多,今天为大家带来的是关于HTML中fieldset标签主要的作用说明,根据技术分析HTML

    admin

精选专题