【问题标题】:How can I read pre-fetched server side data with a typescript client?如何使用打字稿客户端读取预取的服务器端数据?
【发布时间】:2019-10-16 11:54:33
【问题描述】:

如果缺少 javascript 支持,我正在使用以下函数返回初始的服务器渲染标记和数据:

    export const serverRender = async () => {
        const { port, host } = config;
        const resp = await 
    axios.get(`http://${host}:${port}/testData.json`);

        const initialData = resp.data;
        return {
            initialMarkup: ReactDOMServer.renderToString(<App initialData={initialData} />),
            initialData,
        };
    };

我将这些数据提供给我的模板,如下所示(细节不是那么重要):

    app.setViewEngine("pug");
    app.use(express.static(path.join(__dirname, "../public")));
    app.use(express.static(path.join(__dirname, "../assets")));
    app.enableCors();
    await app.listen(PORT, () => {
        console.log(`Nest App listening on port ${PORT}`);
    });

在我的模板中,我使用pug 插值将initialData 读入javascript (window.initialData = #{initialData}) 中的window 对象。如果我的客户端是 javascript 客户端,我可以像这样从 window 对象中读取:window.initialData,但 Typescript 不允许这样做。

我的问题是,传递预取数据并将其传递给客户端的最佳方式是什么? IE。所以当我渲染客户端时我可以做这样的事情:

    /* somehow grab pre-fetched data */
    ReactDOM.hydrate(<App />, document.getElementById("root")); // entry point for webpack

我并不是说这是最好的方法(这是我问这个问题的另一个原因),但在过去,对于小型纯 javascript 项目,我已将数据分配给window,如上所述然后在我的react 的客户端渲染中,我做了这样的事情:

    const initialData = window.initialData;
    ReactDOM.hydrate(<App initialData={initialData} />, document.getElementById("root")); // entry point for webpack

这在 Typescript 中是行不通的

不适用

window 案例的错误消息: Property 'initialData' does not exist on type 'Window'

不过我还是想找点别的办法。

【问题讨论】:

    标签: reactjs typescript window global


    【解决方案1】:

    使用自定义的 initialData 值声明窗口全局对象的外观:

    declare global {
        interface Window { 
            initialData: any; 
        }
    }
    

    一旦你声明了这一点,那么:

    const initialData = window.initialData;
    

    应该可以。

    【讨论】:

    • 谢谢,这成功了!出于好奇,您知道有没有更好的方法?
    • @StarLlama 当我不得不这样做时(即从服务器获取数据到我的客户端应用程序),我将数据存储在data attribute 中,然后在客户端使用例如document.getElementById("yourDivId").dataset.initialData.
    猜你喜欢
    • 1970-01-01
    • 2020-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-28
    • 2021-09-05
    • 2012-09-21
    • 1970-01-01
    相关资源
    最近更新 更多