- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
最近我一直在阅读react-redux文档https://react-redux.js.org/next/api/hooks还有一个与平等比较和更新相关的部分,内容如下:
Call useSelector() multiple times, with each call returning a single field value.
第一种方法:
const { open, importId, importProgress } = useSelector((importApp) => importApp.productsImport);
第二种方法:
const open = useSelector((importApp) => importApp.productsImport.open);
const importId = useSelector((importApp) => importApp.productsImport.importId );
const importProgress = useSelector((importApp) => importApp.productsImport.importProgress);
那么有什么真正的区别吗?或者由于解构 useSelector 钩子(Hook)在检查引用时会遇到麻烦?
最佳答案
只是为了奠定基础:在分派(dispatch)操作时,将调用您传递给 useSelector()
的选择器。如果它返回的值与上次调度操作时返回的值不同,则组件将重新渲染。
破坏确实是错误的方法,但这里的最佳答案完全无关。文档提到了选择器每次都创建一个新对象的场景,就像您在 mapStateToProps()
函数中所做的那样。这将导致组件在每次分派(dispatch)操作时重新渲染,无论该操作执行什么操作,因为从技术上讲,选择器返回的值是内存中的不同对象,即使实际数据没有更改。 在这种情况下,您需要担心严格相等和浅层相等比较。但是,您的选择器并不是每次都创建一个新对象。如果分派(dispatch)的操作不修改 importApp.productsImport
,它将是内存中与以前完全相同的对象,从而使所有这些都变得毫无意义。
相反,这里的问题是,当您实际上只关心该切片的一些特定属性时,您正在选择整个状态切片。考虑一下,除了 open
、importId
和 importProgress
之外,importApp.productsImport
可能还具有其他属性。如果这些其他属性发生变化,那么您的组件将不必要地重新渲染,即使它没有引用它们。原因很简单:选择器返回 importApp.productsImport,并且该对象发生了变化。 Redux 无法知道 open
、importId
和 importProgress
是您真正关心的唯一属性,因为您没有”选择这些属性;您选择了整个对象。
因此,要选择多个属性而不需要不必要的重新渲染,您有两个选择:
useSelector()
Hook ,每个 Hook 选择您商店中的一个属性。useSelector()
Hook 和一个选择器,将商店中的多个属性组合到一个对象中。你可以通过以下方式做到这一点:
state
的特定属性创建一个新对象并返回它。如果您这样做,那么您将不得不担心严格相等和浅层相等比较。出于这个目的,我觉得多个 useSelector()
Hook 实际上是可行的方法。文档特别提到
Each call to useSelector() creates an individual subscription to the Redux store.
但我认为,与纯粹出于这个原因的单个调用相比,多个调用实际上是否会真正带来真正的性能损失,还有待观察,在我看来,担心这一点可能是过度优化,除非你有一个拥有数百或数千个订阅的庞大应用程序。如果您使用单个 useSelector()
钩子(Hook),那么此时您基本上只是编写一个 mapStateToProps
函数,我觉得这会削弱使用的很多吸引力首先是钩子(Hook),特别是如果您正在编写 TypeScript。如果您然后想要解构结果,那就会变得更加麻烦。我还认为使用多个钩子(Hook)绝对更符合 Hooks API 的一般精神。
关于reactjs - useSelector 解构与多次调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59072200/
我在寻找有关 JavaScript 解构的信息,并在 Packt Publication 的视频系列中找到了视频“解构赋值”。在视频的一开始,我看到了以下代码: var [a, b] = [1,2,3
知识渊博的人可以帮助我理解 Scalaz 的工作原理吗?和 co.有效吗?我是 Scalaz 的新手,有点迷失在探索中。 我想做的是在 List 中累积错误,例如 (v0 v1) foldLeft
Haskell 中的模式匹配可以用这种方式解构数字吗: f (n + 1) = n 我期望 ex 的前身:f 6 = 5、f 5 = 4 等。 我在这里找到了这种模式匹配用法: https://wik
我有一个与此类似的文件: const COLORS = { PRIMARY_COLOR: 'red', SECONDARY_COLOR: 'green' }; const APP = {
作为对 SO 问题的回答,我构建了一个循环函数,并构建了我迄今为止最复杂的解构,这奇迹般地起作用了: (defn fib? [a b & [c & r]] (if (= c (+ a b))
我对破坏感到困惑。 我在其中使用了 React,我们这样做了 const [ books, setBooks ] = useState([{a:'v'}] 和 const {books} = useC
我确定这在某个地方得到了回答,但我缺乏制定搜索的词汇。 #include class Thing { public: int value; Thing(); virtual ~Thing()
如果我在 javascript 中有这样一个对象: let obj = {b: 3, c: 4, d: 6} 如果我解构它,我可以很容易地得到不同的部分,例如,如果我这样做,我可以得到 c 和 d:
这个问题在这里已经有了答案: One-liner to take some properties from object in ES 6 (11 个回答) 2年前关闭。 我似乎不记得如何写这个解构模式
我有一个函数可以查询我的数据库中最近的 X 个条目,它返回一个 map 向量,如下所示: [{:itemID "item1" :category "stuff" :price 5} {:itemI
根据所选语言,我需要销毁对象并获得所需的值。 我该怎么做才能不破坏整个对象? const translate = { "navMenu1": { "en": "Menu 1",
我试图理解这种 ES6 解构。有人可以解释这行代码将编译成什么吗? const { loading, route: { pageName = 'default' } = {} } = this.pro
我有一个程序,可以输出这样的一些条件(这是实际输出,它是伪代码): if ( first occurance of 'AB' -0.5 ) * (( number of products viewe
Serilog的@的目的是什么?句法? 如果我运行以下命令: var dummy = new { Foo = "Bar", Date = DateTime.Now }; Log.Information
JSON 编码的数组从 PHP 传递到 HTML 文档。目前还不清楚如何将该数组解构为 javascript 可用的片段。例如,考虑以下 HTML: {"foo":[{"id":1},{"id":3}
我正在 Chrome 的控制台选项卡中尝试使用以下代码进行 JavaScript 解构,这给了我未捕获的语法错误:标识符“a”已被声明异常 o = { a: "foo", b: 12, c: "bar
我有一个 JavaSCript 对象 person,其中包含 id、name、phone 和 地址属性。我想修改属性名称并将它们放入新对象 personData 中。这可以一步完成吗?: 第 1 步(
有没有办法从 WPF 中获取 Geometry 实例的内部结构? 我需要转换一串用户输入的几何数据,例如 M10,100 C10,300 300,-200 300,100 Z 用于分离几何命令(移动、
我的代码中有一个 promise : req.getValidationResult() .then(result => { let errors = resu
我正在为 Apollo Client 生成 Flow 类型,我目前有这个: type FetchModuleQuery = {| // Fetch single module module:
我是一名优秀的程序员,十分优秀!