前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >react 写一个预加载表单数据的装饰器

react 写一个预加载表单数据的装饰器

作者头像
西南_张家辉
发布2021-02-02 10:01:08
8220
发布2021-02-02 10:01:08
举报
文章被收录于专栏:张家辉的树屋

说明

  • react 初学者
  • 怎么使用装饰器?

理解一下 react 中装饰器的使用

需求分析

  • 每次我们在加载页面的时候需要加载一些数据
代码语言:javascript
复制
import React, { Component } from 'react';
import http from 'utils/http';

class normalGetData extends Component{
    
componentDidMount() {
    this.getData();
}

getData = async () => {
    try {
        const data = await http(xxx);

        this.setState({
            data
        });
    } catch (error) {
        this.setState({
            error
        });
    }
};

render(){
    const { data } = this.state;
    return <div> { data }div>
}

}
复制代码

一般情况当然是在 componentDidMount 的时候去获取数据啦,然后放在 state 中,然后再 render 渲染数据。

使用装饰器的方法,包裹一下我们常用的预加载数据,需要渲染的地方。

  • 这里的包裹用到了Props Proxy(属性代理模式 PP)
代码语言:txt
复制
- 不明白的同学可以看看  [react 高阶组件 代理模式]新建一个  withPreload.js 文件
代码语言:javascript
复制
import React, { Component } from 'react';
import http from 'utils/http';

export default function createWithPreload(config) {
//因为我们需要传一个url 参数,所以暴露一个 func
    return function withPreload(WrappedComponent) {
        return class extends Component {
           
           // 还是和以前的写法一样 在 ComponentDidMount 的时候取数据
            componentDidMount() {
                this.getData();
            }

            getData = async () => {
               
                try {
                    // config 作为唯一的传参
                    const data = await http(config);

                    this.setState({
                        data
                    });
                } catch (error) {
                    this.setState({
                        error
                    });
                }

            };

            render() {
                const { error, data } = this.state;

                if (error) {
                    return '数据错啦: ' + ${error}
                }

                // 返回的到的数据 loadDtat={data}
                // 因为用到了 WrappedComponent 包裹起来,所以需要使用 {...this.props} 去传递 props 的值给子组件
                return <WrappedComponent {...this.props} loadData={data} />;
            }
        };
    };
}

复制代码

上面涉及到了高阶组件的使用,有兴趣的同学可以研究一下 react 高阶组件,其实 react 的高阶组件就是包装了另外一个组件的 react 组件

  • 然后我们就可以这样来使用封装好的装饰器了
代码语言:javascript
复制
import React, { Component } from 'react';
import withPreload from './withPreload';

// 虽然我们费了很多功夫完成了装饰器,但是现在我们只需要这样一句话就可以预加载我们需要的数据了,在很多页面都可以复用

@withPreload({
    url: getData('/xxx/xxx/test')
})

class index extends Component{
    render(){
        return <div>{this.props.loadData.data}div>
    }
}
复制代码
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 理解一下 react 中装饰器的使用
    • 需求分析
      • 使用装饰器的方法,包裹一下我们常用的预加载数据,需要渲染的地方。
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档