刷新列表时无法重置redux的状态

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了刷新列表时无法重置redux的状态相关的知识,希望对你有一定的参考价值。

请参阅附件。当在网站上的页面之间切换时,相同的记录会附加到列表中。下面是代码。

我创建了一个reducer来从节点获取数据并呈现列表。正如您在函数render()中所看到的,this.props.categoryListing在UI上呈现数据。

但是当我从任何其他页面返回到我的这个列表页面时,相同的记录会出现两次,三次以上。 enter image description here

    renderCategory(category){
            const id = '/image_listing/' + category.id;
            return(
                <tr>
                    <td><a href={id}>{category.category}</a></td>
                    <td>{category.count}</td>
                    <td>
                        <span><img onClick={() => this.updateCategory(category.id)} className="edit" src="../../img/edit.png" /></span>
                        <span><img onClick={() => this.deleteCategory(category.id, category.category)} className="delete" src="../../img/delete.png" /></span>
                    </td>
                </tr>
            )
        }


      render() {
         return (
            <div>
                <table>
                    <tr className="tableHeader">
                        <th>Category</th>
                        <th>Total Images</th>
                        <th>Action</th>
                    </tr>
                        {this.props.categoryListing.map(this.renderCategory.bind(this))}
                </table>
            </div>

        );
      }
    }

    function mapStateToProps(state) {
        //debugger;
      return { 
            categoryListing: state.categoryListing,
            postRequestReducer: state.postRequestReducer
        };
    };

请建议解决方案。

Action file code:

export function fetchCategoryListing() {
    var response = axios.get('http://localhost/get_category');
        return { 
            type: CATEGORY_LISTING, 
            payload:  response
    }
};

Reducer file code:
unction categoryReducer(state = [], action) {
  switch (action.type) {
    case CATEGORY_LISTING:
        return [ ...state, ...action.payload.data.result ];

    default:
      return state;
  }
};

export default categoryReducer;
答案

我检查了你的响应对象,结构是{"result":[{"id":60,"category":"Test","count":3}]}

基于上述响应结构,在动作文件中你应该: -

export function fetchCategoryListing() {
    var response = axios.get('http://49.50.102.36:3090/get_category');
    return { 
        type: CATEGORY_LISTING, 
        payload: response.result
    }
 };

然后在你的减速机内你应该有这样的东西: -

const initialState = {
    categoryListing: []
};

export default categoryReducer(state = initialState, action) {
   switch (action.type) {
       case CATEGORY_LISTING:
           return Object.assign({}, state, action.payload);
       default:
           return state;
    }
}

最后,您可以为表行添加一个唯一键,如下所示: -

return(
     <tr key={category.id}>
         <td><a href={id}>{category.category}</a></td>
         <td>{category.count}</td>
         <td>
             <span><img onClick={() => this.updateCategory(category.id)} className="edit" src="../../img/edit.png" /></span>
                    <span><img onClick={() => this.deleteCategory(category.id, category.category)} className="delete" src="../../img/delete.png" /></span>
                </td>
            </tr>
)

我希望你觉得这对你有帮助。

以上是关于刷新列表时无法重置redux的状态的主要内容,如果未能解决你的问题,请参考以下文章

如何在测试之间重置 Redux?

方向/配置更改后如何维护 ListView 片段状态?

React Redux 状态在页面刷新时丢失

[Redux/Mobx] Redux怎样重置状态?

在redux中按下重置按钮时如何初始化所有状态

Redux dispatch 导致组件本地状态重置