美文网首页让前端飞优美编程
封装重复的逻辑,而非封装重复的代码

封装重复的逻辑,而非封装重复的代码

作者: 小遁哥 | 来源:发表于2020-06-07 18:50 被阅读0次

    0

    "重复的逻辑" 和 "重复的代码" 是两种相对的状态,可以通过共性来衡量,看到"足够多" 的共性是封装的前提。

    共性是指在某一个角度上,不同的事物可以被看成相同的。

    人和狗的共性是同为动物,人和沙子的共性是同为地球上的物质,当共性抽象到这种程度,我们应该反思自己的封装是否过渡了。

    1

    看一个封装重复代码的例子

    实现代码

    <Pagination
      current={current}
      pageSize={pageSize}
      total={total}
      pageSizeOptions={['20', '50', '100']}
      showQuickJumper={true}
      showSizeChanger={true}
      showTotal={this.showTotal}
      onChange={this.onChange}
      onShowSizeChange={this.onShowSizeChange}
    />
      private showTotal = (total: number) => {
        return `总数:${total}`;
      };
    

    结果下一个页面分页器还是这个鬼样子,我又连续看了几张设计图,都是这样,是时候展现真正的技术了。

    PagePagination.tsx

    interface PagePaginationProps {
      current: number;
      pageSize: number;
      total: number;
      pageSizeOptions?: string[];
      onChange?: (page: number, pageSize?: number) => void;
      onShowSizeChange?: (current: number, size: number) => void;
    }
    
      public render() {
        const {
          current,
          pageSize,
          total,
          pageSizeOptions,
          onChange,
          onShowSizeChange,
        } = this.props;
        return (
          <Pagination
            current={current}
            pageSize={pageSize}
            total={total}
            pageSizeOptions={pageSizeOptions || ['20', '50', '100']}
            showQuickJumper={true}
            showSizeChanger={true}
            showTotal={this.showTotal}
            onChange={onChange}
            onShowSizeChange={onShowSizeChange}
          />
        );
      }
      private showTotal(total: number) {
        return `总数:${total}`;
      }
    

    使用的时候只需要

      public render() {
        const { current, pageSize, total } = this.state;
        return (
          <PagePagination
            current={current}
            pageSize={pageSize}
            total={total}
            onChange={this.onChange}
            onShowSizeChange={this.onShowSizeChange}
          ></PagePagination>
        );
      }
    

    2

    然并卵,上面的封装过于刚性。

    这里的共性是什么?无非是给antdPagination组件一些默认行为。

    PagePaginationProps直接继承PaginationProps,没必要自己写一遍

    import { PaginationProps } from 'antd/lib/pagination';
    interface PagePaginationProps extends PaginationProps {}
    

    通过defaultProps 设置默认值

    const defaultPageSize = '20';
    ...
    static defaultProps = {
        pageSize: defaultPageSize,
        pageSizeOptions: [defaultPageSize, '50', '100'],
        showQuickJumper: true,
        showSizeChanger: true,
        showTotal: (total: number) => {
          return `总数:${total}`;
        },
      };
    ...
    
      public render() {
        return <Pagination {...this.props} />;
      }
    

    它是灵活的,可以满足一些特殊页面的需求。

    试着去寻找重复代码中的共性吧!

    诸天气浩荡,我道日兴隆

    轻松一刻

    相关文章

      网友评论

        本文标题:封装重复的逻辑,而非封装重复的代码

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