【发布时间】:2016-09-07 13:16:18
【问题描述】:
小背景介绍
我目前正在处理我的项目的用户管理页面,在这里遇到了一个小问题。我有一个表,其中包含一些材料 UI 的用户卡。对于使用我的系统的每个用户都存在一张卡。卡片由来自我的数据库的数据生成,然后写入 redux 存储。
管理员可以与更改某些用户数据的数据库进行多次交互。为了提供一种查找特定用户的简单方法,实现了 <TextField /> 来过滤用户卡表。
这里提到的所有东西都有效!
问题
如简介中所述,数据存储在 redux 存储 中。当我过滤数据时,会调度一个动作
export const FILTER_ALL_USER_BY_NAME = "FILTER_ALL_USER_BY_NAME"
export const FILTER_ALL_USER_BY_DEPARTMENT = "FILTER_ALL_USER_BY_DEPARTMENT"
export default function filterAllUser(filter, filterOption){
return (dispatch, getState) => {
if(filterOption === 'name'){
return dispatch (filterUserByName(filter))
}else{
return dispatch (filteUserByDepartment(filter))
}
}
}
function filterUserByName(filter){
return {
type: FILTER_ALL_USER_BY_NAME,
filter: filter
}
}
function filteUserByDepartment(filter){
return {
type: FILTER_ALL_USER_BY_DEPARTMENT,
filter: filter
}
}
减速器
即使减速器有效,这也是我的问题的主要原因。
为什么?
这是因为,当我过滤数据时,我无法真正过滤状态,而是返回一个新的状态对象,这导致我遇到 allUserData 和 filteredUserData 退出的问题更改用户数据后同步。
让我用代码解释一下
function allUser(state = {allUserData: []}, action){
switch (action.type){
case 'REQUEST_ALL_USER':
return Object.assign({}, state, {
isFetching: true
});
case 'RECEIVE_ALL_USER':
return Object.assign({}, state, {
isFetching: false,
allUserData: action.items
});
case 'FILTER_ALL_USER_BY_NAME':
return Object.assign({}, state, {
filteredUserData: state.allUserData.filter(user => user.userNameLast.toLowerCase().indexOf(action.filter.toLowerCase()) >= 0)
});
case 'FILTER_ALL_USER_BY_DEPARTMENT':
return Object.assign({}, state, {
filteredUserData: state.allUserData.filter(user => user.departmentName.toLowerCase().indexOf(action.filter.toLowerCase()) >= 0)
});
default:
return state
}
}
但是当我尝试过滤原始状态并且用户删除过滤器时,与过滤器不匹配的数据消失了。
case 'FILTER_ALL_USERS': return allUsers.filter(user => user.userNameLast.toLowerCase().indexOf(action.filter.toLowerCase()) >= 0);
如何过滤状态,但保留数据?
【问题讨论】:
-
为什么不将filter和filteredUsers也存储在状态中,并且任何时候你得到filter或data的更新,也更新filteredUsers?
-
这可以工作,但对我来说这听起来像是一个不干净的解决方案。
-
唯一的其他选择是将过滤器存储在状态中,并且每次您需要过滤的用户时,您都可以手动过滤它或使用类似重新选择的东西。
-
你能用代码表达你的第一条评论吗?
-
下面添加的代码作为答案。
标签: javascript reactjs redux material-ui