开发者问题收集

无法访问 react-redux 中对象内的嵌套数组

2020-02-28
472

My redux state Hierarchy

您好,我是 redux 新手,正在努力解决一个问题。我正在尝试访问并映射我帖子数组内的评论。但是,我不确定该怎么做。到目前为止,我已尝试更改操作和 Reducer 以解决此问题。我认为问题出在 React 和 Redux 中。我无法判断我的 mapStateToProps 是否正常工作。此外,状态是从我的快递服务器中获取的,它似乎工作正常,正如您在图片中看到的那样。

我的 getPost 操作:

export const getPost = (group_id, post_id) => async dispatch => {
  try {
    const res = await axios.get(`/api/groups/${group_id}/${post_id}`);

    dispatch({
      type: GET_POST,
      payload: res.data
    });
  } catch (error) {
    dispatch({
      type: POST_ERROR,
      payload: { msg: error.response.statusText, status: error.response.status }
    });
  }
};

初始状态:

const initialState = {
  groups: [],
  group: [],
  loading: true,
  error: {}
};

reducer:

case GET_POST:
  return {
  ...state,
  post: payload,
  loading: false
};

我试图映射评论的位置:

import React, { Fragment, useEffect } from 'react';
import PropTypes from 'prop-types';
import { connect } from 'react-redux';
import { getPost } from '../../../redux/actions/group';

const Post = ({ getPost, post, match }) => {
  useEffect(() => {
    getPost(match.params.group_id, match.params.post_id);
  }, [getPost, match.params.group_id, match.params.post_id]);

  // I want to map over the comments here
  return (
      {post.comments.map(comment => ({ comment }))}
  );
};

Post.propTypes = {
  getPost: PropTypes.func.isRequired,
  group: PropTypes.object.isRequired
};

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

export default connect(mapStateToProps, { getPost })(Post);
1个回答

您可以使用 redux 的一些技巧来访问嵌套对象,我们已经在 prod 环境中使用这种方法一段时间了。

首先是 Reducer(您可以使这个 Reducer 更加复杂)

const LocalStorageReducer = createReducer<Store['localStorage']>(
  new LocalStorage(),
  {
    saveLocalStorageItem(state: LocalStorage, action: any) {
      return {...state, [action.payload.item]: action.payload.value}; // <= here
    },
  }
);

对于 Actions

export const actions = {
  saveLocalStorageItem: (payload: InputAction) => ({type: 'saveLocalStorageItem', payload}),
};

对于类型 InputAction

export class InputAction {
  item: string;
  value: string | Array<string> | null | boolean;
  constructor() {
    this.item = '';
    this.value = null;
  }
}

对于组件中的处理程序

this.props.saveLocalStorage({ item: 'loading', value: false });

通过这种方式,您可以通过一种方式访问​​嵌套的 redux 存储。
对于复杂(4-5 级)和多重(> 2 次)数据结构,还有其他方法,但在大多数情况下,它已经足够好了。

keikai
2020-02-28