我必须采取行动FETCH_REPOS
和FILTER_BY_LANGUAGE
。当应用运行时,将从服务器获取回购协议,并将其加载到商店中。
然后我尝试按语言过滤
case 'FILTER_BY_LANGUAGE':
let newState = {
repos:[...new Set(state.repos)]
.filter(val => val.language == action.payload)
}
return newState
方案是,我获取30个存储库。假设有10个是JS,10个PHP和10个节点。
然后我过滤JS存储库。现在该商店有10个存储库,而不是20个,所以当我再次尝试过滤PHP时,这些存储库就可以了。
显示正在重新获取数据,还是应该在react props中过滤数据?
这是动作
export const fetchRepos = () => dispatch => {
fetch('http://localhost:4000/originalrepos')
.then(res => res.json())
.then(repos => {
let content = repos.map((data, i)=>{
return {
title: data.name,
username: data.owner.login,
avatar: data.owner.avatar_url,
date: data.updated_at,
}
})
dispatch({
type: 'FETCH_REPOS',
payload: content
})
})
}
export const filterByLanguage = language => dispatch => {
dispatch({
type: 'FILTER_BY_LANGUAGE',
payload: language
})
}
我fetchRepos
挂载,然后FILTER_BY_LANGUAGE
减少了存储量。 一种预期的行为,所以我想知道我是否需要在FILTER_BY_LANGUAGE
中运行相同的提取操作,还是需要一起删除该操作并注意过滤道具处的存储?以为这些是使用redux的原因,对吧?
答案 0 :(得分:1)
您不应从redux商店替换您的仓库。相反,您可以添加一个过滤器以获取可见的回购,因此所有回购仍在商店中,但是您可以选择要查看的回购。您可以查看redux待办事项清单作为示例。
const getVisibleRepos = (repos, filter) => {
switch (filter) {
case VisibilityFilters.SHOW_ALL:
return repos
case VisibilityFilters.SHOW_PHP:
return repos.filter(t => t.type === 'node')
case VisibilityFilters.SHOW_NODE:
return repos.filter(t => t.type === 'php')
default:
return repos;
}
}
const mapStateToProps = state => ({
todos: getVisibleRepos(state.repos, state.visibilityFilter)
})
答案 1 :(得分:0)
如果您只想在客户端过滤仓库,则应始终将所有仓库保持在状态,并在filteredRepos
之类的其他属性中进行过滤
答案 2 :(得分:0)
我认为我们无法还原Redux状态更改。解决方案之一是将两个列表保持在该状态。一份原始文件和一份经过过滤的文件,这样您将始终可以方便地使用原始清单,并且经过过滤的清单可能包含已过滤的项目。
case 'FETCH_REPOS':
return { repos: action.payload };
case 'FILTER_BY_LANGUAGE':
let newState = {
filteredRepos: [...new Set(state.repos)].filter(val => val.language == action.payload)
}
return newState;
答案 3 :(得分:0)
只要状态发生变化,您就可以保存状态,如下所示:
var stateHistory = []
YourReducer = (state, action){
//Whenever the reducer is called, it pushes to the history
stateHistory.push(state)
switch(action.type){
...
case "UNDO":
//fire the UNDO action to go back to the last recorded state
return stateHistory.pop()
}
}
在将新状态添加到历史对象之前,您可能需要检查新状态是否与上次推送状态相同。