Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/466.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/23.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
Javascript 渲染前使用setState()设置状态?_Javascript_Reactjs - Fatal编程技术网

Javascript 渲染前使用setState()设置状态?

Javascript 渲染前使用setState()设置状态?,javascript,reactjs,Javascript,Reactjs,是的,我知道以前有人问过这个问题,但实际上按照建议去做对我来说是行不通的 因此,在运行render()方法(在父级中)之前,必须运行以下方法,因为我需要为Google图表和一些复选框准备大量数据 如下所示,在名为parseTestData的函数中调用此函数: this.setState({ data: ..., levels: ..., ... ... }, }); 我遗漏了很多信息,因为我不被允许分享这一部分。因此,我从父构造函数调用函数parseTe

是的,我知道以前有人问过这个问题,但实际上按照建议去做对我来说是行不通的

因此,在运行render()方法(在父级中)之前,必须运行以下方法,因为我需要为Google图表和一些复选框准备大量数据

如下所示,在名为
parseTestData
的函数中调用此函数:

this.setState({
    data: ...,
    levels: ...,
    ...
    ...
    },
});
我遗漏了很多信息,因为我不被允许分享这一部分。因此,我从父构造函数调用函数
parseTestData

constructor(props) {
    super(props);
    this.parseTestData();
}
但这样做告诉我:

无法对尚未安装的组件调用setState

环顾四周,建议似乎是这样做:

componentWillMount() {
    this.parseTestData();
}
但事实上,这根本没有设定状态。所有依赖父级状态的子级现在都会获得未定义的道具


我该怎么办?

读了你的帖子,我觉得你还没有反应过来

基本上,当状态改变时,React会检查任何视觉变化,并将它维护的虚拟DOM与DOM进行比较,然后呈现它

如果在构造函数中调用方法,它将检测视觉变化并尝试渲染,因此每次都会调用构造函数

如果要将道具从父代传递到子代,并且道具已连接到父代的状态,请确保具有默认状态

那么现在来回答你的问题:

家长

constructor(props){
    super(props)
    this.state = // set your state but don't ever change state here
    .....
}

componentDidMount(){
    this.parseTestData(); // componentWillMount will also work fine
}

render(){
    return(
        <Child arg={this.state.someArg} />
    )
}

是的,您不能在构造函数中使用此.setState()方法。相反,您可以直接为状态赋值。请参阅下面的示例代码

constructor(props)
{
  super(props);
  this.state = {
      data:'',
      levels: 2
    }
}

我建议您定义并称之为this.parseTestData();在父类中执行setState,然后将状态传递给子类。我指的是当前有这个的子类。parseTestData()这个方法在父类中调用,任何来自父类的方法都将填充父类状态。孩子们将从父母那里得到他们的道具。所以我不完全确定你的意思。你的测试数据似乎是同步的,那么为什么不在构造函数中用
this.state={…}
设置它的初始状态,因为你可能使用的其他生命周期方法是
componentDidMount
static getDerivedStateFromProps
componentdiddupdate
,请看一下@Icepickle,因为当我使用
this.state
(我最初是这样做的)时,我收到了一系列关于不要直接改变状态的警告,而是使用
setState()
。这是为了工作,所以我必须尽可能少地尝试,但这可能是不可避免的。在构造函数中,这应该是好的,但这实际上取决于您的测试数据是什么,您正在使用它做什么,以及它是否会在组件生命周期中更新。我是一个新的反应者。我必须通过工作中的反复试验来学习,因为我以前从未使用过它,但我知道JavaScript。所以这是一场艰苦的战斗。但是谢谢你。我将尝试使用以下内容继续前进:)还有一件事,在将函数传递给任何其他组件时,您需要将函数绑定到该组件
constructor(props)
{
  super(props);
  this.state = {
      data:'',
      levels: 2
    }
}