Javascript 状态更新但不渲染

Javascript 状态更新但不渲染,javascript,reactjs,Javascript,Reactjs,我是ReactJS新手,尝试管理状态更改失败。初始状态按预期进行渲染,状态成功更改,但元素随后不会渲染。DOM控制台中没有要关闭的错误。我已经确保在组件类的构造函数中设置初始状态,并且我还尝试绑定我在构造函数中使用的方法,因为我已经读到自动绑定不是ES6的一部分。相关部件代码如下所示: class MyComponent extends Component { constructor(props) { super(props); this.stat

我是ReactJS新手,尝试管理状态更改失败。初始状态按预期进行渲染,状态成功更改,但元素随后不会渲染。DOM控制台中没有要关闭的错误。我已经确保在组件类的构造函数中设置初始状态,并且我还尝试绑定我在构造函数中使用的方法,因为我已经读到自动绑定不是ES6的一部分。相关部件代码如下所示:

class MyComponent extends Component {
    constructor(props) {
        super(props);
            this.state = {
                myIDs: Array(6).fill('0')
        };
        this.getMyIDs = this.getMyIDs.bind(this);

};

componentDidMount() {
    var ids = this.getMyIDs();
    ids.then((result)=> {
        this.setState({ myIDs: result }, () => {
            console.log(this.state.myIDs)
        });
    })

};

componentWillUnmount() {
    this.setState({
        myIDs: Array(6).fill('0')
    });
};

getMyIDs() {
    return fetch('/api/endpoint').then((response) =>{
        return response.json();
    }).then((myIDs) => {
        return myIDs.result
    })
};

render() {
    return (
        <Tweet tweetId={this.state.myIDs[0]} />
        <Tweet tweetId={this.state.myIDs[1]} />
        );
   }
}

export default MyComponent
与React docs一样:

componentWillMount()在装入之前被调用。它是 在render()之前调用,因此在中同步调用setState() 此方法不会触发额外的渲染。一般来说,我们 建议改为使用构造函数()

避免在这种方法中引入任何副作用或订阅。 对于这些用例,请改用componentDidMount()

componentWillMount
在内部调用ajax:
componentDidMount

另一件事:你为什么要使用
组件将卸载

对象将被删除,没有理由在那里进行调用。

与React docs中一样:

componentWillMount()在装入之前被调用。它是 在render()之前调用,因此在中同步调用setState() 此方法不会触发额外的渲染。一般来说,我们 建议改为使用构造函数()

避免在这种方法中引入任何副作用或订阅。 对于这些用例,请改用componentDidMount()

componentWillMount
在内部调用ajax:
componentDidMount

另一件事:你为什么要使用
组件将卸载


对象将被删除,没有理由在那里进行调用。

当前代码中存在的唯一问题是返回多个元素组件实例,而没有将它们包装在
React.Fragment
或包装器
div
的数组中。使用最新版本的react,您必须编写

render() {
    return (
        <React.Fragment>
           <Element Id={this.state.myIDs[0]} />
            <Element Id={this.state.myIDs[1]} />
        </React.Fragment>
        );
   }
}
render(){
返回(
);
}
}
另外,作为一种实践,您必须在
componentDidMount
中进行异步调用,而不是像React文档建议的那样在
componentWillMount
中进行异步调用。您可能需要阅读更多详细信息


在元素组件中使用prop
Id
时,您必须记住的另一件事是,
componentWillMount
componentDidMount
生命周期函数仅在初始渲染时调用,而不是在初始渲染之后调用,因此,如果您在Element component中的其中一个函数中使用
this.props.Id
,则您将无法看到更新,因为异步请求的结果将只在稍后出现,检查如何解决这种情况

当前代码中存在的唯一问题是返回多个元素组件实例,而没有将它们包装在
React.Fragment
或包装器
div
数组中。使用最新版本的react,您必须编写

render() {
    return (
        <React.Fragment>
           <Element Id={this.state.myIDs[0]} />
            <Element Id={this.state.myIDs[1]} />
        </React.Fragment>
        );
   }
}
render(){
返回(
);
}
}
另外,作为一种实践,您必须在
componentDidMount
中进行异步调用,而不是像React文档建议的那样在
componentWillMount
中进行异步调用。您可能需要阅读更多详细信息


在元素组件中使用prop
Id
时,您必须记住的另一件事是,
componentWillMount
componentDidMount
生命周期函数仅在初始渲染时调用,而不是在初始渲染之后调用,因此,如果您在Element组件中的其中一个函数中使用
this.props.Id
,那么您将无法看到更新,因为异步请求的结果只会在稍后出现,请检查如何处理这种情况

确保
result
是一个数组。什么是
console.log(this.state.myIDs)
outputArray.isArray(result)返回true,因此我确信结果是一个数组。当我打印出this.state.myIDs时,它会返回一个包含更新ID列表的列表。这就是我如何确认状态确实发生了更改,只是没有呈现。Element component包含什么?Element component是什么样子的,您是在component中使用此.props.Id还是Element的componentDidMount生命周期钩子确保
结果
是一个数组。console.log(this.state.myIDs)包含什么outputArray.isArray(result)返回true,因此我确信结果是一个数组。当我打印出this.state.myIDs时,它会返回一个包含更新ID列表的列表。这就是我如何确认状态确实发生了更改,只是没有呈现。Element component包含什么?Element component是什么样子的,您是在component Willmount中使用这个.props.Id还是在component DidMount中使用Element的生命周期钩子,这对OP用例没有任何影响。这是一种必须遵循的实践,而不是在该方法中同步调用setState()不会触发额外渲染的问题的原因。但是OP正在
componentWillMount
中异步调用
setState
。我已尝试了componentWillMount和ComponentDidMount,但均未成功。请选择“console.log(this.state)”在您的呈现方法中,让我们查看页面加载的输出这是在呈现函数中记录this.state的控制台输出,我已将唯一ID更改为stars:“(6)[*************************”、“*******************************”、“*******************************”、“*******************************”、“**********************************”、*********************************************************************************************************************************************************************************************************************************************,************************************************************************************************************这对OP用例没有任何影响。这是一种必须遵循的实践,而不是在该方法中同步调用setState()不会触发额外渲染的问题的原因。但是OP正在打电话