У меня есть около 10 похожих компонентов на странице с разными именами. Каждый компонент рисуется циклом for и имеет несколько кнопок и данных.
Если я нажимаю одну кнопку на компоненте, он выполняет вызов API, и кнопки становятся отключенными до тех пор, пока вызов не будет выполнен успешно.
Проблема заключается в том, что если я нажму другую кнопку на другом компоненте, кнопка станет отключенной (что ожидается), но активирует ранее нажатую кнопку (не ожидается) при изменении setState. Как я могу включить кнопку только тогда, когда она находится в своем собственном состоянии успеха.
Вот почему я добавляю имена кнопок в состояние clickedRunButton, делая его объектом, но как добавить элементы в этот объект во время вызова API и удалить его во время успешного вызова.
Instead of adding another item its overwriting it.
this.state = {
clickedRunButton:{ pipeName :''}
}
onClickRun(params) {
const url = `/api/${params}/run`;
let clickedRunButton = Object.assign({},
this.state.clickedRunButton); //creating copy of object
return $.ajax({
type: 'POST',
url,
processData: false,
contentType: 'application/json',
beforeSend :() =>{
clickedRunButton.pipeName = params;
clickedRunButton[pipeName] = "run"+params;
this.setState({
clickedRunButton
})
},
success: (response) => {
if (!response.error) {
clickedRunButton.pipeName = params;
clickedRunButton[pipeName] = '';
this.setState({
clickedRunButton
})
}
},
error: (error) => {
}
});
}



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Взгляни на:
clickedRunButton.pipeName = params;
а также
clickedRunButton[pipeName] = "run"+params;
pipeName используется в clickedRunButton[pipeName] не определено. Это вызовет проблемы.
Вы можете присвоить переменную индексу в объекте следующим образом:
clickedRunButton[clickedRunButton.pipeName] = "run"+params
Надеюсь это поможет
Как сделать ключ в this.state параметрами??
@ user3594118 Ааа, я обновлю
вау это работает. Что делать, если мне нужно очистить значение? как в одном методе, я должен установить значение обратно в ''. Если я сделаю это в setState, это выдаст мне ошибку. ` _getPipelineStatus = (pipelineName) => { fetch(/api/ndp/v1/admin/pipelines/${pipelineName}) .then(res => res.json()) .then( (result) => { this.setState({ clickedRestartButton[pipelineName] : '' }); } }`
просто установите весь объект: this.setState({clickedRunButton})
О, на самом деле. Что я хочу сделать, так это создать объект, где ключом является имя конвейера, а значением является «запустить» + имя конвейера. Имя конвейера будет params