【发布时间】:2020-06-12 20:35:03
【问题描述】:
使用常规的 React 可以有这样的东西:
class NoteEditor extends React.PureComponent {
constructor() {
super();
this.state = {
noteId: 123,
};
}
componentWillUnmount() {
logger('This note has been closed: ' + this.state.noteId);
}
// ... more code to load and save note
}
在 React Hooks 中,可以这样写:
function NoteEditor {
const [noteId, setNoteId] = useState(123);
useEffect(() => {
return () => {
logger('This note has been closed: ' + noteId); // bug!!
}
}, [])
return '...';
}
从useEffect 返回的内容只会在组件卸载之前执行一次,但是状态(如上面的代码中所示)将是陈旧的。
一种解决方案是将noteId 作为依赖项传递,但效果会在每个渲染上运行,而不仅仅是一次。或者使用引用,但这很难维护。
那么有没有推荐的模式来使用 React Hook 来实现呢?
使用常规的 React,可以从组件中的任何位置访问状态,但使用钩子似乎只有复杂的方式,每种方式都有严重的缺陷,或者我只是遗漏了一些东西。
有什么建议吗?
【问题讨论】:
-
“复杂的方式”:钩子往往比基于类的对应物要简单得多。 “严重的缺点”:我很想知道这些是什么。 “但这很难维护”:为什么 ref 很难维护?当
nodeId改变时更新ref,用当前的useEffect读取? -
这能回答你的问题吗? componentWillUnmount with React useEffect
-
"当 nodeId 改变时更新 ref" - 这意味着每次 nodeId 改变时有两个变量而不是一个要更新。当然可以,但这并不简单。事实上,即使是 React Hooks 文档也建议不要使用 ref(尽管他们没有说明要使用什么)。
-
类组件有时确实更有意义。这可能是其中一种情况。或者依靠卸载的组件来跟踪是否已关闭可能不是最好的方法?
-
"但是效果会在每次渲染上运行" - 应该是 "但是效果会在 noteId 更改时运行"。
标签: javascript reactjs state react-hooks use-effect