仿ant-design的react 原生初级表格组件(搜索,筛选,过滤,编辑等功能)

import React from 'react';
import Helmet from 'react-helmet';
import { Table, Modal, Tooltip, Input, message, Button, Tabs, Upload, Popconfirm } from 'antd';

import Header from '../../core/components/breadHead';
import xian from '../../core/lib/xian.js';

import { Pagination, UploadImage, SearchForm, ShowForm } from '../../xianModules/';
import { util } from '../../../utility/';
const log = [];
const headers = [{
            title: '员工号',
            key: 'staffNo',
            dataIndex: 'staffNo',
            render: (text, record) => xian.formatMoney(text),
        }, {
            title:'昵称',
            key: 'name',
            dataIndex: 'department',
        }, { 
            title:'姓名',
            key: 'realName',
            dataIndex: 'department',
            render: (text, record) => {
                return(<div><p>{text}</p><p>{record.role}</p></div>);
            },
        }, {
            title:'部门',
            key: 'department',
            dataIndex: 'department',
        }];
const obj = [{
    _id: 'Xvxej5HZj72k3P6uM',
    userId : 'zDWSxWYFXybQrbn93',
    staffNo : '18',
    name : 'kim',
    realName : 'kim',
    department : '运营部',
    role : '工作人员',
    remark : '暂无',
    createdAt : '2016-11-28T03:17:59.300Z',
    isRemoved : true
}, {
    _id: 'Xvxej5HZj72k3P6uM',
    userId : 'axCpbEN99jsmCpZER',
    staffNo : '22',
    name : 'leo',
    realName : 'leo',
    department : '运营部',
    role : '工作人员',
    remark : '暂无',
    createdAt : '2016-11-28T03:17:59.300Z',
    isRemoved : true
}, {
    _id: 'Xvxej5HZj72k3P6uM',
    userId : 'jfQpADo3PaMkjLfB8',
    staffNo : '02',
    name : '袁益琴',
    realName : '袁益琴',
    department : '采购部',
    role : '工作人员',
    remark : '暂无',
    createdAt : '2016-11-28T03:17:59.300Z',
    isRemoved : true
}, {
    _id: 'Xvxej5HZj72k3P6uM',
    userId : 'roiMQ8PHPQ8t3ERCr',
    staffNo : '53',
    name : 'kim',
    realName : '何庆',
    department : '鲜库',
    role : '工作人员',
    remark : '暂无',
    createdAt : '2016-11-28T03:17:59.300Z',
    isRemoved : true
}];
let preSearchData = [];
export default class Page extends React.Component {
    constructor(props) {
        super(props);
        this.state = {
            data: obj,
        }
    }
    componentWillMount() {
        // 加载component时执行
        const self = this;
        const { hasUser } = self.props;
        const { router } = self.context;

        if (!hasUser) {
            router.push('/login');
        }
        this.logSetState();
    }

    componentDidMount() {
        document.onkeydown = ((e) => {
            if (e.altKey && e.keyCode === 90) {
                this.replay();
            }
        });
    }
    replay() {
        if (log.length === 0) {
            console.warn('No State to replay');
            return;
        }
        let idx = -1;
        const interval = setInterval( function() {
            idx ++;
            if (idx === log.length - 1) {
                clearInterval(interval);
            }
            this.setState(log[idx]);
        }.bind(this), 2000);
    }
    logSetState (newState) {
        if (log.length < 20 ) {
            log.push( log.length === 0 ? this.state : newState );
        } else {
            log.splice(1, 1);
            log.push(newState);
        }
        // this.setState(newState);
    }
    handleTableChange(pagination, filters, sorter) {
        const { current, pageSize } = pagination;
        const { condition } = this.state;

        this.fetch({
            current,
            pageSize,
            condition,
        });
    }

    render() {
        const { data = obj, sortby, edit } = this.state;
       
        return (
            <div className="formatManage">
                <Helmet title="版式管理" />
                <Header option={[{
                    name: '商品',
                    path: '/reshelfManage',
                }, {
                    name: '版式管理',
                }]}/>
                <div className="content">
                    <button className="ant-btn ant-btn-primary" onClick={this.toogleSearch.bind(this)}>🔍搜索</button>
            
                    <table>
                        <thead onClick={this.sort.bind(this)}>
                            <tr>
                            {
                                headers.map((colum, index) => {
                                    return (<th key={index}>{colum.title}{ sortby === colum.key ? this.state.descending ? '\u2191' : '\u2193' : ''}</th>);
                                })
                            }
                            </tr>
                        </thead>
                        <tbody onDoubleClick={this.shorEditor.bind(this)}>
                            <tr onChange={this.search.bind(this)}>
                            {
                                headers.map((colum, index) => {
                                    return (<td key={index}><input key={colum.key} data-idx={index} type="text" /></td>);
                                })
                            }
                            </tr>

                            {
                                data.map((item, index) => {
                                    return (
                                        <tr key={index}>
                                        {
                                            headers.map((colum, idx) => {
                                                const value = item[colum.key];
                                                
                                                return (                 
                                                    <td key={idx} data-row={index}>
                                                       { colum.render ? colum.render(value, item) : value }
                                                    </td>        
                                                );
                                            })
                                        }
                                        </tr>
                                    );
                                })
                            }
                        </tbody>                       
                    </table>
                </div>
            </div>
        );
    }
    sort(e) {
        const column = headers[e.target.cellIndex].key;
        const datas = this.state.data.slice();
        const descending = this.state.sortby === column && !this.state.descending;
        datas.sort((a, b) => { 
            return descending ? a[column] > b[column] : a[column] < b[column];
        });
        this.setState({
            data: datas,
            sortby: column,
            descending: descending,
        });
        this.logSetState(this.state);
    }
    shorEditor(e) {
        this.setState({
            edit: {
                row: parseInt(e.target.dataset.row, 10),
                cell: e.target.cellIndex,
            },
        });
        this.logSetState(this.state);
    }
    handleChange(e) {
        // console.log(e.target.value);
        const data = this.state.data.slice();
        data[this.state.edit.row][headers[this.state.edit.cell].key] = e.target.value;
        this.setState({
            edit: null,
            data: data,
        });
    }
    toogleSearch(e) {
        if (this.state.search) {
            this.setState({
                data: preSearchData,
                search: false,
            });
            preSearchData = [];
        } else {
            preSearchData = this.state.data;
            this.setState({
                search: true,
            });
        }
        this.logSetState(this.state);
    }
    search(e) {
        if (this.state.search) {
            const needle = e.target.value.toLowerCase();
            if (!needle) {
                this.setState({
                    data: preSearchData,
                });
                return;
            }
            const idx = e.target.dataset.idx;
            // console.log(row[idx]);
            const searchdata = preSearchData.filter((row) => {
                // console.log(row[headers[idx].key]);
                return row[headers[idx].key].toString().toLowerCase().indexOf(needle) > -1;
            });
            this.setState({ data: searchdata });
            this.logSetState(this.state);
        }   
    }
}

Page.contextTypes = {
    router: React.PropTypes.object,
};

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,921评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,635评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,393评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,836评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,833评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,685评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,043评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,694评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,671评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,670评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,779评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,424评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,027评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,984评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,214评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,108评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,517评论 2 343

推荐阅读更多精彩内容