У меня есть компонент React, который принимает произвольное количество файлов, каждый на своем языке. Я хочу иметь кнопку, которая позволяет пользователю добавлять столько файлов, сколько они хотят, каждый со своим собственным раскрывающимся меню языков. На данный момент я исключил загрузку файлов, так как изолирую проблему, которая у меня возникла.
Я уже создал довольно много подобных компонентов без проблем, но по какой-то причине у меня большие проблемы с этим. Когда я меняю язык в раскрывающемся списке, я консолью состояние журнала и вижу, что язык обновлен в состоянии, но он не обновляется в DOM в моем методе карты.
Вот мой код
function App() {
const [files, setFiles] = useState([]);
const languages = ["English", "Spanish", "Arabic", "French"];
const handleAddFile = e => {
let newFiles = files;
newFiles.push({
content: null,
preview: null,
language: ""
});
setFiles(newFiles);
};
const changeLanguage = (event, index) => {
let newFiles = files;
newFiles[index].language = event.target.value;
setFiles(newFiles);
};
console.log(files);
return (
<div>
<p>Files</p>
<p>Upload a file for as many languages as you have</p>
{files.map((file, index) => (
<div key={index}>
<p>current language: {file.language}</p>
<select
value={file.language}
onChange={event => changeLanguage(event, index)}
>
<option value="" disabled>
Select a language
</option>
{languages.map((lang, i) => (
<option value={lang} key={i}>
{lang}
</option>
))}
</select>
</div>
))}
<button onClick={e => handleAddFile(e)}>+ Add File</button>
</div>
);
}
Я также сделал codeandbox, чтобы воспроизвести проблему, но на самом деле это еще больше усложняет ситуацию. Когда я запускаю код локально, я могу легко добавлять экземпляры файлов, но язык в элементе select не обновляется в DOM ни для одного экземпляра. В codeandbox ничего не обновляется в DOM, если я не внесу правку в редакторе, а затем все обновится так, как я ожидал, включая язык. Во всех случаях состояние регистрируется в консоли точно так, как я ожидал. Компонент в песочнице идентичен тому, что есть у меня локально, хотя локально он встроен в другой компонент.
handleAddFile
, иchangeLanguage
изменяют состояние. Это предотвратит повторную визуализацию, потому что response не увидит, что состояние изменилось. - person Brian Thompson   schedule 15.05.2020