【发布时间】:2020-08-24 21:13:03
【问题描述】:
我有一个输入文本如下(MovieInput.tsx):
<input
id="inputMovieTitle"
type="text"
onChange={ e => titleHandleChange(e) }
value={ getTitle() }>
</input>
titleHandleChange:
const [title, setTitle] = useState('');
const titleHandleChange = (e: ChangeEvent<HTMLInputElement>) => {
setTitle(e.target.value);
}
获取标题:
const moviesInState = useSelector((state: any) => state.movies);
const getTitle = () => {
console.log(moviesInState.item.title); // It displays correct movie title from the store corresponding to the selected row
return moviesInState.item.title;
}
我有一个表格 (Grid.tsx),其中列出了该州 (state.movies.items[]) 中的所有电影。当我单击该表中的任何电影行时,所选电影将在商店中更新,即 state.movies.item。
Grid.tsx:
const dispatch = useDispatch();
const selectMovie = (movie: Movie) => {
const movieSelected: Movie = {
_id: movie._id,
__v: movie.__v,
title: movie.title,
rating: movie.rating,
year: movie.year
}
dispatch(getMovie(movieSelected));
}
...
<tbody>
{
props.allMovies.map((movie: Movie) =>
<tr onClick={() => selectMovie(movie)}>
<td>{movie.title}</td>
<td>{(+movie.rating).toFixed(1)}</td>
<td>{movie.year}</td>
</tr>
)
}
</tbody>
现在,当我单击表 (Grid.tsx) 中的任何行时,它会更新 store 中的 store.movies.item,并且文本输入(在 MovieInput.tsx 中)显示所选电影的标题。当我更改所选行时,文本输入的值也会更新。
为什么要在文本输入中加载所选电影的标题文本?
因为,我应该能够编辑标题值并更新数据库中的记录。我选择任何行,更改其标题,然后单击“更新”按钮并保存。但是,尽管文本已成功填充到文本输入中并且在我们更改所选行时正确更改,但文本输入仍然“不可编辑”。这是由于以下代码:
value={ getTitle() }>
当我将 'value' 更改为 'defaultValue' 时,我可以编辑文本输入,但是这一次,当我选择另一行时,文本值没有改变。
defaultValue={ getTitle() }>
它工作正常并显示更新的值(当我更改选定的行时),直到我编辑输入。首次编辑后,它不会在另一行单击时更改其值。仅保留已编辑的文本,但我希望在选择另一行时该值会发生变化。但是,getTitle() 函数内的控制台日志会显示与所选行相对应的商店 (store.movies.item) 中的正确标题。
请告诉我如何执行以下操作?
- 使文本输入可编辑
- 在更改所选行后使文本输入更改其值(即使在输入被编辑之前它应该丢失编辑并更改为新值)
【问题讨论】:
标签: javascript reactjs typescript react-redux react-hooks