理解 React 高阶组件

本文介绍了React中的高阶组件概念,探讨了其使用原因,并通过示例展示了如何编写高阶组件来提高代码复用性和逻辑性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 什么是高阶组件?

  • 高阶组件就是一个函数,它接受另一个组件作为参数,并返回一个新的组件。
  • 当 React 组件被包裹时(warped),高阶组件会返回一个增强的 React 组件。
  • 高阶组件让代码更具有复用性、逻辑性和抽象特性

2. 为什么要用高阶组件?

  • 在不用高阶组件的情况下,写两个普通的组件 WelcomeGoodbye ,它们都从 localStorage 中读取 userName ,然后对 userName 做一些处理。
  • Welcome 组件:
import React, {Component} from 'react'

class Welcome extends Component {
    constructor(props) {
        super(props);
        this.state = {
            username: ''
        }
    }

    componentWillMount() {
        let username = localStorage.getItem('username');
        this.setState({
            username: username
        })
    }

    render() {
        return (
            <div>welcome {this.state.username}</div>
        )
    }
}

export default Welcome;
  • Goodbye 组件:
import React, {Component} from 'react'

class Goodbye extends Component {
    constructor(props) {
        super(props);
        this.state = {
            username: ''
        }
    }

    componentWillMount() {
        let username = localStorage.getItem('username');
        this.setState({
            username: username
        })
    }

    render() {
        return (
            <div>goodbye {this.state.username}</div>
        )
    }
}

export default Goodbye;
  • 可以发现, 两个组件的大部分代码都是重复的,这种代码冗余非常不好。

3. 怎么写高阶组件?

  • 我们可以将两个组件进行抽象提取公共部分,在公共部分中读取 userName , 并将 userName 传递给具体的组件。改写如下:
import React, {Component} from 'react'

export default (WrappedComponent) => {
    class WrapWithUsername extends Component {
        constructor() {
            super();
            this.state = {
                username: ''
            }
        }

        componentWillMount() {
            let username = localStorage.getItem('username');
            this.setState({
                username: username
            })
        }

        render() {
            return <WrappedComponent username={this.state.username}/>
        }
    }

    return WrapWithUsername;
}
  • 上面的 WrapWithUsername 就是一个抽象的高阶组件,它接受另一个组件作为参数,并返回一个新的组件。高阶组件可以对原始组件(传入组件)进行修饰,这样在保持单个组件封装性的同时还保留了易用性。
  • 使用上面的高阶组件来简化 WelcomeGoodbye 组件:
import React, {Component} from 'react';
import wrapWithUsername from 'wrapWithUsername';

class Welcome extends Component {

    render() {
        return (
            <div>welcome {this.props.username}</div>
        )
    }
}

Welcome = wrapWithUsername(Welcome);

export default Welcome;
import React, {Component} from 'react';
import wrapWithUsername from 'wrapWithUsername';

class Goodbye extends Component {

    render() {
        return (
            <div>goodbye {this.props.username}</div>
        )
    }
}

Goodbye = wrapWithUsername(Goodbye);

export default Goodbye;
  • 可以看出,高阶组件通过 propsusername 传递给目标组件,目标组件只管从 props 拿来用就好了,而不需要关心 username 是怎么来的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值