javascript - 道具更改时反应子组件不更新
问题描述
我正在尝试在 React 中构建一个本地搜索,该搜索由一个带有搜索输入的父组件和一个包含搜索结果列表的子组件组成。我创建了一个包含搜索查询和搜索结果列表的 React 状态对象。当输入字段更改时,将运行搜索以生成新的结果集,并更新两个属性(查询和结果)。搜索输入正在按预期更新,但子组件不会重新渲染,尽管其 prop 已更新。为简洁起见,我删除了一些代码,但如果您需要更多信息,请告诉我。
export const Search = () => {
let [searchState, setSearchState] = React.useState({});
let handleChange = (event) => {
searchState['results'] = searchProducts(event.target.value);
searchState['query'] = event.target.value;
setSearchState(searchState);
};
return (
<div>
<FormControl>
<Input
value={searchState.query}
onChange={handleChange}>
Search...
</Input>
</FormControl>
<SearchResults results={searchState.results}></SearchResults>
</div>
);
};
export const SearchResults = (props) => {
return (
<List>
{props.results?.map((product, index) => (
<ListItem key={index}>
<ListItemText primary={product.name}></ListItemText>
</ListItem>
))}
</List>
);
};
我的问题是:为什么 SearchResults 组件在searchState.results
更改时不会重新呈现?
解决方案
你在你的handleChange
函数中改变你的状态对象。该组件不会重新渲染,因为searchState
它仍然是上一个渲染周期中的相同对象引用。
let handleChange = (event) => {
searchState['results'] = searchProducts(event.target.value); // mutation!
searchState['query'] = event.target.value; // mutation!
setSearchState(searchState); // safe reference back into state
};
你不应该直接改变状态对象。使用功能状态更新并将现有状态浅拷贝到新的状态对象引用中。然后更新要更新的属性。
let handleChange = (event) => {
const { value } = event.target;
setSearchState(searchState => ({
...searchState,
results: searchProducts(value),
query: value,
}));
};
推荐阅读
- angular - 使用 ngx-translate 翻译 Kendo-UI 网格
- c# - 如何唯一标识另一个正在运行的程序?
- php - PHP | 波兰语字符 - 将 UTF-8 转换为 ANSI
- asp.net-mvc - Angular TypeScript 中的 JsonProperty
- xamarin.forms - Xamarin 表单 - 重复屏幕
- sql - 内联发票
- wildfly - 什么版本的 Wildfly 对应 EAP 7.2?
- python - 有没有办法在函数之外从已部署的 Google Cloud Function 导入 python 帮助程序库?
- java - Java 中 null(Input/Output)Stream API 的用例是什么?
- java - 如何在where子句中使用序列化对象从数据库中获取数据