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组件(待完成)

参考 Form 和 rc-form

使用mapPropsToFields和onFieldsChange的校验问题

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

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

let fieldPropsOptions = {
    validate: validateArray
};
...

    ;

...
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 
; } } 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 (
); } }

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浏览器就不会有这个问题。很奇怪!

你可能感兴趣的:(Ant Design 组件学习经验)