【问题标题】:How can I remove an array from my redux store?如何从我的 redux 存储中删除数组?
【发布时间】:2021-01-30 05:33:12
【问题描述】:

我正在努力删除一个数组。但这是行不通的。删除后我的数组长度和数据保持不变。

这是我的前端反应网页

renderAdmin = (id) => {
        
        if(this.props.auth.user.userType==='normal') return(<td></td>);
        return (
        <React.Fragment>
            <td>
                <button onClick={() => this.props.changeStatus(id)}
                className="ui button" >Change Status</button>
            </td>
            <td>
                <button onClick={() => this.props.deleteUser(id)}
                className="ui button" >Delete User</button>
            </td>
        </React.Fragment>
        );
    }

这里我正在获取我的数组的 id。

现在这是我的 redux 动作创建者

export const deleteUser = (id) =>  (dispatch,getState) => {
  const user = JSON.parse(localStorage.getItem('user'));

  axios.delete(`/api/users/remove/${id}`, {
    headers: {
      'Authorization': `${user.token}`
    }
  }).then((res) => {
    console.log(res.data);
  
    dispatch({
      type: 'DELETE_USER',
      payload: res.data
  })

  dispatch({
      type: 'CREATE_ERROR',
      payload: 'User Delete'
  })
    
  })
  .catch((error) => {
    console.error(error)
  })
}

首先我将其从后端服务器中删除。这很好用。然后我将 res.data 发送到我的减速器有效负载。 DELETE_USER 无法正常工作。但 CREATE_ERROR 工作正常。

这是我的减速器

export default function (state = [] , action) {
    //  console.log(action)
      switch(action.type) {
          case 'ALL_USER' : return action.payload;  
          case 'EDIT_USER' :    
            return state.map(user=>{
                if(user._id === action.payload._id){
                    return action.payload;
                }
                else {
                    return user;
                }
            });
          case 'DELETE_USER' :
            return state.filter(user=>
                user !== action.payload
            )
          default : return state;
      }
  }

按下删除按钮后,数据从服务器中删除,但 redux 存储始终保持不变。请帮我。 谢谢。

【问题讨论】:

  • 你为什么要从deleteUser 在你的catch 块的外部 分派CREATE_ERROR
  • CREATE_ERROR 这不完全是因为错误。你可以说,这是为了发送消息。就是这样。
  • user !== action.payload 不起作用,因为action.payload 将是一个单独的对象实例,因为它来自JSON.parse(即使它确实代表相同的“现实生活”实体)。您应该改为比较 ._id 值。试试这个:return state.filter( u =&gt; u._id !== action.payload.whateverTheUserIdPropertyIs )
  • @Dai 现在我明白了。谢谢兄弟。

标签: javascript arrays reactjs redux react-redux


【解决方案1】:

这可能是由于对象不是真正相等的,请尝试过滤 id:

return state.filter(user=>
                user._id !== action.payload._id
            )

或者检查深度相等。

【讨论】:

  • 那是工作兄弟。你是救生员。非常感谢。顺便说一句,你能告诉我,“为什么 user 和 action.payload 不匹配?或者为什么我的 previos 代码不起作用?
  • @Rupam 阅读类似的内容medium.com/@nathanworden/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-23
  • 2017-02-24
  • 2019-02-15
  • 1970-01-01
  • 2018-01-25
相关资源
最近更新 更多