博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
react 写一个预加载表单数据的装饰器
阅读量:6445 次
发布时间:2019-06-23

本文共 2216 字,大约阅读时间需要 7 分钟。

说明

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

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

  • 看看这篇文章

需求分析

  • 每次我们在加载页面的时候需要加载一些数据
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 
{ data }
}}复制代码

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

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

  • 这里的包裹用到了Props Proxy(属性代理模式 PP)

    • 不明白的同学可以看看 [react 高阶组件 代理模式]
  • 新建一个 withPreload.js 文件

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 
; } }; };}复制代码

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

  • 然后我们就可以这样来使用封装好的装饰器了
import React, { Component } from 'react';import withPreload from './withPreload';// 虽然我们费了很多功夫完成了装饰器,但是现在我们只需要这样一句话就可以预加载我们需要的数据了,在很多页面都可以复用@withPreload({    url: getData('/xxx/xxx/test')})class index extends Component{    render(){        return 
{this.props.loadData.data}
}}复制代码

转载地址:http://nrpwo.baihongyu.com/

你可能感兴趣的文章
Redis慢查询,redis-cli,redis-benchmark,info
查看>>
新建MVC3 编译出现 System.Web.Mvc.ModelClientValidationRule
查看>>
mysql主从同步从库同步报错
查看>>
ExtJS+SpringMVC文件上传与下载
查看>>
Virtualbox 虚拟机网络不通
查看>>
poj 1017 Packets 贪心
查看>>
java概念基础笔记整理
查看>>
jmeter跨线程使用token
查看>>
play music
查看>>
self parent $this关键字分析--PHP
查看>>
CC_UNUSED_PARAM 宏含义的解释
查看>>
leetcode124二叉树最大路径和
查看>>
设计模式——中介者模式
查看>>
VI常用命令和按键
查看>>
AngularJS笔记整理 内置指令与自定义指令
查看>>
学习OpenCV——BOW特征提取函数(特征点篇)
查看>>
shell与正则表达式
查看>>
第三篇:白话tornado源码之请求来了
查看>>
10分钟搞定支付宝和微信支付的各种填坑
查看>>
IntelliJ Idea 集成svn 和使用
查看>>