wrapRootElement意外行为。盖茨比

时间:2019-12-17 22:34:52

标签: javascript reactjs firebase gatsby server-side-rendering

我在SSR方面还很陌生。但是我在为我的应用程序实现某些功能时遇到问题。我在我的应用程序中使用上下文API。并制作一些自己的 ContextApi ,它已连接到 Firebase数据库。 基本上,我只想将我的所有应用包装在Provider组件中,以通过子组件共享一些道具。
我知道我必须使用wrapRootElement (在gatsby-browser.js和gatsby-ssr.js文件中)来包装所有组件。

export {default as wrapRootElement} from './src/firebase/context';

我仅托管我的 DatabaseProvider 组件的位置。并使用gatsby-plugin-firebase将我的应用程序和所有配置都连接到 Firebase (需要将其插入gatsby.config.js中)。
我只想使用gatsby-plugin-firebase中的 useFirebase 钩子来接收 Firebase DB 的所有数据,并将此日期保存为状态,在< strong> DatabaseProvider 。

这是我的问题。

如果我使用 useFirebase 挂钩获取数据,则在Provider组件中,该组件是 wrapRootElement 的包装器。我什么也没有, useFirebase 挂钩什么也没做。

function DatabaseProvider({ children }) {
    console.log('INITIALIZED::DatabaseProvider') 
    const [goods, setGoods] = React.useState(null)
    useFirebase(firebase => {
        console.log('CALLBACK::START');
        firebase
            .database()
            .ref("/projects")
            .once("value")
            .then(snapshot => {
                const _goods = snapshot.val();
                console.log("SUCCESS::GOODS", _goods)
                setGoods(_goods)
            }).catch(e => console.log("ERROR", {e}))
    }, [])

    return (
        <Database.Provider value={{goods}}>{children}</Database.Provider>
    )
}

// export for gatsby-browser.js and gatsby-ssr.js
export default ({ element }) => {
    return (
        <DatabaseProvider>{element}</DatabaseProvider>
    )
}

我在控制台中看到 INITIALIZED :: DatabaseProvider 。但仍然没有收到 CALLBACK :: START SUCCESS :: GOODS ERROR 消息。


如果我只是复制并粘贴此代码

useFirebase(firebase => {
        console.log('callback::start');
        firebase
            .database()
            .ref("/projects")
            .once("value")
            .then(snapshot => {
                const _goods = snapshot.val();
                console.log("Success::Goods", _goods)
            }).catch(e => console.log("Error", {e}))
    }, [])

并直接在 src / pages / index.js 内部使用,我从控制台获得了所有消息(Error:D除外),当然还有所有商品清单。
所以我的问题是-
我该如何处理这种奇怪的行为,以便将所有商品都存储在 DatabaseProvider 中。我在盖茨比文档中想念的是什么?


非常感谢您的宝贵时间!

0 个答案:

没有答案