美文网首页
React高阶组件的实战应用

React高阶组件的实战应用

作者: 追风的云月 | 来源:发表于2018-08-31 15:18 被阅读0次

近期项目中对于展示数据的table有一个特殊需求:
1.数据不够时,要求table的高度撑满页面空白区域
2.没有数据时展示暂无数据的logo


image.png

第一个思路肯定是写一个自定义公共组件,包裹一个table,在组件内部设置table的特殊样式,和自定义方法。

高阶组件为可以说是操作props的最优方案。关于原理和使用方法,官网文档介绍非常翔实,https://react.docschina.org/docs/higher-order-components.html。本文介绍一下实际运用。

我定义一个高级组件,命名为EmptyTableHOC,代码如下

import React, {Component} from 'react';
import {Table, Button} from 'antd';
import PropTypes from 'prop-types';

const EmptyTableHOC = (WrappedComponent) =>
    class Wrapper extends Component {
        emptyText = (height) => {
            if (this.props.emptyBtnText) {
                let loading = this.props.emptyBtnLoading
                return (
                    <div style={{height: (height - 32) + 'px'}}>
                        <i className='icon font_family icon-pic-empty empty-icon-style'></i>
                        <div>暂无数据</div>
                        <div style={{marginTop: '20px'}}>
                            <Button loading={loading} type="primary"
                                    onClick={() => this.props.emptyBtnAction()}>{this.props.emptyBtnText}</Button>
                        </div>
                    </div>
                )
            } else {
                return (
                    <div style={{height: (height - 32) + 'px'}}>
                        <i className='icon font_family icon-pic-empty empty-icon-style'></i>
                        <div>暂无数据</div>
                    </div>
                )
            }
        }

        componentDidMount() {

        }

        componentWillReceiveProps = (nextProps) => {
            if (document.getElementsByClassName('ant-table-body') && nextProps.dataSource && nextProps.dataSource.length > 0) {
                let height = this.props.tableBodyHeight + 'px';
                document.getElementsByClassName('ant-table-body')[0].style.height = height;
                document.getElementsByClassName('ant-table-body')[0].style.maxHeight = height;
            } else {
                if (document.getElementsByClassName('ant-table-body') && this.props.dataSource.length != 0) {
                    document.getElementsByClassName('ant-table-body')[0].style.height = 0;
                }
            }
        }

        render() {
            const {components, tableBodyHeight} = this.props;
            return <WrappedComponent
                {...this.props}
                components={components ? components : {body: {}}}
                locale={{emptyText: () => this.emptyText(tableBodyHeight)}}
            />;
        }
    };
export default EmptyTableHOC;

使用方式如下:

import React, {Component} from 'react';
import {Modal, Table} from 'antd';
import EmptyTableHOC from "./emptyTableLynn";
const MytableC = EmptyTableHOC(Table);
export default class CopyMetaDataModal extends Component {
    constructor(props) {
        super(props);
        this.state = {
            selectedIds: [],
            dataSource: []
        }
    }
    render() {
        const rowSelection = {
            onChange: this.onChange,
            selectedRowKeys: this.state.selectedIds
        };
        return (
            <div>
                <Modal
                    title="主数据模型"
                    visible={this.props.visible}
                    onOk={this.handleSubmit}
                    onCancel={this.props.handleCancel}
                    okText="确认"
                    cancelText="取消"
                >
                    <MytableC
                        columns={columns}
                        rowSelection={rowSelection}
                        dataSource={this.state.dataSource}
                        className="mapping-table-scroll"
                        indentSize={20}
                        pagination={false}
                        tableBodyHeight={330}
                        scroll={{ y: 330 }}
                    />
                </Modal>
            </div>
        )
    }
}

相关文章

  • React高阶组件的实战应用

    近期项目中对于展示数据的table有一个特殊需求:1.数据不够时,要求table的高度撑满页面空白区域2.没有数据...

  • react高阶组件

    此篇文章准备从高阶组件的概念出发,通过应用场景结合例子来学习react的高阶组件。 何为高阶组件 在开发 Reac...

  • 利用 React 高阶组件实现一个面包屑导航

    什么是 React 高阶组件 React 高阶组件就是以高阶函数的方式包裹需要修饰的 React 组件,并返回处理...

  • React 进阶之高阶组件

    高阶组件 HOC 高阶组件(HOC)是react中的高级技术,用来重用组件逻辑。但高阶组件本身并不是React A...

  • 高阶组件

    React 高阶组件HOC (Higher-Order Component) 高阶组件是react中重复使用组件逻...

  • React高阶组件

    1、React高阶组件

  • React高阶组件HOC

    高阶组件本质是函数,参数是 组件1 返回组件2,高阶组件是为了复用通用逻辑高阶组件eg:import React,...

  • React高阶组件(HOC)

    高阶组件(Higher-Order Components) 高阶组件(HOC)是 React 中用于重用组件逻辑的...

  • react 高阶组件的应用

    一、什么是高阶组件 高阶组件其实就是一个函数,他会接收一个组件作为参数并返回一个经过改造后的组件 二、高阶组件的实...

  • react 笔记

    react 基本概念解析 react 的组件声明周期 react 高阶组件,context, redux 等高级...

网友评论

      本文标题:React高阶组件的实战应用

      本文链接:https://www.haomeiwen.com/subject/uzvswftx.html