form icon indicating copy to clipboard operation
form copied to clipboard

如何用setFields为动态增减的表单项设置错误状态

Open Miss-violet opened this issue 6 years ago • 1 comments

这是需要动态增减的表单组件, 校验条件是不为空,且页面上的这个组件值不能重复:(其实就是将antd的动态增减表单项的代码拿来修改)

<Form.Item
                        label='关键词'
                        required={true}
                        key={`keyword[${k}]`}
                    >
                        {getFieldDecorator(`keyword[${k}]`, {
                            validateTrigger: ['onChange', 'onBlur'],
                            rules: [{
                                validator: (rule, value, callback) => this.validateKeyword(rule, value, callback, k),
                            }],
                            initialValue: keywordList[k] && keywordList[k].keyword
                        })(
                            <Input placeholder="请输入关键词" style={{ width: '60%', marginRight: 8 }} />
                            )}{
                            keys.length > 0 ? (
                                <span>
                                    <Icon
                                        type="plus-circle-o"
                                        onClick={() => this.add(index)}
                                        className={addStyles.addBtn}
                                    />
                                    {
                                        keys.length > 1 && index !== 0 && (
                                            <Icon
                                                className={addStyles.delBtn}
                                                type="minus-circle-o"
                                                disabled={keys.length === 1}
                                                onClick={() => this.remove(k)}
                                            />
                                        )
                                    }
                                </span>
                            ) : null}
                    </Form.Item>

这是remove事件:

remove = (k) => {
        const { form } = this.props;
        // can use data-binding to get
        const keys = form.getFieldValue('keys');

        // We need at least one passenger
        if (keys.length === 1) {
            return;
        }

        const removeValue = form.getFieldValue('keyword')[k]

        // can use data-binding to set
        form.setFieldsValue({
            keys: keys.filter(key => key !== k),
        }, () => {
            /* 这里的写法会报错 */
            // form.setFields({
            //     `keyword[${k}]`:{
            //         value: removeValue,
            //         errors:[],
            //     }
            // })
        });
    }

假如有操作: 1、add一个值为1的关键字(key假设为0) 2、再add一个值为1的关键字(key假设为1) 3、此时表单会在key为1的组件下提示“重复” 4、remove key 为 0 的组件(期待:key 为 1 的组件下的提示可以被移除)

现在的问题是,需要被移除的组件叫 keywork[${k}],但是 setFields 好像并不支持这种写法

Miss-violet avatar Apr 01 '19 09:04 Miss-violet

我也遇到这个问题,报错信息 fields.reduce is not a function

leehomeok avatar Jun 12 '19 08:06 leehomeok