Ant Design 组件学习经验

Tree组件

参考 TreeSelect

异步加载数据

使用redux时,TreeSelect异步加载数据需要通过触发action调用后台获取数据,根据reducer更新的state显示出加载的数据。需添加loadData属性,值为一个方法,如onLoadData,内容如下。
这个函数的返回值好像必须是一个Promise对象,如果不这么写,会报Uncaught TypeError: Cannot read property 'then' of undefined(…)

onLoadData(treeNode) {
    return new Promise((resolve) => {
        // 树形显示的数据在this.state.treeData中,在this.state.treeData中找到当前操作节点
        const pathArr = treeNode.props.pos.split('-');
        let findTreeNode = null;
        for (let i=1,len=pathArr.length; i < len ; i++) {
            if( i === 1){
                findTreeNode = this.state.treeData[pathArr[i]];
            } else {
                findTreeNode = findTreeNode.children[pathArr[i]];
            }
        }
        // 如果该节点没有子节点,表示没加载过其子节点,进行加载
        if (findTreeNode.children.length <= 0) {
            // 设置展开的节点为当前节点
            this.state.openKey = treeNode.props.eventKey;
            // 组织后台查询条件
            const queryData = {
                LEVEL: 1, // TODO  不知道什么规则
                _extWhere: this.state.queryData._extWhere,
                PID: treeNode.props.eventKey,
                NAME: treeNode.props.title,
                checkstate: ''
            }
            const dict = {
                dictId: this.state.dictId,
                dictData: this.props.dict.dictData
            }
            // 发起action,获取数据
            this.props.updataDictByPid(this.props.servId, this.props.itemCode, objectUtils.clone(dict), queryData, this.props.servType, this.props.opeCode, this.props.queryServId);
        }
        resolve();
        });
    }

Form组件(待完成)

参考 Formrc-form

使用mapPropsToFields和onFieldsChange的校验问题

Form组件如下方式使用,获取不到校验信息了,浏览器的控制台会有打印的校验结果,但没有反映在页面上,但如果不使用mapPropsToFields是好使的。

// 必填校验
const validateArray = [{
    rules: [{
        required: true,
        message: '邮箱必填'
    }],
    trigger: ['onChange']
}];

let fieldPropsOptions = {
    validate: validateArray
};
...
<FormItem
    label="email"
    validateStatus={getFieldError('email') ? 'success' : 'error'}
    help={isFieldValidating('email') ? '' : errMessage}
>
    <Input {...getFieldProps('email', fieldPropsOptions)} />;
</FormItem>
...
NewForm = Form.create({onFieldsChange, mapPropsToFields})(NewForm);

解决方法是调用Form组件是传入一个props及更新该props的方法,如formErrItem、updateFormErrItem,在onFieldsChange中添加

function onFieldsChange(props, fields){
    // 调用父组件更新formErrItem的方法
    const newFormErrItem = {
        ...props.formErrItem,
        ...fields,
    };
    props.updateFormErrItem(newFormErrItem);
    ...
}

在Form组件中通过,this.props.formErrItem可获取校验信息。

ref引用

在使用Form组件时,在Form.create时需要添加withRef: true才能获取到组件内部定义的方法或state。

// MyForm.jsx中,定义了 MyForm 组件,是对Form组件的封装,返回的是antd的Form组件。
class MyForm extends Component {
    render() {
        return <Form />;
    }
}
MyForm = Form.create({onFieldsChange, mapPropsToFields, withRef: true})(MyForm);
export default MyForm;
// App.jsx中,引用了MyForm组件,如果要引用到MyForm组件内部定义的方法或state,需要使用如下方式。
class App extends Component {
    clickHandler() {
        // 引用MyForm组件中定义的方法或state
        const formRef = this.refs.myForm.refs.wrappedComponent.refs.formWrappedComponent;
    }
    render() {
        return (
            <div>
                <MyForm ref="myForm" />
                <Button onClick={this.clickHandler.bind(this)}>点击</Button>
            </div>
        );
    }
}


Table组件

参考 Table

单选

如果Table组件中要进行单选,需要进行如下配置:

  • 将Table组件rowSelection属性的type值设置为radio,当前选中的数据由radioIndex控制
  • 注意,ant-design的Table组件,对于单选类型的,无法自己管理radioIndex值,如果想要自己管理radioIndex值,需要在Table组件中添加如下代码
if (('radioIndex' in nextProps) && nextProps.radioIndex !== null ) {
    this.setState({
        radioIndex: nextProps.radioIndex || null
    });
}

行样式

Table组件的rowClassName属性,如:rowClassName={(record, index) => record['_delete_'] ? 'ant-table-row-delete' : '' }

不显示页码

Table组件的pagination属性为false

pagination

pagination.pageSize不为10、20、30、40中的值时,分页处显示的只有一个值,如15,而不是像10 条/页这样
需要给Table组件传入的pagination中有自定义的pageSizeOptions属性,该属性的值为所有需要显示的每页条数的数组

列表勾选行样式问题

在勾选列表行的checkbox或是列表可编辑的下拉框时,点击所在的行会发生颜色抖动,直接运行官方例子也有这个问题。后来发现可能是Chrome浏览器的问题,如果用360浏览器就不会有这个问题。很奇怪!

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