javascript - 如何使 React 功能组件重新创建回调函数并读取更新的道具
问题描述
我在 React 中有一个非常简单的功能组件。当这个组件被父组件渲染时,最初myList
是一个空数组,最终当它加载完成时,它是一个包含一堆项目的列表。
问题是,myList
inside的值onSearchHandler
永远不会更新,它总是[]
.
const MyComponent = ({ myList }) => {
const [filteredList, setFilteredList] = useState(myList);
console.log(myList); // <<< This outputs [], and later [{}, {}, {}] which is expected.
useEffect(() => {
setFilteredList(myList);
}, [myList]);
const onSearchHandler = (searchText) => {
console.log(myList); /// <<< When this function is called, this always outputs []
const filteredItems = myList.filter(item =>
item.name.toLowerCase().includes(searchText.toLowerCase())
);
setFilteredList(filteredItems);
};
return <AnotherComponent items={filteredList} onSearch={onSearchHandler} />
};
有没有办法强制 onSearchHandler 重新评估 myList 的值?这种操作的推荐方法是什么?
解决方案
听起来好像AnotherComponent
没有考虑更改的道具 - 这应该被认为是AnotherComponent
. 理想情况下,您会修复它,以便正确使用更改后的道具。例如,仅举个例子,也许它正在做
const [searchHandler, setSearchHandler] = useState(props.onSearch);
并且未能按照应有的方式观察道具变化。或者,对于另一个随机示例,如果侦听器道具被传递到addEventListener
组件安装时,但再次没有检查更改并删除/重新附加,则可能会发生这种情况。
如果你不能修复AnotherComponent
,你可以使用 ref formyList
除了道具:
const MyComponent = ({ myList }) => {
const myListRef = useRef(myList);
useEffect(() => {
myListRef.current = myList;
setFilteredList(myList);
}, [myList]);
const [filteredList, setFilteredList] = useState(myList);
const onSearchHandler = (searchText) => {
const filteredItems = myListRef.current.filter(item =>
item.name.toLowerCase().includes(searchText.toLowerCase())
);
setFilteredList(filteredItems);
};
它很丑,但它可能是你在这里唯一的选择。
推荐阅读
- python - python-将嵌套的json标准化为pandas数据框
- python - 在 jupyter notebook 中升级 python 模块
- python - 为什么“python”不被识别为内部或外部命令、可运行程序或批处理文件?
- jquery - 从ajax获取数据时如何避免页眉和页脚html代码?
- java - 即使从数据库加载,JPA hibernate 也不会更新实体对象
- django - 即使在将 url 添加到 ALLOWED_HOST 之后,Heroku 上也会出现“Django DisallowedHost at / Invalid HTTP_HOST header:”错误
- python - python - 如何在Python中加入SQLAlchemy中的两个表时在一个对象中获取键值对?
- python - 将具有不同列的多个数据框合并在一起,除了 5
- r - 训练 SVM 模型时出错:错误:结果中的一个或多个因子级别没有数据:'2'
- python - 熊猫垂直拆分列