Phi*_*hil 10 javascript state reactjs
我正在创建一个简单的聊天应用程序,我通过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 ]
})
})
};
Run Code Online (Sandbox Code Playgroud)
我看过一些关于生命周期功能和设置状态的帖子,看起来我做的是正确的.
再次强调,axios调用工作正常,设置状态不起作用.我仍然看到一个空数组.提前致谢!
编辑:这是我的问题的具体解决方案.它被埋在评论中,所以我想我会把它留在这里..
"我发现了这个问题.实际上是我解析数据的方式.在... messages.content上的扩展运算符不起作用,因为messages.content不存在.message [i] .content存在.所以我的修复只是传播...消息然后在子组件中我映射对象并解析.content属性.感谢帮助人!
Pra*_*avi 10
在您的情况下,您setState()将无法工作,因为您在setState()异步回调中使用
工作小提琴:https://jsfiddle.net/xytma20g/3/
您正在进行异步API调用.因此,setState只有在收到数据后才会调用.它对componentWillMountor 没有任何作用componentDidMount.您需要message在渲染中处理空白.当您从API接收数据时,将该数据设置为状态,并且组件将使用将在渲染中反映的新状态重新呈现.
伪代码:
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.
}
};
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
28830 次 |
| 最近记录: |