【发布时间】:2021-09-09 21:26:38
【问题描述】:
我在客户端和服务器之间建立了 websocket 连接。
客户端想要显示 ID 列表及其 progressValue。
另一端的服务器总是发送例如长度为 1 的 obj 数组
[{"processid": "1","progressVal" : 10%}]
[{"processid": "2","progressVal" : 5%}]
[{"processid": "1","progressVal" : 25%}]
[{"processid": "3","progressVal" : 1%}]
[{"processid": "2","progressVal" : 12%}]
like that it keeps sending processid and its progressVal
现在在服务器端它没有任何状态。它只是将数据发送到客户端。
在客户端,客户端想要监听服务器发送的消息,并创建一个数组来存储progressid和progressVal,以便它可以循环显示它在GUI中。
逻辑:
- 想要创建一个包含 processid 和 progressVal 列表的单个数组
- 检查创建的列表中是否已经存在processid, 如果是,则检查progressVal 是否相同,如果不是,则更新progressVal 如果否,则将 processid 和 progressVal 添加到此数组中。
预期结果
dataFromServer = [{"processid": "1","progressVal" : 10%}]
then proList = [{"processid": "1","progressVal" : 10%}]
dataFromServer = [{"processid": "2","progressVal" : 5%}]
then proList = [{"processid": "1","progressVal" : 10%},{"processid": "2","progressVal" : 5%} ]
dataFromServer = [{"processid": "1","progressVal" : 25%}]
then proList = [{"processid": "1","progressVal" : 25%},{"processid": "2","progressVal" : 5%} ]
dataFromServer = [{"processid": "3","progressVal" : 1%}]
then proList = [{"processid": "1","progressVal" : 25%},{"processid": "2","progressVal" : 5%}, {"processid": "3","progressVal" : 1%} ]
dataFromServer = [{"processid": "2","progressVal" : 12%}]
then proList = [{"processid": "1","progressVal" : 25%},{"processid": "2","progressVal" : 12%}, {"processid": "3","progressVal" : 1%} ]
class App extends Component {
constructor(props){
super(props);
this.state = {
dataFromServer : ""
}
}
componentDidMount(){
client.onmessage = (message) => {
this.setState({dataFromServer: JSON.parse(message.data)});
};
}
render() {
if(!this.state.dataFromServer){
return "loading"
}
else if(this.state.dataFromServer && this.state.dataFromServer.length >0){
return(
<div>
<processList dataFromServer={this.state.dataFromServer}/>
</div>
);
}
}
}
export default App;
class processList extends Component {
constructor(props){
super(props);
this.state = {
proList : [{
id: "",
progVal: parseInt("0%")
}] // i want to set here initial values for id and progVal
}
}
componentDidMount(){
if(this.props.dataFromServer){
this.props.dataFromServer.map(d => {
let arr = [];
let objToPush = {id: element.id, progVal: element.progVal};
arr.push(objToPush);
this.setState ({
proList: arr
});
});
}
}
componentDidUpdate(prevProps, prevState){ //want to push into array if processId is new, and want to update the progVal if processId already exists in array
this.props.dataFromServer.map(d => {
}
else if(prevState.proList.id == d.id){
//not sure how to do logic here.
}
})
}
render(){
return(
this.state.proList.map(data => {
return(
<div>
<p>{data.id}</p>
<p>{data.progVal}</p>
</div>
);
})
);
};
}
【问题讨论】:
标签: javascript arrays reactjs setstate