Значение ReactJS не сохраняется в цикле for при использовании встроенного html

#javascript #html #reactjs #primereact

#javascript #HTML #reactjs #primereact

Вопрос:

у меня небольшая проблема с этим фрагментом кода (с использованием PrimeReact):

     let dropDownOptions = [];
    for(var i = 0; i<this.state.filter_bonus.length;i  ){
        var filter_option = this.state.filter_bonus[i];
        dropDownOptions.push(
            <React.Fragment>
            <Dropdown value={filter_option.type.bonus_name} 
                options={this.state.bonus_map} 
                onChange={(e) => this.updateTypeFilterAtIndex(e.value,i)} 
                optionLabel="bonus_name" 
                filter showClear filterBy="bonus_name" 
                placeholder="Select a Bonus" />
            <span>
                <InputNumber value={filter_option.value} 
                onValueChange={(e) => this.updateValueFilterAtIndex(e.value,i)} 
                mode="decimal" showButtons min={0} max={100} />
            </span>    
            </React.Fragment>
        );
    }
 

Предполагается, что это создает несколько выпадающих списков и сохраняет значения в переменной состояния списка для чтения с использованием ее индекса. Это функция, вызываемая при выборе какой-либо опции.

 updateTypeFilterAtIndex(val,index){
    let new_arr = [...this.state.filter_bonus];
    console.log(index);
    new_arr[index]['type'] = val;
    this.setState({filter_bonus: new_arr});
}
 

Это результат,

введите описание изображения здесь

Но проблема здесь в том, что, когда я выбираю какой-либо параметр, например, в первом выпадающем списке, значение «i» в цикле for равно 0, хотя при запуске (e) => this.updateTypeFilterAtIndex(e.value,i) onChange переданное значение «i» будет равно 1 вместо 0. Таким образом, он будет ссылаться на неправильный выпадающий список. Это происходит со всеми выпадающими списками, похоже, что значение, сохраненное в обратном вызове, на одну итерацию впереди. Это нормально или это ошибка в React? Я проверял кучу раз, и все выглядит нормально.

Ответ №1:

У меня была аналогичная проблема. Попробуйте использовать forEach() вместо использования цикла for . Пример:

 this.state.filter_bonus.forEach((item, index)=>{
...
})