Mic*_*hal 19 javascript ecmascript-6 reactjs redux reselect
如何将其他参数传递给组合选择器?我在尝试着
•获取数据
•过滤数据
•通过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')
Run Code Online (Sandbox Code Playgroud)
console.log(myValue) 回报 undefined
从选择器返回一个函数怎么样?getFilteredToDos是一个例子
// redux part
const state = {
todos: [
{ state: 'done', text: 'foo' },
{ state: 'time out', text: 'bar' },
],
};
// selector for todos
const getToDos = createSelector(
getState,
(state) => state.todos,
);
// selector for filtered todos
const getFilteredToDos = createSelector(
getToDos,
(todos) => (todoState) => todos.filter((toDo) => toDo.state === todoState);
);
// and in component
const mapStateToProps = (state, ownProps) => ({
...ownProps,
doneToDos: getFilteredToDos()('done')
});
Run Code Online (Sandbox Code Playgroud)
更新时间:2021 年 3 月 36 日
Reselector的解决方案: 查看详细信息
// selector.js
import { createSelector } from 'reselect'
import memoize from 'lodash.memoize'
const expensiveSelector = createSelector(
state => state.items,
items => memoize(
minValue => items.filter(item => item.value > minValue)
)
)
// App.js
const expensiveFilter = expensiveSelector(state)
// Another way if you're using redux:
// const expensiveFilter = useSelector(expensiveSelector)
const slightlyExpensive = expensiveFilter(100)
const veryExpensive = expensiveFilter(1000000)
Run Code Online (Sandbox Code Playgroud)
老的:
这是我的方法。创建一个带参数和返回函数的函数reselect。
export const selectWithValue = (CUSTOM_PARAMETER) => createSelector(
selectAllDataFiltered,
(data) => {
console.log(CUSTOM_PARAMETER)
return data[CUSTOM_PARAMETER]
}
)
const data = selectWithValue('myValue')(myState);
Run Code Online (Sandbox Code Playgroud)
您的问题的答案在FAQ中有详细说明:https://github.com/reactjs/reselect#q-how-do-i-create-a-selector-that-takes-an-argument
简而言之,重新选择不支持传递给选择器的任意参数。推荐的方法是,将相同的数据存储在Redux状态中,而不是传递参数。
这是最新的 useSelector钩子的。
重要的是从输入选择器中获取参数。输入选择器的第二个参数是我们获取它的方式。
这是选择器的外观,
const selectNumOfTodosWithIsDoneValue = createSelector(
(state) => state.todos,
(_, isDone) => isDone, // this is the parameter we need
(todos, isDone) => todos.filter((todo) => todo.isDone === isDone).length
)
Run Code Online (Sandbox Code Playgroud)
这是我们如何使用useSelector钩子提取值,
export const TodoCounterForIsDoneValue = ({ isDone }) => {
const NumOfTodosWithIsDoneValue = useSelector((state) =>
selectNumOfTodosWithIsDoneValue(state, isDone)
)
return <div>{NumOfTodosWithIsDoneValue}</div>
}
Run Code Online (Sandbox Code Playgroud)
另外,保留第二个参数 ( isDone) 作为原始值(字符串、数字等)。因为,reselect 仅在输入选择器值更改时运行输出选择器。这种变化是通过浅比较来检查的,对于对象和数组等参考值,这种比较总是错误的。
参考:
| 归档时间: |
|
| 查看次数: |
16126 次 |
| 最近记录: |