当前位置: 首页 > 知识库问答 >
问题:

无法读取reactjs中getInitialState中的props数据对象和子组件中的ComponentDidMount

云瑞
2023-03-14

下面是我试用过的一小段代码:

var CommentBox = React.createClass({
        loadCommentsFromServer: function () {
            $.ajax({
                url: this.props.url,
                dataType: 'json',
                type: 'GET',
                success: function (data) {
                    this.setState({data: data});
                }.bind(this),
                error: function (xhr, status, err) {
                    console.error(this.props.url, status, err.toString());
                }.bind(this),
                cache: false
            });
        },
        getInitialState: function () {
            return {data: []};
        },
        componentDidMount: function () {
            this.loadCommentsFromServer();
        },
        render: function () {
            return (
                    <div className="commentBox">
                        <MessageBox1 data={this.state.data}/>
                    </div>
            );
        }
    });

    var MessageBox1 = React.createClass({
        getInitialState: function() {
            alert('MessageBox1 getInitialState');
            return {nameWithQualifier: 'Mr. ' + this.props.data.pageName};
        },
        componentDidMount: function() {
            alert('this.props.data: ' + this.props.data);
        },
        render: function() {
            return (<div>
                        <div>{this.state.nameWithQualifier}</div>
                        <div> {this.props.data.pageName}</div>
                    </div>
            );
        }
    });

ReactDOM.render(<CommentBox url="/save/6"/>, document.getElementById('content'));

在CommentBox中,我查询一个ID为6的对象,并将其传递给MessageBox1组件。我想让这个对象成为MessageBox1组件中的状态变量。这里的问题是,我无法读取props变量。“this.props.data”在MessageBox1组件的getInitialState和ComponentDidMount中未定义。然而,在render函数中,我可以看到正确的值。我尝试过几个能够读取GetInitialState中的props数据的示例。为什么这里没有发生这种事?请帮忙。我在控制台没有任何错误。

共有1个答案

花阳秋
2023-03-14

我相信您对react组件的生命周期有些困惑。

我建议快速阅读本文,以了解何时调用每个生命周期方法。http://busypeoples.github.io/post/react-component-lifecycle/

在getInitialState方法的messagebox1中,像这样初始化状态结构,以防止在道具可用之前访问它们。

{ nameWithQualifier: '' }
componentWillReceiveProps(newProps) {
    this.setState({ nameWithQualifier: 'Mr. ' + newProps.data.pageName })
}
componentWillMount() {
    this.setState({ nameWithQualifier: 'Mr. ' + this.props.data.pageName })
}

所以如果你真的想这么做,我推荐上面的2个建议

  1. 在componentWillMount中调用ajax请求,以获取更早发送的请求
  2. 在componentWillReceiveProps上更新子组件中的状态(每次更新道具时都会更新您的状态)

然而,在大多数情况下,用它的道具设置组件状态似乎没有必要。也许可以试试这样的方法:

   render: function () {
        return (
                <div className="commentBox">
                    <MessageBox1 pageName={this.state.data.pageName}/>
                </div>
        );
    }
    render: function() {
        return (<div>
                    <div>{'Mr. ' + this.props.pageName}</div>
                    <div> {this.props.pageName}</div>
                </div>
        );
    }
 类似资料:
  • 本文向大家介绍vue中子组件的methods中获取到props中的值方法,包括了vue中子组件的methods中获取到props中的值方法的使用技巧和注意事项,需要的朋友参考一下 父子组件通信 这个官网很清楚,也很简单,父组件中使用v-bind绑定传送,子组件使用props接收即可 例如: 父组件中 子组件中 这种情况下,子组件的methods中想要取到props中的值,直接使用this.char

  • 问题内容: 因此,我已经进行了一段时间的尝试,并认为最好重构我的代码,以便将状态设置为对象数组。我想做的是单击按钮时增加一个数字。 我在组件中有一个回调函数,可触发一个函数来更新状态…但是,我很难将对象内的键值作为目标。 我的初始状态如下: 我正在尝试锁定键,但不知道如何操作。我的函数传递了一个键,以便可以将数组中的索引作为目标,但是当我尝试执行以下操作时:由于意外的令牌,它会引发错误。 我曾尝试

  • 所以我在这方面做了一段时间,觉得最好重构我的代码,以便将状态设置为一个对象数组。我要做的是增加一个点击按钮的数字。 我在这里尝试过类似于这个线程的东西,但是我不断得到错误。 我可以编写什么样的函数来设置我想要目标的对象中的键的状态?

  • 问题内容: 我试图通过对象属性(此示例的名称)并在函数的轻松循环中列出它们。我发现这样做有些尴尬,但这似乎不正确。 这是我得到的: 有一个更好的方法吗?我只需要一个循环即可遍历对象数组,列出所需的属性并创建许多html节点之一。 问题答案: 您可以简单地在数组上 映射

  • 在我的main(一个名为VehicleDriverClass的seperate类)中,我试图使用I/O将车辆数据写入文件,并从文件中读取车辆数据。我可以写一个文件罚款。我正在使用记事本和一个。txt文件来读取。我遇到的问题是,当从文件中读取时,如何终止一行的结尾。这里是Vehicle类的构造函数,所以您知道Paramaters。 这就是我目前的输入法(不试图创建oject,只是从文件中读取)。传递

  • 我需要在ReactJS中从父组件调用子组件方法。我试过使用裁判,但不能做到这一点。有没有人能提出任何解决方案。多谢了。