Динамическое поле формы отображается с предыдущим значением в реакции - PullRequest
0 голосов
/ 24 мая 2019

Я пытаюсь создать динамические параметры, используя избыточную форму. До сих пор я создал объект в виде массива объектов в состоянии, названном параметрами, и теперь я могу создавать и удалять параметры, каждыйКогда я нажимал на кнопку «Добавить опцию», я просто помещал пустой объект опции в состояние объекта опций, то же самое будет и с удалением при нажатии на «Удалить», удаляя / удаляя этот конкретный объект опции индекса из опций состояния.

Теперь здесь идет проблема часть, когда я удаляю варианты в порядке.но если у моего удаленного поля опций есть некоторые значения, то когда я нажимаю на кнопку добавления, появляется новая опция, которая уже имеет значение (которое также было удалено из состояния), что я хочу, это удалить это значение из этой новой опции.

Я также попытался удалить значение onFocus, но ничего не решило мою проблему, я использую библиотеку material-ui для пользовательского интерфейса.

class AddQuestion extends React.Component {

    constructor(props) {
        super(props);

        this.state = {
            isMultiChoice : false,
            options : [
                {
                    option : 'Option 1',
                    correct : false,
                    actors : []
                }
            ],
            actors : [],
            lengthErr : '',
        }

        this.handleChoiceChange = this.handleChoiceChange.bind(this);
        this.addQuestion = this.addQuestion.bind(this);
        this.handleInitialize = this.handleInitialize.bind(this); 

        this.addOption      = this.addOption.bind(this);
        this.removeOption = this.removeOption.bind(this);  
        this.handleActorOptionChange = this.handleActorOptionChange.bind(this); 
        this.handleOptionTextChange = this.handleOptionTextChange.bind(this);  
    }


    async removeOption(optionIndex) {
        await this.setState((prevState) => {
            let options = prevState.options;  
            options.splice(optionIndex, 1);

            return {
                options : options
            }
        }); 
    }

    async addOption() {
        await this.setState((prevState) => { 
            return {
                options : [
                    ...prevState.options,
                        {
                        option : 'Option new ',
                        correct : false,
                        actors : []
                    }
                ]
            }   
        });
    }

    handleOptionTextChange(event, optionIndex) { 

        let optionText = event.target.value;
        let options = this.state.options
        options[optionIndex].option = optionText;
        this.setState({options : options});
    }


    render() {  
        const  { classes, handleSubmit, errorMessage, isLoading} = this.props; 

        return ( 
            <Grid container style={{ 'margin' : '20px','width':'auto'}}>
                <form onSubmit={handleSubmit(this.addQuestion)} style={{'width':'100%'}} > 
                    <FormControl margin="normal" required fullWidth> 
                        <Field
                            name="video"
                            disabled
                            label={this.props.videoRow.title}
                            style={Style.widthAuto}
                            component={RenderTextField}
                        /> 
                    </FormControl>


                    <RenderOptions 
                        addOption={this.addOption}
                        removeOption={this.removeOption}
                        options={this.state.options}
                        handleOptionTextChange={this.handleOptionTextChange}
                    /> 



                    <FormControl margin="normal" required> 
                        <Button
                          type="submit" 
                          variant="contained"
                          color="primary" 
                          disabled={isLoading}
                          size="large"
                        >
                            {isLoading === true ? <Loader/> : ''} 
                            <SaveIcon /> Save
                        </Button>
                    </FormControl>
                </form>
            </Grid> 
        )       
    }
}

export default reduxForm({
    form : 'addQuestionForm',
    validate 
})(AddQuestion);

export const RenderOptions = (props) => { 
  return (
        props.options.map((option, index) => { 
            let optionText = 'options[' + index + ']';
            let optionCorrect = 'options[' + index + '].correct';
            let label = 'Option ' + (index + 1);
            return (
            <Grid key={index} container item> 
                <Field
                    name={optionText}
                    value={optionText}
                    label={label}
                    onChange={(e) => props.handleOptionTextChange(e, index)} 
                    style={Style.width40}
                    component={RenderTextField}
                    required    
                />

                <Field
                    name={optionCorrect} 
                    style={Style.timeInput}
                    component={RenderCheckboxField} 
                />

                {(props.options.length !== 1) ? 
                    <Button
                        size="small"  
                        style={Style.widthAuto} 
                        onClick={() => props.removeOption(index)} 
                    >
                        <RemoveCircleIcon/>
                    </Button> 
                    : ''
                }
                {(props.options.length === (index + 1) && props.options.length < 4) ?
                    <Button
                        size="small" 
                        style={Style.widthAuto} 
                        onClick={() => props.addOption()} 
                    >
                        <AddCircleIcon/>
                    </Button>
                    : ''
                }  
            </Grid>
            )  
        })
    )
}

export const RenderTextField = (props) => {
    const { input, label ,meta : {touched, invalid, error }, ...custom} = props;
    // console.log('Getting ', input);
    return (
        <TextField
            {...custom}
            {...input}
            label={label}
            placeholder={label}
            error={touched && invalid}
            helperText={touched && error} 
        />
    )
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...