Ant Design table設(shè)置自定義排序表頭和對字段進(jìn)行隱藏

react + antd 動態(tài)設(shè)置表頭和對表頭進(jìn)行排序
1孝治、對title字段設(shè)置顯示隱藏;


字段隱藏.gif

2、對title字段進(jìn)行拖拽排序;


拖動排序.gif

3薛耻、選擇后未點(diǎn)擊確認(rèn)關(guān)閉彈框則重置數(shù)據(jù)
重置設(shè)置.gif
import React, { Component } from "react";
import {
  Icon,
  Table,
  Button,
  Card,
  Tree,
} from "antd";

const { TreeNode } = Tree;

export default class Main extends React.Component {
  constructor(props) {
    super(props);
    let plainOptions = [
      {
        title: "表頭1",
        key: "bt1"
      },
      {
        title: "表頭2",
        key: "bt2"
      },
      {
        title: "表頭3",
        key: "bt3"
      },
      {
        title: "表頭4",
        key: "bt4"
      },
      {
        title: "表頭5",
        key: "bt5"
      }
    ];//模擬接口請求的字段列表
    let checkedOptions = ["bt1", "bt2", "bt3", "bt4", "bt5"];//模擬接口請求的已選擇字段
    this.state = {
      page_size: 10,
      page: 1,
      totalPage: 1,
      totalCount: 1,
      plainOptions, //默認(rèn)的字段列表
      checkedOptions, //默認(rèn)的已選擇字段
      editPlainOptions: plainOptions, //當(dāng)前選擇的字段列表营罢,未保存
      editCheckedOptions: checkedOptions, //當(dāng)前已選擇字段赏陵,未保存
      isClickHandleSearch:'',//設(shè)置字段后在未保存的情況下點(diǎn)擊空白區(qū)域字段重置
    };
  }

  onFilterDropdownVisibleChange = (visible, type) => {
    if (visible && !this.state.isClickHandleSearch) {
      this.setState({
        isClickHandleSearch: false
      });
    } else {
      this.setState({
        plainOptions: this.state.editPlainOptions,
        checkedOptions: this.state.editCheckedOptions
      });
    }
  };
  handleSearch = confirm => {
    //確定 保存用戶設(shè)置的字段排序和需要顯示的字段key
    const { plainOptions, checkedOptions } = this.state;
    this.setState(
      {
        isClickHandleSearch: true,
        editPlainOptions: plainOptions,
        editCheckedOptions: checkedOptions
      },
      () => {
        confirm();
      }
    );
  };

  handleReset = clearFilters => {
    //用戶點(diǎn)擊取消按鈕饼齿,重置字段
    clearFilters();
    this.setState({
      plainOptions: this.state.editPlainOptions,
      checkedOptions: this.state.editCheckedOptions
    });
  };

  onCheck = (checkedKeys) => {
    this.setState({
      checkedOptions: checkedKeys
    });
  };

  onDrop = info => {
    const dropKey = info.node.props.eventKey;
    const dragKey = info.dragNode.props.eventKey;
    const dropPos = info.node.props.pos.split("-");
    const dropPosition =
      info.dropPosition - Number(dropPos[dropPos.length - 1]);
    if (dropPosition === 1 || dropPosition == -1) {
      const loop = (data, key, callback) => {
        data.forEach((item, index, arr) => {
          if (item.key === key) {
            return callback(item, index, arr);
          }
          if (item.children) {
            return loop(item.children, key, callback);
          }
        });
      };
      const data = [...this.state.plainOptions];
      let dragObj;
      loop(data, dragKey, (item, index, arr) => {
        arr.splice(index, 1);
        dragObj = item;
      });
      let ar;
      let i;
      loop(data, dropKey, (item, index, arr) => {
        ar = arr;
        i = index;
      });
      if (dropPosition === -1) {
        ar.splice(i, 0, dragObj);
      } else {
        ar.splice(i + 1, 0, dragObj);
      }
      this.setState({
        plainOptions: data
      });
    }
  };

  render() {
    const {
      inquiry_list,
      page,
      page_size,
      totalCount,
      plainOptions,
      checkedOptions
    } = this.state;
    const loop = data =>
      data.map((item, index) => {
        return <TreeNode key={item.key} title={item.title} />;
      });
    const title_list = [
      {
        title: "表頭1",
        dataIndex: "bt1",
        key: "bt1",
        width: 170,
        filterType: checkedOptions.some(item => item === "bt1")
      },
      {
        title: "表頭2",
        dataIndex: "bt2",
        key: "bt2",
        width: 170,
        filterType: checkedOptions.some(item => item === "bt2")
      },
      {
        title: "表頭3",
        dataIndex: "bt3",
        key: "bt3",
        width: 170,
        filterType: checkedOptions.some(item => item === "bt3")
      },
      {
        title: "表頭4",
        dataIndex: "bt4",
        key: "bt4",
        width: 170,
        filterType: checkedOptions.some(item => item === "bt4")
      },
      {
        title: "表頭5",
        dataIndex: "bt5",
        key: "bt5",
        width: 170,
        filterType: checkedOptions.some(item => item === "bt5")
      }
    ];
    let new_title_list = [];
    let scrollX = 0;
    plainOptions.map(item => {
      title_list.map(titleItem => {
        if (item.title === titleItem.title) {
          new_title_list.push(titleItem);
          if (
            titleItem.width &&
            checkedOptions.some(optionsItem => optionsItem === item.key)
          ) {
            scrollX += titleItem.width;
          }
        }
      });
    });
    scrollX = scrollX + 160;
    new_title_list.push({
      title: "操作",
      key: "action",
      width: 160,
      align: "center",
      filterDropdown: ({ confirm, clearFilters }) => (
        <div style={{ padding: 8 }}>
          <Tree
            checkable
            className="draggable-tree"
            draggable
            blockNode
            selectable={false}
            onCheck={this.onCheck}
            checkedKeys={checkedOptions}
            onDrop={this.onDrop.bind(this)}
          >
            {loop(plainOptions)}
          </Tree>
          <div>
            <Button
              type="primary"
              size="small"
              onClick={() => this.handleSearch(confirm)}
              style={{ width: "60px", marginRight: "10px" }}
            >
              確定
            </Button>
            <Button
              size="small"
              onClick={() => this.handleReset(clearFilters)}
              style={{ width: "60px" }}
            >
              取消
            </Button>
          </div>
        </div>
      ),
      filterIcon: filtered => <Icon type="setting" theme="filled" />,
      onFilterDropdownVisibleChange: this.onFilterDropdownVisibleChange.bind(
        this
      ),
      render: item => {
        return <div>查看</div>;
      }
    });
    return (
      <div>
        <Card>
          <Table
            rowKey="id"
            columns={new_title_list.filter(
              item => item.filterType || item.filterType === undefined
            )}
            dataSource={inquiry_list || []}
            pagination={{
              current: page,
              total: totalCount,
              pageSize: page_size,
              showQuickJumper: true,
              showSizeChanger: true,
              pageSizeOptions: ["10", "20", "50", "100"],
              showTotal: this.showTotal
            }}
            scroll={{ x: scrollX }}
          />
        </Card>
      </div>
    );
  }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市蝙搔,隨后出現(xiàn)的幾起案子缕溉,更是在濱河造成了極大的恐慌,老刑警劉巖吃型,帶你破解...
    沈念sama閱讀 206,214評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件证鸥,死亡現(xiàn)場離奇詭異,居然都是意外死亡勤晚,警方通過查閱死者的電腦和手機(jī)枉层,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來赐写,“玉大人鸟蜡,你說我怎么就攤上這事⊥ρ” “怎么了揉忘?”我有些...
    開封第一講書人閱讀 152,543評論 0 341
  • 文/不壞的土叔 我叫張陵,是天一觀的道長端铛。 經(jīng)常有香客問我泣矛,道長,這世上最難降的妖魔是什么禾蚕? 我笑而不...
    開封第一講書人閱讀 55,221評論 1 279
  • 正文 為了忘掉前任您朽,我火速辦了婚禮,結(jié)果婚禮上换淆,老公的妹妹穿的比我還像新娘虚倒。我一直安慰自己,他們只是感情好产舞,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,224評論 5 371
  • 文/花漫 我一把揭開白布魂奥。 她就那樣靜靜地躺著,像睡著了一般易猫。 火紅的嫁衣襯著肌膚如雪耻煤。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,007評論 1 284
  • 那天准颓,我揣著相機(jī)與錄音哈蝇,去河邊找鬼。 笑死攘已,一個胖子當(dāng)著我的面吹牛炮赦,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播样勃,決...
    沈念sama閱讀 38,313評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼吠勘,長吁一口氣:“原來是場噩夢啊……” “哼性芬!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起剧防,我...
    開封第一講書人閱讀 36,956評論 0 259
  • 序言:老撾萬榮一對情侶失蹤植锉,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后峭拘,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體俊庇,經(jīng)...
    沈念sama閱讀 43,441評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,925評論 2 323
  • 正文 我和宋清朗相戀三年鸡挠,在試婚紗的時候發(fā)現(xiàn)自己被綠了辉饱。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,018評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡拣展,死狀恐怖鞋囊,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情瞎惫,我是刑警寧澤溜腐,帶...
    沈念sama閱讀 33,685評論 4 322
  • 正文 年R本政府宣布,位于F島的核電站瓜喇,受9級特大地震影響挺益,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜乘寒,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,234評論 3 307
  • 文/蒙蒙 一望众、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧伞辛,春花似錦烂翰、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至竿滨,卻和暖如春佳恬,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背于游。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評論 1 261
  • 我被黑心中介騙來泰國打工毁葱, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人贰剥。 一個月前我還...
    沈念sama閱讀 45,467評論 2 352
  • 正文 我出身青樓倾剿,卻偏偏與公主長得像,于是被迫代替她去往敵國和親蚌成。 傳聞我的和親對象是個殘疾皇子前痘,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,762評論 2 345

推薦閱讀更多精彩內(nèi)容