React - 加载 JSON 并渲染组件

Posted

技术标签:

【中文标题】React - 加载 JSON 并渲染组件【英文标题】:React - Load JSON and render component 【发布时间】:2017-07-14 00:41:07 【问题描述】:

正如标题所说,我正在尝试渲染一个 React 组件,其中包含我通过使用 fetch() 加载从 JSON 中获取的数据。

api 调用工作正常,但我无法呈现数据。

代码如下:

class App extends React.Component 
    constructor(props) 
        super(props);

        this.state = 
            user: 
        
    

    getUserById(uId) 
        fetch(`https://jsonplaceholder.typicode.com/users/$uId`)
            .then( (response) => 
                return response.json()
            )
            .then( (json) => 
                return json;
            );
    

    componentDidMount() 
        this.setState(
            user: this.getUserById(4)
        )
    

    render() 
        return (
            <div>
                <h1>User</h1>
                <p>ID: this.state.user.id</p>
            </div>
        );
    


ReactDOM.render(
    <App/>,
    document.getElementById("container")
);
<div id="container"></div>

<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script>

有解决这个问题的想法吗?

【问题讨论】:

【参考方案1】:

问题出在这一行:

<div class="container"></div>

您定义了class 并通过getElementById 获取它。

另一个变化是,ajax 调用将是异步的,因此getUserById 不会立即返回数据,setState 将在状态变量中设置undefined 值而不是从服务器返回的数据。要解决此问题,请在收到回复后发送setState

检查一下:

class App extends React.Component 
    constructor(props) 
        super(props);

        this.state = 
            user: 
        
    

    getUserById(uId)
        fetch(`https://jsonplaceholder.typicode.com/users/$uId`)
        .then( (response) => 
            return response.json()
        )
        .then( (json) => 
            this.setState(
                user: json
            )
        );
    

    componentDidMount() 
        this.getUserById(4);
    

    render() 
        console.log(this.state.user);
        return (
            <div>
                <h1>User</h1>
                <p>ID: hello</p>
            </div>
        );
    


ReactDOM.render(
    <App/>,
    document.getElementById("container")
);
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script>
<div id="container"></div>

注意:您正在进行ajax 调用,因此不要在 setState 中调用函数,而是在收到响应后在 .then 中执行 setState,如下所示:

.then(json => 
    this.setState(user: json);
 );

【讨论】:

呵呵,是的。我在sn-p中搞砸了。笔记解决了我的问题,谢谢!【参考方案2】:

尝试将 getUserById 方法和 setState 绑定到您的用户对象与 json 响应中。

class App extends React.Component 
constructor(props) 
    super(props);

    this.state = 
        user: 
    
this.getUserById = this.getUserById.bind(this); //add this to your constructor


getUserById(uId) 
    fetch(`https://jsonplaceholder.typicode.com/users/$uId`)
        .then( (response) => 
            return response.json()
        )
        .then( (json) => 
            return json; //setState in here with your ajax request**strong text**
        );


componentDidMount() 
    this.setState(
        user: this.getUserById(4)
    )


render() 
    return (
        <div>
            <h1>User</h1>
            <p>ID: this.state.user.id</p>
        </div>
    );



ReactDOM.render(
<App/>,
document.getElementById("container")

【讨论】:

【参考方案3】:

我认为您的主要问题是 getUserById 方法不返回任何内容,您应该在其中设置状态。那么你给主容器的id有问题,但我想你只在sn-p中犯了一个错误。

上面的代码我已经测试过了,试试看:

class App extends React.Component 
    constructor(props) 
        super(props);

        this.state = 
            user: null
        
    

    getUserById(uId) 
        fetch(`https://jsonplaceholder.typicode.com/users/$uId`)
            .then( (response) => 
                return response.json()
            )
            .then( (json) => 
                return json;
            )
            .then((result) => 
              this.setState(user: result);
            );
    

    componentDidMount() 
        this.getUserById(4)
    

    render() 
        console.log(this.state.user);
        return (
            <div>
                <h1>User</h1>
                <p>this.state.user != null ? this.state.user.id : 0</p>
            </div>
        );
    


ReactDOM.render(
    <App/>,
    document.getElementById("container")
);

【讨论】:

【参考方案4】:

我可以看到的问题 - 你的 fetch promise 不会返回从服务器获得的数据,所以我的建议是在你的 promise 回调中设置 setState,所以它应该看起来像:

getUserById(uId) 
    fetch(`https://jsonplaceholder.typicode.com/users/$uId`)
        .then(result => result.json())
        .then(json => 
            this.setState(user: json);
        );

componentDidMount() 
    this.getUserById(4);

【讨论】:

以上是关于React - 加载 JSON 并渲染组件的主要内容,如果未能解决你的问题,请参考以下文章

React 条件渲染 - 加载组件

从 JSON 渲染 React Native 元素

Vue之重新渲染组件的正确方式

使用 React Router 重新加载 Webpack HotModule 渲染与组件

API 更改后重新渲染 React 组件

如何加载新版本react addon