javascript - 使用 React Hooks 卸载组件时如何访问状态?

标签 javascript reactjs state react-hooks use-effect

使用常规的 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,可以从组件中的任何位置访问状态,但使用 hooks 似乎只有复杂的方法,每种方法都有严重的缺点,或者也许我只是错过了一些东西。

有什么建议吗?

最佳答案

useRef()来救援。

由于 ref 是可变的并且在组件的生命周期内存在,因此我们可以使用它来存储当前值(无论何时更新),并且仍然可以在 的清理函数中访问该值>useEffect 通过引用的 value .current 属性。

因此,将有一个额外的 useEffect() 来在状态发生变化时保持引用的值更新。

示例片段

const [value, setValue] = useState();
const valueRef = useRef();

useEffect(() => {
  valueRef.current = value;
}, [value]);

useEffect(() => {
  return function cleanup() {
    console.log(valueRef.current);
  };
}, []);

感谢https://www.timveletta.com/blog/2020-07-14-accessing-react-state-in-your-component-cleanup-with-hooks/的作者。请参阅此链接进行深入研究。

关于javascript - 使用 React Hooks 卸载组件时如何访问状态?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60456803/

相关文章:

javascript - 在 React.cloneElement() 中设置 aria-label/aria-labelledby?

c++ - 有人可以解释这些编程术语 : reference semantics, 非线性可变状态吗?

javascript - 如何将 Wordpress php 代码添加到 JavaScript 中

javascript - 如何在使用已更新的依赖值分派(dispatch)操作后更新 api 调用

reactjs - 如何使用 dnd-kit 处理自由拖放?

javascript - react : Child Component Does Not Rerender When Submitting Form

haskell - Haskell 中的嵌套状态

php - 以某种方式访问​​ Javascript 输出?

javascript - 无法添加 ng-disabled 指令 ngJoyride

javascript - 如果标量变量 > 0,Perl 更改图像/css