【问题标题】:This state.....filter is not an option? React Reducers这种状态.....过滤器不是一个选项?反应减速器
【发布时间】:2019-09-19 10:36:30
【问题描述】:

我有这个:

const initialState = {
  pages: [],
  page: null,
  loading: true,
  error: {}
};

然后我有这个:

import {
  GET_PAGES,
  PAGE_ERROR,
  DELETE_PAGE,
  ADD_PAGE,
} from '../actions/types';

const initialState = {
  pages: [],
  page: null,
  loading: true,
  error: {}
};

export default function (state = initialState, action) {
  const { type, payload } = action;

  switch (type) {
    case GET_PAGES:
      return {
        ...state,
        page: null,
        pages: payload,
        loading: false
      };
    case ADD_PAGE:
      return {
        ...state,
        pages: [payload, ...state.pages],
        loading: false
      };
    case DELETE_PAGE:
      return {
        ...state,
        pages: state.pages.filter(page => page._id !== payload),
        loading: false
      };
    case PAGE_ERROR:
      return {
        ...state,
        error: payload,
        loading: false
      };
    default:
      return state;
  }
}

每次我从数据库中删除条目时,都会显示一条错误消息,指出“state.pages.filter 不是函数”。我已经为此苦苦挣扎了一段时间。任何帮助将不胜感激! 这是我的组件中的内容:

const Pages = ({ getPosts, page: { pages, loading }, deletePost }) => {

  useEffect(() => {
    getPosts();
  }, [getPosts]);

  return (
    <Fragment>
      {loading ? (
        <Spinner />
      ) : (
          <section className="mb-3">
            <div className="container-fluid">
              <h1 className="border-bottom-dark pb-3 mb-3">Pages</h1>
              {pages && pages.pageOfItems ? (
                <div className="row">
                  <div className="col-lg-12">
                    <div className="table-responsive">
                      <table className="table table-bordered" id="dataTable" width="100%" cellSpacing="0">
                        <thead>
                          <tr>
                            <th></th>
                            <th>Actions</th>
                          </tr>
                        </thead>
                        <tbody>
                          {pages.pageOfItems.map(post => (
                            <tr key={post._id}>
                              <td></td>
                              <td className="btn-group">
                                <Link to={`/admin/pages/view/${post._id}`} className="btn btn-sm btn-dark"><i className="far fa-eye" /></Link>
                                <Link to={`/admin/pages/update/${post._id}`} className="btn btn-sm btn-warning"><i className="fas fa-edit" /></Link>
                                <button onClick={() => deletePost(post._id)} type="button" className="btn btn-danger btn-sm"><i className="fas fa-trash-alt" /></button>
                              </td>
                            </tr>
                          ))}
                        </tbody>
                      </table>
                    </div>
                  </div>
                </div>
              ) : (
                  <div className="nothingfound">
                    <div className="alert alert-danger">No pages found</div>
                  </div>
                )}
            </div>
          </section>
        )}
    </Fragment>
  )
};

Pages.propTypes = {
  getPosts: propTypes.func.isRequired,
  deletePost: propTypes.func.isRequired,
  page: propTypes.object.isRequired,
};

const mapStateToProps = state => ({
  page: state.page,
});

export default connect(
  mapStateToProps,
  { getPosts, deletePost }
)(Pages);

【问题讨论】:

  • 你能再添加一些代码吗? case 发生在哪里?是在setState 里面吗?
  • 您是否注销了statestate.pages 以确保数据正确且state.pages 实际上是一个数组?
  • 无法使用此信息进行复制。只是一个糟糕的猜测:您是否将initialState 设置为开头的state
  • 你把状态对象分配给redux了吗
  • 这个错误是因为 DELETE_PAGE 操作没有从初始状态访问 state.pages 键

标签: javascript arrays reactjs react-hooks


【解决方案1】:

正如其他人建议的那样,您应该控制台记录您的 state.posts:

case DELETE_PAGE:
  console.log(state.pages); // here
  return {
    ...state,
    pages: state.pages.filter(page => page._id !== payload),
    loading: false
  };

也许您的 GET_PAGES 操作正在返回一个非数组作为有效负载:

case GET_PAGES:
  return {
    ...state,
    page: null,
    pages: payload, // Is the payload an array?
    loading: false
  };

在处理 redux 时,我还建议在分派每个操作后注销您的状态,以便更好地了解您的状态(例如,可以使用 redux-logger)。

【讨论】:

  • 现在我想到我在 GET_PAGES 中的有效负载带有两个对象,pager 是一个对象,pageOfItems 是一个对象数组。
  • 我现在在我的减速器中放入 state.pages.pageOfItems.filter ,现在它不会产生任何错误,但不仅仅是删除一行,它就像我正在删除所有条目一样。 ..它只是删除了特定的条目
猜你喜欢
  • 2020-12-09
  • 2019-06-11
  • 2017-07-03
  • 1970-01-01
  • 2021-05-29
  • 2019-05-18
  • 2022-01-04
  • 2023-03-24
  • 2017-06-14
相关资源
最近更新 更多