hox icon indicating copy to clipboard operation
hox copied to clipboard

非global store互相引用时,报undefined错误

Open freewind opened this issue 3 years ago • 5 comments
trafficstars

复现repo: https://github.com/freewind-demos/typescript-react-hox-mix-stores-demo


useStore1.ts:

export const [useStore1, Store1Provider] = createStore(() => {
    const [user, setUser] = useState<string>();
    const {version} = useStore2();

    return {user, setUser: (user: string) => setUser(`${user}.${version}`)}
});

useStore2.ts

export const [useStore2, Store2Provider] = createStore(() => {
    const [version, setVersion] = useState(0)
    return {version, setVersion}
});

组件:

export const Hello: FC<Props> = ({}) => {
    return <Store1Provider>
        <Store2Provider>
            <Version/>
            <User/>
        </Store2Provider>
    </Store1Provider>;
}

运行报错:

useStore1.ts:9 Uncaught TypeError: Cannot destructure property 'version' of 'useStore2(...)' as it is undefined.
    at useStore1.ts:9:5
    at hox.js?v=d75d37a9:226:22
    at renderWithHooks (react-dom.js?v=d75d37a9:11128:26)
    at updateFunctionComponent (react-dom.js?v=d75d37a9:12953:28)
    at updateSimpleMemoComponent (react-dom.js?v=d75d37a9:12853:18)
    at updateMemoComponent (react-dom.js?v=d75d37a9:12784:22)
    at beginWork (react-dom.js?v=d75d37a9:14092:22)
    at HTMLUnknownElement.callCallback2 (react-dom.js?v=d75d37a9:3738:22)
    at Object.invokeGuardedCallbackDev (react-dom.js?v=d75d37a9:3763:24)
    at invokeGuardedCallback (react-dom.js?v=d75d37a9:3797:39)

如果useStore1与useStore2都是createGlobalStore,则无错。

看了一下源码tests,里面没有这里场景的测试

freewind avatar Sep 19 '22 15:09 freewind

似乎没有人关注这个问题

freewind avatar Sep 23 '22 04:09 freewind

@awmleer @miracles1919

freewind avatar Sep 23 '22 04:09 freewind

createModel corresponds to createGlobalStore in v2, so you need to batch replace createModel with createGlobalStore。see:https://hox.js.org/guide/how-to-migrate-from-v1-to-v2 @freewind

codingJJJ avatar Sep 26 '22 07:09 codingJJJ

这周我看下 @freewind

miracles1919 avatar Sep 26 '22 09:09 miracles1919

@freewind 看你上面发的代码,Store1Provider 是套在 Store2Provider 外层的,那自然不能在 Store1 中去 useStore2 的,违背了依赖的先后顺序

不过 hox 的报错倒是可以优化一下,不能直接 undefined……

awmleer avatar Sep 26 '22 12:09 awmleer