关于前端:代码抽象抽象成公共组件

4次阅读

共计 1889 个字符,预计需要花费 5 分钟才能阅读完成。

要实现如下图所示的成果

最开始是这样写的:

renderAction = (text, record) => (
    <>
        <Tooltip title='批改'>
            <a onClick={() => this.handleEdit(record)}>
                <Icon
                    type="edit"
                />
            </a>
        </Tooltip>
        <Divider
            type="vertical"
        />
        <Tooltip title='查看'>
            <a onClick={() => this.handleInfo(record)}>
                <Icon
                    type="eye"
                />
            </a>
        </Tooltip>
        <Divider
            type="vertical"
        />
        <Tooltip title='执行'>
            <a onClick={() => this.handleWork(record)}>
                <Icon
                    type="play-circle"
                />
            </a>
        </Tooltip>
        <Divider
            type="vertical"
        />
        <Tooltip title='bug 列表'>
            <a onClick={() => this.handleBugList(record)}>
                <Icon
                    type="exception"
                />
            </a>
        </Tooltip>
        <Divider
            type="vertical"
        />
        <Tooltip title='执行列表'>
            <a onClick={() => this.handleWorkList(record)}>
                <Icon
                    type="profile"
                />
            </a>
        </Tooltip>
        <Divider
             type="vertical"
        />
        <Tooltip title='删除'>
            <a onClick={() => this.handleDelCase(record)}>
                <Icon
                    type="delete"
                />
            </a>
        </Tooltip>
    </>
)

然而这样写很容易就发现,代码呈现了大量的反复,所以这里能够把代码形象成一个 公共组件

在形象时须要留神须要把哪些属性给形象进去,应该把与 上下文无关 的局部形象进去,这里的就是,Tooltip、a、Icon、Divider、type=”vertical”,其余的比方,图标的款式、点击事件、title,这些属性就须要父组件传递到公共组件外面。

import React, {PureComponent, Fragment} from 'react';
import {Icon, Tooltip, Divider} from 'antd';

class Action extends PureComponent {constructor(props) {super(props);
        this.state = {};}

    default = () => {}

    render() {const { actions = [], data = null } = this.props;
        const renderList = actions.map((action, index) => {const { title = 'action', type = 'tool', onClick = this.default} = action;
            return (<Fragment key={title}>
                    <Tooltip title={title}>
                        <a onClick={() => onClick(data)}>
                            <Icon type={type} />
                        </a>
                    </Tooltip>
                    {
                        index !== actions.length - 1 ?
                            <Divider
                                type="vertical"
                            /> : ''
                    }
                </Fragment>
            )
        })
        return (
            <>
                {renderList}
            </>
        )
    }
}
export default Action;
const actionList = [
    {
        title: '批改',
        type: 'edit',
        onClick: this.handleEdit
    },
    {
        title: '查看',
        type: 'eye',
        onClick: this.handleInfo
    },
    {
        title: '执行',
        type: 'play-circle',
        onClick: this.handleWork
    },
    {
        title: 'bug 列表',
        type: 'unordered-list',
        onClick: this.handleBugList
    },
    {
        title: '执行列表',
        type: 'unordered-list',
        onClick: this.handleWorkList
    },
    {
        title: '删除',
        type: 'delete',
        onClick: this.handleDelCase
    },
]
....
<Action actions={actionList} data={record} />
正文完
 0