Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我应该如何在react with lifecycle方法中解析这个json对象?_Json_Reactjs - Fatal编程技术网

我应该如何在react with lifecycle方法中解析这个json对象?

我应该如何在react with lifecycle方法中解析这个json对象?,json,reactjs,Json,Reactjs,我应该如何使用生命周期方法解析它 {"blocks":[{ "key":"33du7", "text":"Hello there!", "type":"unstyled", "depth":0, "inlineStyleRanges":[], "entityRanges":[], "data":{}}], "entityMap":{} } 我想在我的组件中呈现文本,但我不知道它为什么会抛出未定义的错误。我该怎么称呼它 这是我的组件: class Blog ext

我应该如何使用生命周期方法解析它

{"blocks":[{
  "key":"33du7",
  "text":"Hello there!",
  "type":"unstyled",
  "depth":0,
  "inlineStyleRanges":[],
  "entityRanges":[],
  "data":{}}],
  "entityMap":{}
}
我想在我的组件中呈现文本,但我不知道它为什么会抛出未定义的错误。我该怎么称呼它

这是我的组件:

class Blog extends Component{

constructor(props){
    super(props);
    this.blogContent = props.blogContent;
    this.blogId = props.blogId;

    this.handleRemoveBlog = this.handleRemoveBlog.bind(this);
    this.state = {
        blog__: '',
    };

}

handleRemoveBlog(blogId){
    this.props.removeBlog(blogId);
}
这是我的生命周期方法,我会使用This.setState,但首先它在控制台中给出了未定义的

   componentWillMount(){
      this.state.blog__ = JSON.parse(this.blogContent);
      console.log(this.state.blog__.text);    // this gives undefined     
  } 
这是渲染部分。。 数据来自Firebase。 {this.blogcontent}给出了我前面提到的json字符串

render(props) {
    return(
        <div className = "blog header">
            <p>{this.blog__.text}</p>

        </div>
    );
}
 }

 Blog.proptypes = {
    blogContent: Proptypes.string
 }

这主要取决于您从何处获取此对象。如果它是通过网络获取的,那么传递它的最佳位置就是componentDidMount。原因是替代生命周期方法componentWillMount不保证重新呈现组件,因为它不会等待异步操作完成执行,然后再将控制权传递给呈现方法。因此componentDidMount是最好的,因为一旦收到新道具或状态发生变化,就会触发重新渲染。然而,如果这个对象是从应用程序中提取的,那么很有可能,即使在componentWillMount中提取,它也能正常工作。这是因为该操作会快得多,以至于可以使用新的道具将控制传递给渲染方法。这是不能保证的,特别是如果您想在进程中设置状态,那么设置状态也是异步的,所以控件可能会在收到所有必需的数据之前执行其余的代码

简而言之,将其传递给componentDidMount,并在渲染函数中,在访问此道具之前,确保它存在。也就是说,而不是

render() {
 return <div>{this.props.theObject.blocks[0].key}</div>
}

这主要取决于您从何处获取此对象。如果它是通过网络获取的,那么传递它的最佳位置就是componentDidMount。原因是替代生命周期方法componentWillMount不保证重新呈现组件,因为它不会等待异步操作完成执行,然后再将控制权传递给呈现方法。因此componentDidMount是最好的,因为一旦收到新道具或状态发生变化,就会触发重新渲染。然而,如果这个对象是从应用程序中提取的,那么很有可能,即使在componentWillMount中提取,它也能正常工作。这是因为该操作会快得多,以至于可以使用新的道具将控制传递给渲染方法。这是不能保证的,特别是如果您想在进程中设置状态,那么设置状态也是异步的,所以控件可能会在收到所有必需的数据之前执行其余的代码

简而言之,将其传递给componentDidMount,并在渲染函数中,在访问此道具之前,确保它存在。也就是说,而不是

render() {
 return <div>{this.props.theObject.blocks[0].key}</div>
}
在componentWillMount函数中使用此.setState{},将数据分配给变量。另外,我建议使用componentDidMount而不是componentWillMount,因为它在将来会被弃用

  componentDidMount(){
      let text = JSON.parse( this.blogContent );
      this.setState({blog__: text });     
  } 
编辑:仅在componentDidMount中根据@brandNew comment使用setState。在componentWillMount函数中使用setState{}将数据分配给变量。另外,我建议使用componentDidMount而不是componentWillMount,因为它在将来会被弃用

  componentDidMount(){
      let text = JSON.parse( this.blogContent );
      this.setState({blog__: text });     
  } 

编辑:仅根据@brandNew comment在componentDidMount中使用setState,您不应使用

  this.state.blog__ = JSON.parse(this.blogContent);
正确的方法是使用this.setState方法:

然后,为了确保组件将被重新渲染,请使用shouldComponentUpdate方法:

请看下面的图片

另外一点:使用componentDidMount而不是componentWillMount,因为它将来会被弃用

  componentDidMount(){
      let text = JSON.parse( this.blogContent );
      this.setState({blog__: text });     
  } 
Atention:setState是一种异步方法。因此,它不会立即更新您的状态


不应使用修改状态

  this.state.blog__ = JSON.parse(this.blogContent);
正确的方法是使用this.setState方法:

然后,为了确保组件将被重新渲染,请使用shouldComponentUpdate方法:

请看下面的图片

另外一点:使用componentDidMount而不是componentWillMount,因为它将来会被弃用

  componentDidMount(){
      let text = JSON.parse( this.blogContent );
      this.setState({blog__: text });     
  } 
Atention:setState是一种异步方法。因此,它不会立即更新您的状态


请包含您为尝试使用此对象而编写的代码。@brandNew是正确的。简单回答-仅根据您的评论-使用componentWillMount,也可能使用componentWillUpdateSorry,我现在已经更新了它。现在,您能告诉我哪里出了问题吗?请包括您为尝试使用此对象而编写的代码。@brandNew是正确的。简单回答-仅根据您的评论-使用componentWillMount,也可能使用componentWillUpdateSorry,我现在已经更新了它。现在你能告诉我哪里出了问题吗?使用setState可能不是一个好主意,因为它不能保证状态会改变
在执行渲染方法之前设置。同样,这也适用于ComponentWillMount@brandNew这不应该是问题所在。渲染函数将被调用两次。这实际上是一个问题,因为您说海报必须在ComponentWillMount中设置状态。这肯定是一个问题,因为不能保证setState会在控制权移交给下一个函数之前完成,那么这就是问题所在。但是你应该经常使用component,看看你答案的第一行。在组件WillMountUsing中使用此.setState{}可能不是一个好主意,因为它不能保证在执行render方法之前设置状态。同样,这也适用于ComponentWillMount@brandNew这不应该是问题所在。渲染函数将被调用两次。这实际上是一个问题,因为您说海报必须在ComponentWillMount中设置状态。这肯定是一个问题,因为不能保证setState会在控制权移交给下一个函数之前完成,那么这就是问题所在。但是你应该经常使用component,看看你答案的第一行。在您的组件WillMount中使用此.setState{}。因此,如果我想获取该json字符串中的文本,我应该在componentDidMount中写些什么?此行的意思是什么-this.props.theObject&&this.props.theObject.blocks[0]。keyIt的惰性计算。Javascript和大多数其他编程语言都使用它。它所做的是计算第一个表达式,如果第一个表达式为false,则返回false,因为无论以下表达式是否为true,最终结果都为false,因为这两个表达式由一个与&&&符号连接。例如,false&&true返回false。false | | true返回true。谢谢,我明白了:如果我想获取json字符串中的文本,我应该在componentDidMount中写什么?这行的意思是什么-this.props.theObject&&this.props.theObject.blocks[0]。keyIt是惰性计算。Javascript和大多数其他编程语言都使用它。它所做的是计算第一个表达式,如果第一个表达式为false,则返回false,因为无论以下表达式是否为true,最终结果都为false,因为这两个表达式由一个与&&&符号连接。例如,false&&true返回false。false | | true返回true。谢谢,明白了: