如何将附加参数传递给组合选择器?我在努力
·获取数据
·过滤数据
·通过myValue将自定义值添加到我的数据集/组数据
export const allData = state => state.dataTable
export const filterText = state => state.filter.get('text')
export const selectAllData = createSelector(
allData,
(data) => data
)
export const selectAllDataFiltered = createSelector(
[ selectAllData, filterText ],
(data, text) => {
return data.filter(item => {
return item.name === text
})
}
)
export const selectWithValue = createSelector(
[ selectAllDataFiltered ],
(data, myValue) => {
console.log(myValue)
return data
}
)
let data = selectWithValue(state, 'myValue')
console.log(myValue)
返回undefined
7条答案
按热度按时间c7rzv4ha1#
更新日期:2022年2月16日
**Reselect 4.1中的新解决方案:**查看详情
更新日期:2021年3月6日
**Reselect的解决方案:**详见
旧:
这是我的方法。创建一个带参数的函数并返回
reselect
。jm2pwxwz2#
这里有一个最新的
useSelector
钩子。重要的是从输入选择器获取参数。输入选择器的第二个参数是我们如何得到它的。
选择器看起来是这样的
下面是我们如何使用
useSelector
钩子提取值,另外,尽可能将第二个参数(
isDone
)保持为primitive values(字符串,数字等)。因为reselect只在输入选择器值更改时运行输出选择器。此更改通过浅比较来检查,对于Object和Array等引用值,该值总是为false。参考文献:
hxzsmxv23#
您的问题的答案在这里的常见问题解答中有详细说明:https://github.com/reactjs/reselect#q-how-do-i-create-a-selector-that-takes-an-argument
简而言之,reselect不支持传递给选择器的任意参数。推荐的方法是,不传递参数,而是将相同的数据存储在Redux状态中。
y0u0uwnf4#
如何从选择器返回一个函数?
getFilteredToDos
就是一个例子xj3cbfub5#
这在Reselect文档中的“在选择器中访问React Props”中有所介绍:
在这种情况下,传递给选择器的props是传递给React组件的props,但props可以来自任何地方:
查看下面的Reselect类型:
我们可以看到,props的类型没有限制(
ParametricSelect
中的P
类型),所以它不需要是object
。8oomwypt6#
下面是一个带有参数的选择器,它是真正记忆化的(除了最后一次调用,不像Reselect中的
createSelector
):createSelector
的问题是它只记住了最后一个调用的参数(https://redux.js.org/usage/deriving-data-selectors#createselector-behavior)createSelector
只存储最近的参数集。这意味着,如果你用不同的输入重复调用选择器,它仍然会返回一个结果,但它必须不断地重新运行输出选择器来产生结果:为了克服这个问题,我们的想法是使用lodash的
memoize
函数来记忆给定参数的选择器。更多信息:https://dev.to/tilakmaddy_68/how-to-memoize-correctly-using-redux-reselect-20m7
5uzkadbs7#
另一个选择:
然后用像
我不确定在这种情况下的记忆/性能,但它的工作。