- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想在某些数据发生变化时执行副作用,例如
const useSearchResults = () => {
const location = useLocation();
const [data, setData] = useState();
useEffect(() => {
Api.search(location.query.q).then(data => setData(data));
}, [location.query.q]);
// Compute some derived data from `data`.
const searchResults =
data &&
data.map(item => ({
id: item.id,
name: `${item.firstName} ${item.lastName}`
}));
return searchResults;
};
const Component = () => {
const searchResults = useSearchResults();
useEffect(() => {
alert('Search results have changed'); // Side-effect
}, [searchResults]);
return <pre>{JSON.stringify(searchResults)}</pre>;
};
如果某些事情导致 Component
重新渲染,即使 searchResults
没有改变,alert
也会触发,因为我们映射了useSearchResults
中的底层稳定数据在每次渲染时创建一个新实例。
我最初的方法是使用 useMemo
:
// Stabilise `searchResults`'s identity with useMemo.
const searchResults = useMemo(
() =>
data &&
data.map(item => ({
id: item.id,
name: `${item.firstName} ${item.lastName}`
})),
[data]
);
但是useMemo
has no semantic guarantee所以它(理论上)只对性能优化有好处。
React 是否为这个(常见的?)问题提供了直接的解决方案?
最佳答案
如果副作用不会重新运行非常重要,您可以将比较建立在深度相等性检查的基础上。我们希望看到搜索结果实际上是不同的结果,而不仅仅是具有相同结果的新数组。
usePrevious
Hook 有多种实现可供您使用,但基本上它只是一个ref
。将以前版本的搜索结果保存到 ref
。当您的效果运行时,查看当前结果是否与之前的结果不同。如果是,请执行您的副作用并将之前的更新为当前的。
const Component = () => {
const searchResults = useSearchResults();
// create ref for previous
const comparisonRef = useRef('');
useEffect(() => {
// stringify to compare
if ( JSON.stringify(searchResults) !== JSON.stringify(comparisonRef.current) ) {
// run side effect only if true
alert('Search results have changed');
// update the ref for the next check
comparisonRef.current = searchResults;
}
}, [searchResults, comparisonRef]);
return <pre>{JSON.stringify(searchResults)}</pre>;
};
关于javascript - React 中的变更检测,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66064561/
我有一个相当简单的 iPhone 应用程序,它将一组 UITableView 结果下载到其模型类中,以及一个设置为观察这些更改的 View Controller using KVO . 这个系统运行良
我们的一名团队成员(位于不同地区)已搁置 P4 中的更改,更改列表为 1234。 现在,如果我想查看 snf 修改了哪些文件,有哪些更改,我该怎么做? 我应该使用什么 P4 命令来查看我们的团队成员所
有没有办法获取特定分支的特定变更列表之后的变更列表列表? p4 changes (some flag ?) (CL#) //depot/project 最佳答案 这可以使用以下语法来完成(假设您想查看
我是 drupal 的新手,但学得很快。我有 drupal 7,我正在努力创建一个基于 Zen 的 starterkit 子主题的主题。我正在尝试找到可以自定义“提交者”行的位置。 默认情况如下: 由
我正在尝试将附件的 ShareKit API 代码更改为以下代码: dialog.attachment = [NSString stringWithFormat:@"{\"name\":\"%@\",
所以我的理解是,在 symfony 开发环境中,如果 use_controller 设置为 true,则 Assets 是通过 Controller 在页面加载时生成的。 然而,这非常耗时,并且将其设
我正在编写一个程序,它需要了解一台机器的所有 IP 地址,并且数据包通过它们的连接进行传输。我可以在运行主程序之前使用“gethostbyname”获取 IP 列表,但是如果之后有任何 IP 可用怎么
我很好奇是否有人可以概述服务器端哪些类型的 WCF 合约(接口(interface))更改会破坏尝试发送消息的客户端,以及原因。我相信 WCF 可以处理某些差异,但我不确定您可以安全地更改哪些内容以及
在 AngularJS 中,创建和使用自定义服务进行 DOM 操作并在 UI 的不同部分共享相同的功能是一种常见的做法,我的问题也与此案例相关,如下所示: 我的应用程序中有一个侧边栏组件和一个用于最小
我尝试使用像 WPF-MVVM 这样的 Knockout。 在 WPF 中,有一个选项可以在属性更改时通知虚拟机。 例如:如果我有一个文本框,我可以使用 UpdateSourceTrigger=Pro
我需要一些使用 Apollo 2.1 中新的查询和突变组件的帮助,尤其是多个查询和突变。 我有以下问题: 我有一个 graphql 请求,该请求依赖于之前的 graphql 结果,我该如何处理这个问题
Paypal 似乎已经改变了他们的 IPN 测试界面。 (将 IPN 欺骗到您的 IPN 页面以进行测试。 以下是我现在从IPN收到的数据。 KEY: receipt_ID - VALUE: KEY:
从雅虎财经请求数据似乎已经改变或现在被阻止。以下商品数据请求自 2017 年 5 月起不再有效。有谁知道是否有新的方式来提出此请求? http://chartapi.finance.yahoo.c
In this post他们在 LinkedIn 上提到开放 API 仍将支持与公司 API 共享内容,但如果您进一步查看他们的 Developer Program Transition Guide他
我对 Xcode 很陌生,我想在添加可能会破坏我的项目的更改之前弄清楚版本控制。我正在单独处理这个项目,并且在我的 mac 上保存了一个 Git 存储库,所以我认为我不需要将它与 GitHub 帐户链
我是一名优秀的程序员,十分优秀!