Reactjs prop在渲染中可用,但在componentDidMount中不可用

时间:2015-03-27 21:46:10

标签: javascript reactjs

我有一个奇怪的问题。当我打电话给#34; UserShowStatsSuggestions"来自这堂课:

var UserShowStatsPanelBody = React.createClass({
    getInitialState: function() {
        return {data: []};
    },
    componentDidMount: function() {
        // Get the show
        var showUrl = "/api/v1/show/" + this.props.showStats.show + "/";
        $.ajax({
            url: showUrl,
            dataType: 'json',
            success: function(data) {
                this.setState({data: data});
            }.bind(this),
            error: function(xhr, status, err) {
                console.error(this.props.url, status, err.toString());
            }.bind(this)
        });
    },
    render: function() {
        var statElements = [];
        // Create the user show stats
        if (this.props.showStats) {
            var showID = this.state.data.id;
            var showLink = "/leaderboards/show/" + showID + "/";
            var recapLink = "/recap/" + this.state.data.id + "/";
            statElements.push(<div className="row"></div>);
            statElements.push(<div className="row"></div>);
            statElements.push(<div className="row"></div>);
            statElements.push(<UserShowStatsSuggestions userID={this.props.userID} showID={showID} />);
            statElements.push(<div className="row"></div>);
        }

        return (
            <div>{statElements}</div>
        );
    }
});

我可以访问道具&#34; showID&#34;在渲染中,但不在componentDidMount中:

var UserShowStatsSuggestions = React.createClass({
    getInitialState: function() {
        return {data: []};
    },
    componentDidMount: function() {
        console.log(this.props);
    },
    render: function() {
        console.log(this.props);
        return (
            <div></div>
        );
    }
});

来自componentDidMount console.log

{userID: "107050829081899378766", showID: undefined}

来自render console.log

{userID: "107050829081899378766", showID: 5705241014042624}

为什么会出现这种情况?

1 个答案:

答案 0 :(得分:6)

查看渲染中的console.log是否多次执行。

componentDidMount只运行一次,因此您永远不会在componentDidMount中看到使用正确的showID执行的另一个console.log。

但是,渲染运行不止一次,所以在父状态更新后你会看到console.log,其中showId不再为null。

修改父级渲染方法,以便在完成ajax调用之前不渲染。