微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

javascript-react.js在ajax请求完成之前不会呈现

我有一个非常简单的React.js组件,我需要使它同构(呈现在服务器上).问题是,仅在ajax请求完成后,组件才用有用的信息呈现,如下所示:

export default React.createClass({
  getinitialState() {
    return {}
  },

  componentDidMount() {
    fetch("/users/").then(response => {
      this.setState(users: response.data)
    })
  },

  render() {
    if (this.state.users == undefined) {
      return <div />
    }

    return <div>{this.state.users.map(some_function)}</div>
  }
})

问题在于,将空div返回搜索引擎毫无意义.我希望ajax请求完成(甚至在服务器上)并仅在此之后呈现.我该如何实现?

解决方法:

就像@Dencker提到的那样,您想让父组件决定何时渲染子组件,这样可以工作:

// Parent
export default React.createClass({
  getinitialState() {
    return {
      usersLoaded: false
    }
  },

  componentDidMount() {
    fetch("/users/").then(response => {
      this._users = response.users;
      this.setState({
        usersLoaded: true
      });
    })
  },

  render() {
    if ( this.state.usersLoaded ) {
      return (
        <ChildComponent users={this._users} />
      )
    } else {
      return null;
    }
  }
});

// Child
export default React.createClass({
  render() {
    return <div>{this.props.users.map(some_function)}</div>
  }
});

我在那儿做的是:

>在父组件上设置初始状态,即usersLoaded:false.
>在该组件的渲染功能中,确保仅在父级的usersLoaded状态为true时才渲染子级组件.
>父组件的componentDidMount方法是进行AJAX调用的地方,请注意,我在组件上使用了一个变量来存储用户,而不是状态对象(状态通常只用于存储非常简单的值).
>然后将其作为道具传递给子组件.

上面所有这些使子组件变得更加简单,因为它现在只需要一个render方法,而无需if / else检查.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐