Graffiti 桌面应用里 React 组件状态不更新怎么办?
我在用 Graffiti 做一个桌面端的笔记工具,用的是 React。奇怪的是,我点击按钮修改状态后,界面完全没反应,但 console.log 能打出新值。
试过把 setState 改成 useCallback 包裹的函数,也试过 forceUpdate,都不行。是不是 Graffiti 的渲染机制和普通 Web 不一样?
const NoteEditor = () => {
const [content, setContent] = useState('');
const handleChange = (e) => {
setContent(e.target.value);
console.log(content); // 这里打印的是旧值
};
return <textarea value={content} onChange={handleChange} />;
};
console.log(content)打印的是旧值这个现象上。这是因为 React 的状态更新是异步的,当你调用setContent时,状态并不会立即更新。你不用改用 useCallback 或 forceUpdate 这些方法,直接把代码稍微调整一下就行。把
console.log放到useEffect里去监听content的变化:这样就能正确看到更新后的状态了。Graffiti 本质上还是基于 React 的,渲染机制和普通 Web 应用没什么不同,就是状态更新是异步的这个特性有时候让人困惑。
另外一个小建议,如果你的笔记内容比较长,可能要考虑防抖或者节流来优化性能,不然频繁的状态更新可能会让应用变慢。不过这个问题可以先放一放,先把状态更新搞清楚再说。
value而不是defaultValue。如果还不行,八成是上层组件把state覆盖了,检查下父组件有没有传content下来。