【发布时间】:2019-05-08 03:37:42
【问题描述】:
我通过将数据推送到旧状态对象并将其作为值返回来更新 useEffect。
这段代码实际上是从 useState() 改变了 _series 变量,但是没有重新渲染,为什么?
import { TimeSeries, Pipeline, Stream, EventOut, TimeEvent, TimeRange } from "pondjs";
export default () => {
const [_series, $series] = useState(()=>{
let state = { data : { "name": "x", "columns": ["time", "value"], "points": [], "i" : 0}}
for(let i=10; i >= 0; i--){state.data.points.push( [new Date(i)-(i*100), Math.round(Math.random()*100)])}
return state;
})
useEffect(() => {
const interval = setInterval(() => {
$series(s => {
s.data.points.push( [new Date(s.data.i*1000), Math.round(Math.sin(s.data.i/10)*50+50)] )
s.data.points.shift();
s.data.i++;
return s;
});
}, 500);
}, []);
return(
<p>{
JSON.stringify((new TimeSeries(_series.data)).collection())
}</p>
)
}
我也可能通过更新状态中的键“i”而犯了一个错误,所以我尝试一次更新对象的多个部分。这是不好的做法吗?
【问题讨论】:
-
return {...s}会创建一个新对象以确保 React 知道它是一个新状态
标签: reactjs react-hooks