开发者问题收集

无法访问 redux 对象数组属性

2019-06-28
168

我对 react/redux 还很陌生,我遇到了一个无法理解的意外问题

我从 redux 检索了一篇特定的文章,当我加载正确的页面时,操作就会触发。我可以在 redux dev tools 中看到文章已正确加载到 state.article 中,一切正常。

Reducer(简化):

const initialState = {
  article: null,
  loading: true,
};

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

  switch (type) {
    case GET_TARGET_ARTICLE:
      return {
        ...state,
        article: payload,
        loading: false
      };

}

操作:

export const getTargetArticle = slug => async dispatch => {
  try {
    const res = await axios.get("api/article/" + slug);
    dispatch({
      type: GET_TARGET_ARTICLE,
      payload: res.data
    });
  } catch (err) {
    ...
  }
};

这是 article 对象应该具有的内容:

article: {
   title:"",
   content: "",
   comments:[],
}



问题: 正如我所说, state.article 已正确填充,我可以访问 titlecontent 。但是当我尝试访问评论时,我得到了一个令人讨厌的 无法读取 null 的属性“评论” 。知道为什么吗?

如果有帮助的话,下面是我显示它的方式:

const Article = ({ getTargetArticle, article: { article, loading }, match }) => {
  useEffect(() => {
    getTargetArticle(match.params.slug);
  }, []);

  let commentsList = article.comments.map((comment, index) => (
    <Fragment>{comment.title}</Fragment>
  ));

  return (
    <Fragment>
      {article && article.title}
      {commentsList}
    </Fragment>
  );
};

非常感谢

1个回答

初始渲染时,评论将只有空数组,因此您无法迭代它,并且评论中没有标题。因此,comment.title 是导致您出现此问题的原因。要解决此问题,请在使用 map 之前检查它:

  let commentsList = article.comments.length && 
    article.comments.map((comment, index) => (
    <Fragment>{comment.title}</Fragment>
  ));

您也可以检查 title:

<Fragment>{comment.title && comment.title || ''}</Fragment>
Bhojendra Rauniyar
2019-06-28