gpt4 book ai didi

javascript - 无法在 componentWillMount 中设置状态

转载 作者:可可西里 更新时间:2023-11-01 02:39:21 25 4
gpt4 key购买 nike

我正在创建一个简单的聊天应用程序,我通过 axios 对我的数据库进行 api 调用,它返回一组消息对象。当我在 componentWillMount 中进行 axios 调用时,我能够获取数据。然后我试图 setState 来显示对话。这是代码:

export default class Chat extends Component {
constructor(props){
super(props);

this.state = {
messages : [],
message : '',
};
this.socket = io('/api/');
this.onSubmitMessage = this.onSubmitMessage.bind(this);
this.onInputChange = this.onInputChange.bind(this);
}

componentWillMount() {
axios.get(`api/messages`)
.then((result) => {
const messages = result.data
console.log("COMPONENT WILL Mount messages : ", messages);
this.setState({
messages: [ ...messages.content ]
})
})
};

我看过一些关于生命周期函数和设置状态的帖子,看来我做的是对的。

再次强调,axios 调用工作正常,设置状态无效。我仍然看到一个空数组。提前致谢!

编辑:这是专门针对我的问题的解决方案。它被埋在评论中,所以我想我会把它留在这里..

“我发现了这个问题。这实际上是我解析数据的方式。...messages.content 上的传播运算符不起作用,因为 messages.content 不存在。messages[i].content 存在. 所以我的解决方法是只传播...消息然后在一个子组件中我映射对象并解析 .content 属性。谢谢你们的帮助!”

最佳答案

在您的情况下,您的 setState() 将不起作用,因为您在异步回调中使用 setState()

工作 fiddle :https://jsfiddle.net/xytma20g/3/

您正在进行异步的 API 调用。因此,setState 只会在收到数据后调用。它不会对 componentWillMountcomponentDidMount 做任何事情。您需要处理渲染中的空 message。当您从 API 收到数据时,将该数据设置为状态,组件将使用新状态重新渲染,这将反射(reflect)在您的渲染中。

伪代码:

export default class Chat extends Component {
constructor(props){
super(props);

this.state = {
messages : [],
message : '',
};
this.socket = io('/api/');
this.onSubmitMessage = this.onSubmitMessage.bind(this);
this.onInputChange = this.onInputChange.bind(this);
}

componentWillMount() {
axios.get(`api/messages`)
.then((result) => {
const messages = result.data
console.log("COMPONENT WILL Mount messages : ", messages);
this.setState({
messages: [ ...messages.content ]
})
})

render(){
if(this.state.messages.length === 0){
return false //return false or a <Loader/> when you don't have anything in your message[]
}

//rest of your render.
}
};

关于javascript - 无法在 componentWillMount 中设置状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40199151/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com