useParams Hook 在组件多次渲染间是否返回持久化对象?
useParams返回对象的持久化说明
React Router的useParams Hook在URL参数未变化时,多次渲染间会返回同一个对象引用。
- 只要URL里的参数(比如你代码中的
bookId)没改动,useParams返回的对象就不会重新创建,引用保持一致,所以把bookId放进useMemo的依赖数组是完全安全的。 - 只有当URL参数发生变化时,useParams才会返回新的对象,此时
bookId的值更新,useMemo才会触发重新计算。
针对你给出的代码:
const { books, setBooks } = useContext(BooksContext); const { bookId = 0 } = useParams(); const selectedBook = useMemo( () => books.find(book => book.id === +bookId) || null, [books, bookId], );
这个写法完全符合需求:
- 当
books数组更新时,会重新查找选中的书籍; - 当
bookId(URL参数)变化时,也会重新查找; - 若两者都无变化,useMemo会直接复用之前缓存的
selectedBook,不会重复执行find操作,满足“除非参数变化否则不重新定义选中书籍”的要求。
内容的提问来源于stack exchange,提问作者Ivan
相关产品推荐
相关产品推荐

