React配合Immutable.js实现动态增减表单项

import React from 'react';
import {withStyles} from '@material-ui/core/styles';
import {List} from 'immutable';

import {
    Button,
    Icon,
    FormControl,
    InputLabel,
    Input,
    FormHelperText
} from '@material-ui/core';

const styles = (theme) => ({
    wrap: {
        marginBottom: theme.typography.pxToRem(16),
        display: 'flex',
        justifyContent: 'space-between',
        alignItems: 'center'
    },
    formControl: {
        width: '100%',
        '&:first-child': {
            marginRight: 20
        }
    },
    addCustom: {
        textAlign: 'center'
    }
});

@withStyles(styles)
class AddCustomField extends React.Component {
    state = {
        customList: [
            {
                key: '',
                value: '',
                errKeyStatus: false,
                errKeyMsg: '请输入自定义属性',
                errValueStatus: false,
                errValueMsg: '请输入自定义属性'
            }
        ]
    };

    componentWillReceiveProps(nextProps) {
        let custom = nextProps.customFieldsValue;
        if (custom !== null) {
            let customList = [];
            for (let cusKey in custom) {
                customList.push({
                    key: cusKey,
                    value: custom[cusKey],
                    errKeyStatus: false,
                    errKeyMsg: '请输入自定义属性',
                    errValueStatus: false,
                    errValueMsg: '请输入自定义属性'
                });
            }
            this.setState({
                customList
            });
        }
    }

    addCustomField = () => {
        this.setState({
            customList: [...this.state.customList, {key: '', value: '', errKeyStatus: false, errKeyMsg: '请输入自定义属性', errValueStatus: false, errValueMsg: '请输入自定义属性'}]
        })
    };

    handleDelete = (index) => () => {
        let {customList} = this.state;
        let list = List(customList);
        this.setState({
            customList: list.delete(index).toJS()
        });
    };

    handleKey = (index) => (e) => {
        let {customList} = this.state;
        let list = List(customList);
        let key = e.target.value;
        list.update(index, (val) => {
            val.key = key;
            val.value = customList[index].value;
            return val;
        });
        this.setState({
            customList: list.toJS()
        });
    };

    handleValue = (index) => (e) => {
        let {customList} = this.state;
        let list = List(customList);
        let value = e.target.value;
        list.update(index, (val) => {
            val.key = customList[index].key;
            val.value = value;
            return val;
        });
        this.setState({
            customList: list.toJS()
        });
    };

    handleCheckKey = (index, cusKey) => (e) => {
        let {customList} = this.state;
        let list = List(customList);
        let key = cusKey || e? e.target.value : '';
        if (key === '') {
            list.update(index, (val) => {
                val.errKeyStatus = true;
                val.errKeyMsg = '自定义属性名不能为空';
                return val;
            });
        } else {
            list.update(index, (val) => {
                val.errKeyStatus = false;
                val.errKeyMsg = '请输入自定义属性';
                return val;
            });
        }
        this.setState({
            customList: list.toJS()
        });
    };

    handleCheckValue = (index, cusValue) => (e) => {
        let {customList} = this.state;
        let list = List(customList);
        let value = cusValue || e? e.target.value : '';
        if (value === '') {
            list.update(index, (val) => {
                val.errValueStatus = true;
                val.errValueMsg = '自定义属性值不能为空';
                return val;
            });
        } else {
            list.update(index, (val) => {
                val.errValueStatus = false;
                val.errValueMsg = '请输入自定义属性';
                return val;
            });
        }
        this.setState({
            customList: list.toJS()
        });
    };

    handleCheckAll = () => {
        let {customList} = this.state;
        if (customList.length === 0) {
            return true;
        }
        customList.forEach((item, index) => {
            this.handleCheckKey(index, item.key)();
            this.handleCheckValue(index, item.value)();
        });
        return customList.every((item) => {
            return !item.errKeyStatus && !item.errValueStatus
        });
    };

    render() {
        const {classes, isDisabled} = this.props;
        let {customList} = this.state;
        return (
            <div>
                {
                    customList.map((item, index) => {
                        return (
                            <div className={classes.wrap} key={index}>
                                <FormControl className={classes.formControl} disabled={isDisabled} error={item.errKeyStatus}>
                                    <InputLabel>属性名</InputLabel>
                                    <Input
                                        value={item.key}
                                        onChange={this.handleKey(index)}
                                        onBlur={this.handleCheckKey(index)}
                                    />
                                    <FormHelperText>{item.errKeyMsg}</FormHelperText>
                                </FormControl>
                                <FormControl className={classes.formControl} disabled={isDisabled} error={item.errValueStatus}>
                                    <InputLabel>属性值</InputLabel>
                                    <Input
                                        value={item.value}
                                        onChange={this.handleValue(index)}
                                        onBlur={this.handleCheckValue(index)}
                                    />
                                    <FormHelperText>{item.errValueMsg}</FormHelperText>
                                </FormControl>
                                {
                                    isDisabled? (null) : (
                                        <Icon style={{cursor: 'pointer'}} color='secondary' onClick={this.handleDelete(index)}>delete_forever</Icon>
                                    )
                                }
                            </div>
                        )
                    })
                }
                <div className={classes.addCustom}>
                    <Button variant='raised' color="primary" onClick={this.addCustomField}>添加自定义项</Button>
                </div>
            </div>
        )
    }
}

export default AddCustomField;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以使用state来管理表单,通过setState方法动态添加或删除表单。 示例代码: ```jsx import React, { useState } from 'react'; function DynamicForm() { const [formFields, setFormFields] = useState([{ name: '', age: '' }]); // 初始表单 const handleAddFields = () => { setFormFields([...formFields, { name: '', age: '' }]); // 添加一表单 }; const handleRemoveFields = (index) => { const newFormFields = [...formFields]; newFormFields.splice(index, 1); // 删除指定位置的表单 setFormFields(newFormFields); }; const handleChange = (index, event) => { const { name, value } = event.target; const newFormFields = [...formFields]; newFormFields[index][name] = value; // 修改指定位置的表单的指定属性值 setFormFields(newFormFields); }; const handleSubmit = (event) => { event.preventDefault(); console.log(formFields); // 提交表单数据 }; return ( <form onSubmit={handleSubmit}> {formFields.map((formField, index) => ( <div key={index}> <input type="text" name="name" value={formField.name} onChange={(event) => handleChange(index, event)} /> <input type="text" name="age" value={formField.age} onChange={(event) => handleChange(index, event)} /> <button type="button" onClick={() => handleRemoveFields(index)}>删除</button> </div> ))} <button type="button" onClick={handleAddFields}>添加</button> <button type="submit">提交</button> </form> ); } export default DynamicForm; ``` 在上面的示例中,我们使用useState来管理表单的状态。初始表单为一个包含name和age属性的对象数组。通过handleAddFields和handleRemoveFields方法来动态添加和删除表单,这些方法都是通过setState方法更新表单状态来实现的。handleChange方法用于修改表单中的属性值,这个方法也是通过setState方法更新表单状态来实现的。handleSubmit方法用于提交表单数据。最后,我们在render函数中使用map方法遍历表单数组,动态渲染表单。每个表单都有一个删除按钮,点击按钮时会调用handleRemoveFields方法删除对应的表单。添加按钮则会调用handleAddFields方法添加一表单。提交按钮则会调用handleSubmit方法提交表单数据。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值