【发布时间】:2018-03-19 20:06:06
【问题描述】:
所以我使用 pub/sub 模型来监听来自另一个客户端的发布消息,因为它们正在实时发送,并且我将这些消息作为数组存储在组件的状态对象中,并且我不断添加当他们进来时。我在图表中显示数据,但我想知道如何限制状态存储的消息数量,比如 50?正在考虑使用切片我应该改变状态来删除项目吗?
我应该在我的 ComponentDidMount 方法中添加一个 if 条件来检查这样的状态吗?
if(this.state.data.length > 50) {
this.setState({ data: this.state.slice(-50) })
}
只是想看看有什么好的方法可以限制消息的数量,这样状态中就不会包含 50,000 个对象。谢谢
编辑:
根据 Asymons 的评论,我将其更改为如下所示。非常感谢你的评论很有帮助。我还有一个问题:你提到的关于减少重新渲染的最后一部分。这段代码是否满足那部分,因为我非常关心性能,所以我想尽可能减少重新渲染,再次感谢。
componentDidMount() {
client.on('message', (topic, payload, packet) => {
console.log('topic: ', topic);
const parsedPayload = JSON.parse(payload);
if (parsedPayload.type !== 'pub') {
return null;
}
const voltage = Math.trunc(parsedPayload.data.data.voltage);
const pressure = Math.trunc(parsedPayload.data.data.air_pressure);
const humidity = Math.trunc(parsedPayload.data.data.air_humidity);
const temperature = Math.trunc(parsedPayload.data.data.air_temperature);
const message = {
time: moment().format('LT'),
temperature,
humidity,
voltage,
pressure,
parsedPayload,
topic,
}
this.setState((prevState) => {
// create an array that holds objects with my data and push the
// message object as it comes in into the array
const messages = [...prevState.messages]
messages.push(message)
if (prevState.messages.length > 20) {
messages.pop()
return {
messages,
};
} else {
return {
messages,
};
}
});
});
}
【问题讨论】:
-
您从哪里以及如何获取数据?在收到来自外部 API 的数据之后和在
setState之前,您会截断它。
标签: javascript arrays reactjs state