【问题标题】:Setting the initial value of a useState hook before useState is executed在执行 useState 之前设置 useState 钩子的初始值
【发布时间】:2021-05-20 20:22:27
【问题描述】:

所以我正在尝试从本地存储中加载一些数据以用于 Chrome 扩展程序。我需要使用这些数据来设置 useState 挂钩的初始值。到目前为止,这是我尝试过的:

const Popup = (): ReactElement => {
    // load state from local storage
    let overviewIsOpenLS;
    useLayoutEffect(() => {
        chrome.runtime.sendMessage({ getFromLocalStorage: 'overviewIsOpen' }, response => {
            overviewIsOpenLS = response;
        });
    }, []);

    console.log(overviewIsOpenLS); // returns undefined

    // trying to use the value of overviewIsOpenLS as the initial value of this useState
    const [overviewIsOpen, setOverviewIsOpen] = useState<boolean>(overviewIsOpenLS);

    return <>...
}

我两次/三次检查了本地存储中的值,它是正确的。但是,此时顶部的 useEffect 不起作用,变量仍未定义。知道如何实现吗?

【问题讨论】:

    标签: javascript reactjs typescript react-hooks


    【解决方案1】:

    我会在父组件中发出异步请求,然后仅在请求完成后有条件地呈现子组件(Popup):

    // parent component
    const [overviewIsOpenLS, setOverviewIsOpenLS] = useState();
    useLayoutEffect(() => {
        chrome.runtime.sendMessage({ getFromLocalStorage: 'overviewIsOpen' }, setOverviewIsOpenLS);
    }, []);
    return overviewIsOpenLS === undefined ? null : <Popup overviewIsOpenLS={overviewIsOpenLS} />;
    
    // then in Popup:
    const [overviewIsOpen, setOverviewIsOpen] = useState<boolean>(props.overviewIsOpenLS);
    

    【讨论】:

    • 我对这一个组件的关注太窄了,我忘记了我有一个父组件。谢谢,这有帮助。
    猜你喜欢
    • 1970-01-01
    • 2020-03-08
    • 1970-01-01
    • 1970-01-01
    • 2020-05-19
    • 2020-07-05
    • 2020-12-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多