【问题标题】:Rendering Ajax request in React-Router Children在 React-Router Children 中渲染 Ajax 请求
【发布时间】:2016-01-30 15:01:46
【问题描述】:

我遇到了 React-Router 和 AJAX 请求的问题。

这里是index.js(入口文件):

import React from 'react';
import { render } from 'react-dom';
import { App } from './App';
import { Router, Route, IndexRoute, browserHistory } from 'react-router';

import Utente from './routes/Utente';
import UtenteView from './routes/UtenteView';

render(
  <Router history={browserHistory}>
    <Route path="/" utente={mattia} component={App}>
      <Route path="user/:id" component={User}>
        <IndexRoute component={UserView}/>
        <Route path="rete" component={Rete}></Route>
      </Route>
    </Route>
  </Router>,
  document.getElementById('root')
)

App.js 文件只有渲染函数,它返回

<div>{this.props.children}</div>

调用用户组件。用户文件几乎相同。

在 UserView.js 文件中,我使用 superagent 发出 AJAX 请求

import React, { Component } from 'react';
import request from 'superagent';

export default class UserView extends Component{
  constructor(props) {
    super(props);
    this.state = {
      result: null
    };
    this.fetchRequest = this.fetchRequest.bind(this)
  }
  makeRequest(id){
    request
      .get('/API/user/' + id)
      .end(function(err, value){
        if (value){
          return({
            result: JSON.parse(value.text).name
          })
        }
      });
  }

  fetchRequest(){
    this.setState(this.makeRequest(this.props.params.id));
  }

  componentDidMount(){
    this.fetchRequest();
  }

  render(){
    if(typeof this.state.result !== 'undefined'){
      return(
      <div>
        <p>Questa è la pagina di {oggetto.id}</p>
      </div>
      )
    }
    return(
      <div>
        <h4>Loading data...</h4>
      </div>
    )
  }
}

但这不起作用,它给了我错误:

Warning: setState(...): You passed an undefined or null state object; instead, use forceUpdate().

为什么?我认为错误在于我试图通过孩子来操纵父母的状态。

【问题讨论】:

    标签: javascript ajax reactjs react-router setstate


    【解决方案1】:

    问题是makeRequest 是异步的,你不能从它return。你应该这样做:

    makeRequest(id){
      request
        .get('/API/user/' + id)
        .end((err, value) => {
          if (value){
            this.setState({
              result: JSON.parse(value.text).name
            })
          }
        });
    }
    

    另外,我会用你的组件做这样的事情。您不应该为您的设置覆盖构造函数。另外,请查看 fetch:

    import React, { Component } from 'react';
    import fetch from 'whatwg-fetch';
    
    export default class UserView extends Component{
    
      componentDidMount() {
        this.fetchRequest(this.props.params.id)
      },
    
      fetchRequest(){
        fetch('/API/user/' + id)
          .then((response) => {
            return response.json()
          })
          .then((json) => {
            this.setState({
              result: json.name
            })
          })
          .catch((ex) => {
            console.log('parsing failed', ex)
          })
      }
    
      getLoadingMessage() {
        if(typeof this.state.result === 'undefined') {
          return
        }
    
        return (
          <div>
            <h4>Loading data...</h4>
          </div>
        )
      },
    
      getMessage() {
        if(typeof this.state.result !== 'undefined') {
          return
        }
    
        return (
          <div>
            <p>Questa è la pagina di {oggetto.id}</p>
          </div>
        )
      },
    
      render(){
        return (
          <div>
            { this.getLoadingMessage() }
            { this.getMessage() }
          </div>
        )
      }
    }
    

    【讨论】:

    • 我已经尝试过这种方式,但现在错误是:无法读取未定义的属性'setState'。
    • 您是否使用箭头函数 () =&gt; {} 进行 .end 回调?
    • 没有。使用箭头功能,它可以工作!谢谢!我在想使用.bind(this) 就足够了。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-08-19
    • 2020-12-18
    • 2016-02-22
    • 2019-01-02
    • 2016-06-13
    • 2023-02-06
    • 2019-01-19
    相关资源
    最近更新 更多