【问题标题】:React: first time, undefined error, but after reload, it successReact:第一次,未定义的错误,但重新加载后,它成功
【发布时间】:2018-07-27 16:19:52
【问题描述】:

我使用 react、redux、redux-thunk、react-router-dom v4 制作 Web 应用程序。

我创建了一个加载帖子的组件。

但是一开始,值是未定义的,当我重新加载页面时,值加载成功。

为什么一开始没有值进来?

App.js:

...
{this.props.posts.map((post, index) => (
          <div key={index} style={{ border: "1px solid black" }}>
            <Link to={`/post/${post._id}`}>{post.title}</Link>
            <br />
            <span>{post.content}</span>
            <br />
            <span>{post.author}</span>
          </div>
        ))}
...

Post.js:

class Post extends Component {
  componentDidMount() {
    this.props.getPostDetailFetch(this.props.match.params.id);
  }

  render() {
    return (
      <Container>
        <Row>
          <Col xs="12">
            <h1>{this.props.post.title}</h1>
          </Col>
          <Col xs="12">
            <h3>{this.props.post.author}</h3>
           <Col xs="12">
            <p>{this.props.post.content}</p>
           </Col>
        </Row>
      </Container>
       );
    }
  }
 ...

index.js:

import { Router, Route } from "react-router-dom";
import history from "./history";

ReactDOM.render(
  <Provider store={store}>
    <Router history={history}>
     <div>
        <Route exact path="/" component={App} />
        <Route path="/post/:id" component={Post} />
     </div>
    </Router>
  </Provider>,
   document.getElementById("root")
  );

【问题讨论】:

  • this.props.posts 未定义?
  • @Justcode 是的。第一次是未定义的。

标签: javascript reactjs


【解决方案1】:

它不起作用,因为您以异步方式获取帖子。因此,在第一次渲染中,它们是未定义的。只需使用条件渲染:

...
{!!this.props.posts.length && this.props.posts.map((post, index) => (
          <div key={index} style={{ border: "1px solid black" }}>
            <Link to={`/post/${post._id}`}>{post.title}</Link>
            <br />
            <span>{post.content}</span>
            <br />
            <span>{post.author}</span>
          </div>
        ))}
...

Post.js 也有同样的问题。所以,你也应该在那里进行条件渲染。

render() {
    if ( !this.props.post) {
        return <div>No post!</div>
    }

    return (
      <Container>
        <Row>
          <Col xs="12">
            <h1>{this.props.post.title}</h1>
          </Col>
          <Col xs="12">
            <h3>{this.props.post.author}</h3>
           <Col xs="12">
            <p>{this.props.post.content}</p>
           </Col>
        </Row>
      </Container>
       );
    }

此外,如果帖子详细信息与帖子数组中的内容没有什么不同,我认为您无需在此处再次进行提取。只需更改您的逻辑并使用id 以某种方式从商店获取帖子详细信息。

【讨论】:

  • 但第一次还是未定义。重新加载后,它可以工作了。
  • 如果您只是想获得帖子,为什么要重新加载?当您第一次打开此页面时会发生什么?在尝试此操作之前,您是否对后端进行了任何 POST 操作?
  • 另外,你从哪里得到这个undefined 错误? App.jsPost.js?
  • @devserkan 错误是“TypeError: Cannot read property 'title' of undefined”。而且,Post.js 是错误组件。另外,console.log(this.props.post),它是未定义的。
  • localhost/api/post/id 加载数据成功。
猜你喜欢
  • 1970-01-01
  • 2019-07-25
  • 2013-07-18
  • 1970-01-01
  • 1970-01-01
  • 2012-01-26
  • 2022-07-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多