【发布时间】:2021-04-14 17:22:47
【问题描述】:
我遇到了一个我无法解决的错误。我正在建立一个博客网站作为一个副项目。现在我正在尝试呈现单个帖子,但是当我尝试访问对象属性时,我收到一个错误 TypeError: Cannot read property 'title' of null。我不明白为什么对象属性为空,尽管我可以打印对象本身。这是sn-ps的代码:
这是一个 PostView 组件,它将处理帖子内容的呈现。我可以在控制台中打印我从 api 收到的 post 对象,但是当我尝试访问或打印它的属性(如标题、正文等)时......我收到了一个错误。起初我以为我在 redux 减速器和操作中有错误,但它似乎工作正常。状态正在发生变化,我收到了 json 响应。我对我的其他组件使用了类似的代码并且它有效,所以我不明白我在哪里犯了错误?
import React, {useEffect, useState } from 'react';
import PropTypes from 'prop-types';
import { connect } from 'react-redux';
import { getPost} from 'actions/post';
//Components
import PostContent from '../Content/PostContent';
//Material Ui
import { Grid } from '@material-ui/core';
import { useStyles } from '@material-ui/core/styles';
const PostView = ({ getPost, post: {post: { title, body, category }, loading }, match}) => {
useEffect(() => {
getPost(match.params.id);
},[getPost]);
//This code works
console.log(post);
//But this one does not
console.log(post.title);
return (
<Grid container>
<PostContent/>
</Grid>
)
}
PostView.propTypes = {
getPost: PropTypes.func.isRequired,
post: PropTypes.object.isRequired,
}
const mapStateToProps = (state) => ({
post: state.post
});
export default connect(mapStateToProps, { getPost })(PostView)
这也是我的动作函数:
//Get Post by Id
export const getPost = (id) => async dispatch => {
try {
const res = await axios.get(`/api/posts/${id}`);
dispatch({
type: GET_POST,
payload: res.data
});
}catch(err){
dispatch({
type: POST_ERROR,
payload: {msg: err.response.statusText, status: err.response.status}
});
}
};
还有 post reducer 文件:
import{
GET_POSTS,
POST_ERROR,
UPDATE_VOTES,
ADD_POST,
GET_POST,
GET_POSTS_IMAGE,
POSTS_IMAGE_ERROR
} from '../actions/types';
const initialState = {
posts: [],
post: null,
loading: true,
status: true,
error: {}
}
export default function(state = initialState, action) {
const { type, payload } = action;
switch (type) {
case GET_POSTS:
return{
...state,
posts: payload,
loading: false
};
case POST_ERROR:
return{
...state,
error: payload,
loading: false
} ;
case UPDATE_VOTES:
return{
...state,
posts: state.posts.map(post => post._id === payload.postId ? { ...post, upVotes: payload.upVotes} : post),
loading: false
};
case ADD_POST:
return{
...state,
posts: [...state.posts, payload],
loading: false,
status: false
};
case GET_POST:
return{
...state,
post: payload,
loading: false
}
default:
return state;
}
}
我只学习 react 和 redux,所以任何帮助将不胜感激。strong text
【问题讨论】:
-
既然你解构了
PostView中的props,那不应该是console.log(title);来记录title值吗?除非我遗漏了什么,否则post甚至不应该在该块中定义。
标签: javascript node.js reactjs redux react-redux