问题标签 [reselect]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
reactjs - 重新选择 - 只将部分状态传递给选择器是否有意义
我的商店包含一个 s 数组goal
。有一个 Goal 组件,我使用 connect() 连接到 redux 存储,所以它有一个goal
作为它的道具。
目标组件有子组件,它们都需要整个目标对象来创建派生数据。我想使用 reselect 来帮助提取这些数据的派生方式,但是当我已经可以访问目标时,再次从整个 redux 存储中选择相同的目标对我来说没有意义。
因此,我目前正在将目标对象从 Goal 组件传递给它的子组件,并在这样做时调用它的选择器。
这意味着选择器的参数只是一个目标,是状态的一部分,而不是所有状态。如何使用它的所有示例都使用“连接”,因此选择器函数采用整个状态。
我的方法有意义吗?还是我完全错过了重点,我不再正确封装状态树的形状?
任何意见/建议将不胜感激
javascript - Typescript 编译器为 Reselect.createSelector() 生成错误的返回类型
据我所知,重新选择的 .d.ts 文件(https://github.com/reactjs/reselect)是正确的。那么这里发生了什么...... Typescript 编译器有问题吗?我的tsconfig?
要重现该问题:
Demo.ts
从 reselect.d.ts 看来,createSelector()
上面应该返回 type Selector<DemoState, number>
:
重新选择.d.ts
但是,打字稿编译器实际为定义生成的是:
演示.d.ts
Soo...当我selectTotal
在另一个项目中导入时,我收到错误:“通用类型'选择器'需要 2 个类型参数。” 因为 reselect.d.ts 只定义Selector<TInput, TOutput>
并且据我所知,这就是createSelector
应该返回的内容,而不管传递给它的类型参数的数量。
我可以生成正确定义的唯一方法是显式转换createSelector
结果,但我认为我不应该这样做..
使用 TypeScript 2.0.3 和我的 tsconfig 以防万一:
javascript - 使用带参数的重新选择选择器
如何将附加参数传递给组合选择器?我在尝试着
• 获取数据
• 过滤数据
• 将自定义值添加到我的数据集/按 myValue 分组数据
console.log(myValue)
返回undefined
javascript - 如何在 react/redux 中调用 API 并从另一个孩子更新一个孩子
我正在使用 redux、react、react-router 和重新选择。有一个屏幕包含两个组件,Header
和Body
。中有一个组件Header
可以选择一个ID。当一个新的 ID 被选中时,一个新的 action 被调度来更新 redux 中状态的 ID。
基于该 ID,应该有一个异步 API 调用来从服务器加载元素并将其存储在状态中,然后应该触发屏幕渲染并在Body
. 然后将通过重新选择从状态中提取加载的元素。
实际情况比这要复杂一些,因为有许多不同的Body
组件具有不同的 API 调用,而且只有一个Header
组件。但它们可以被视为不同的屏幕。因此,例如:
屏幕一:
组件:Header
, BodyTypeA
; 调用API:apiA
屏幕 2:
组件:Header
, BodyTypeB
; 调用API:apiB
我的理解是,API调用应该在reducer中将新ID存储在状态中时完成。但是,如果动作是由跨屏幕共享的组件调度的,如何确定正在显示哪个屏幕以及调用哪个 API?我可以以某种方式订阅Body
对 ID 的更改并从屏幕内触发 API 调用吗?屏幕类型由 react-router 决定。减速器是否可以访问路由器以确定正在显示哪个屏幕?是否有处理这种情况的最佳实践?
javascript - 不可变,为什么我使用 fromJS 的嵌套对象在我使用 reselect 时不是不可变的
我有一个 immutablejs 的错误并重新选择。
我的 reactjs 应用程序中有以下 redux 商店:
根据 immutableJS 文档,fromJS 为嵌套对象创建不可变对象。
这就是为什么记录下一行可以正常工作的原因:
但是,当我尝试将它与 reselect 一起使用时,这不再起作用:
起初阅读文档后,我认为这是 selectUsername 的正确答案:
这是我处理 changeForm 操作的 LoginForm:
这里是 , 它包括 并且被包括在
这是我的
这是我处理登录的传奇:
我很乐意解释为什么这不能正确选择
javascript - 使用包含承诺的 createselector 反应 redux 容器
我有一个连接到商店的容器,它每秒更新一次:
然而,其中一个属性 (highlightList) 做了以下两件事之一:
1) 从 sessionStorage 返回一个值
或者
2) 下载一个文件,保存到 sessionStorage 然后返回
当然,我不想每秒都这样做,只是第一次。
我创建了一个这样的选择器
但它不起作用,它没有被渲染。但是,如果我做一个替代版本,我将结果存储在一个变量中,然后查询它,事情就会起作用。它只运行一次并按我喜欢的方式执行
我只是想学习如何以正确的方式做到这一点,有这方面知识的人可以给我一些最佳实践技巧吗?
redux - 重新选择无法读取未定义的属性“获取”
我正在使用重新选择和反应 redux。我正在尝试为基本模式实现制作选择器。
我的选择器是
这会引发错误
编辑:有人要求我展示我如何调用选择模式,尽管它应该没有区别。
我相信这意味着找不到模态状态容器
也许我设置了我的减速器或存储不正确。我的减速机是
它与 combine reducers 组合成一个 glob
然后注入我的商店
重新选择中的错误在第 73/74 行 params = dependencies.map
那么我做错了什么,我是否需要对 immutableJS 做一些不同的事情来访问模式,或者我的应用程序设置不正确?预先感谢您的反馈。
javascript - Memoized 选择器更新未在组合选择器中触发
我在 redux 环境中将 reselect 用于记忆选择器。请注意,在 reselect 的自述文件中,这些选择器是可组合的——也就是说,一个选择器可以被另一个选择器使用。这是我的选择器:
注意选择器是如何被userData
选择器使用的sealForSelectedRegion
。然而,使用和调试这些选择器发现,当userData
被触发并产生新的输出时,sealForSelectedRegion
并没有被触发。我的想法是应该触发它,因为它的输入userData
产生了更新的结果,因此需要重新计算`sealForSelectedRegion。但这不会发生。
上面链接的重新选择自述文件中也出现了类似的情况。我能看到的唯一区别是自述文件中组成的选择器不会被导出。在这种情况下,我想导出userData
并将其用作 sealForSelectedRegion 的输入。
所以问题是为什么更新的输出userData
不会触发sealForSelectedRegion
?是因为userData
出口吗?如果是这样,为什么这是一个问题?
reactjs - 有效地计算来自反应道具的派生数据
我们正在我们的 react/redux 应用程序中实现性能优化。这些优化的一部分包括引入重新选择。这对于直接来自状态的数据非常有效。但是从其他道具派生的数据呢?
例子:
我们有 3 个组件Feed
FeedItem
和Contact
(Contact 是用于显示用户联系信息的组件)。
aFeedItem
获取表示提要中的项目的对象,提要项目的属性之一是参与者对象。这个对象就像一个用户,但有点不同(这很糟糕,但不能改变)。这意味着如果我想Contact
为这个演员渲染一个,我需要创建一个新的对象,将演员的属性映射到用户。在每次渲染上创建一个新对象是一种性能反模式,因为我们使用的是浅相等检查。
例如代码:
有解决这个问题的模式吗?reselect 只支持从 redux state 派生数据,这基本上是从 props 派生的数据。
angular - 离开页面时暂停商店更新
我正在使用 ngrx 开发 Ionic2 应用程序。
要从我的商店中选择数据,我正在使用reselect。
我有一些页面使用相同的数据(来自同一个减速器),但结合其他减速器数据,取决于当前页面(这意味着每个页面都有自己的重新选择器,但每个选择器至少有一个参数与其他重新选择器相同。因此,每当这些参数之一更改时,这些页面的所有重新选择器都需要重新计算)。
它看起来像这样:
我担心的是,如果在公共状态更改时有很多页面,所有选择器都会重新计算,即使我只需要重新计算当前页面使用的选择器。我认为如果选择器需要做复杂的事情,这可能会成为一个很大的性能问题。
有没有办法“暂停”从商店获取更新,直到我回到那个页面?这样,只会重新计算当前页面的选择器。
还是有另一种方法可以避免不必要的计算?