React - 加载JSON和渲染组件

Fur*_*raz 5 javascript ajax json ecmascript-6 reactjs

正如标题所说,我正在尝试使用fetch()加载一个React组件,该组件包含我从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")
);
Run Code Online (Sandbox Code Playgroud)
<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>
Run Code Online (Sandbox Code Playgroud)

有什么想法解决这个问题吗?

May*_*kla 6

问题在于这一行:

<div class="container"></div>
Run Code Online (Sandbox Code Playgroud)

你定义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")
);
Run Code Online (Sandbox Code Playgroud)
<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>
Run Code Online (Sandbox Code Playgroud)

注意:您正在进行ajax调用,而不是在setState中调用funtion,一旦得到响应,请在.then内执行setState,如下所示:

.then(json => {
    this.setState({user: json});
 });
Run Code Online (Sandbox Code Playgroud)