如何在 redux 中回到原来的状态?

How to get back to the original state in redux?

我必须采取行动 FETCH_REPOSFILTER_BY_LANGUAGE。当应用程序 运行s 时,repos 从服务器获取并加载到商店中。

然后我尝试按语言过滤

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 个 Node.

然后我过滤 JS 存储库。现在商店有 10 个存储库,而不是 20 个,所以当我再次尝试过滤我的 PHP 时,那些存储库就消失了。

节目是重新获取数据还是我应该在反应道具中过滤数据?

这是操作

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

    })
}

I fetchRepos 挂载,然后 FILTER_BY_LANGUAGE 减少存储。 预期行为,所以我想知道我是否需要 运行 在 FILTER_BY_LANGUAGE 中进行相同的提取,或者一起删除该操作并负责过滤商店在道具?以为这些就是使用 redux 的原因,对吧?

如果你只想在客户端过滤回购,你应该始终保持所有回购状态,并在另一个 属性 过滤它们,比如 filteredRepos

你不应该从 redux store 替换你的 repos。相反,您可以添加一个过滤器以获得可见的回购协议,因此所有回购协议仍在您的商店中,但您可以选择您想要查看的那个。您可以检查 redux todo list 作为示例。

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)
})

我不认为我们可以还原 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;

只要状态发生变化,您就可以保存您的状态,如下所示:

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()
  }
}

您可能想在将新状态添加到历史对象之前检查新状态是否与上次推送的状态相同。