reactjs - 如何提供我的使用在客户端和服务器渲染上构建不同并且由和它的声音?
问题描述
我有一些数据只在我的index.tsx
文件中定义,就在我渲染我的<App/>
. 一旦定义了该数据,它就不再改变。我需要<App/>
知道这些数据。
其他需求:
- 有时组件内部需要这些数据(即:可以通过上下文和状态访问)
- 有时在 redux thunk 中需要该数据(即:只能通过状态访问,或传递给 thunk 的参数)
例如:
索引.tsx
const COUNTRY = getCountry(window.location);
ssrApp.tsx(在服务器上)
const COUNTRY = getCountry(req.hostname);
我的困境是我无法从文件中导出数据index.tsx
,ssrApp.tsx
因为它们是 2 个不同的文件,一个用于客户端,一个用于服务器渲染。我还需要将该数据提供给我的<App/>
.
我想更简单的方法是通过上下文传递给应用程序。喜欢:
render(
<SomeContext.Provider value={COUNTRY}>
<App/>
</SomeContext.Provider>
);
我开始这样做,它在大多数情况下都运行良好,但是当我开始在 thunk 中需要这些数据时它就坏了。AFAIK,thunk 无法访问上下文。但是他们可以访问状态(redux state)。
所以我创建了一个我称之为的 redux 状态,PRELOADED
并将该数据作为preloaded
状态值添加到存储中。
就像是:
configureStore({
reducer: rootReducer,
preloadedState: {
PRELOADED: {
COUNTRY: getCountry(window.location)
}
}
});
它解决了“thunk 可访问”的问题,但也产生了其他问题。
因为@reduxjs/toolkit
要求您初始化每个状态切片,即使您确定该状态将始终被预加载。
const PRELOADED_SLICE = createSlice({
name: "PRELOADED",
initialState: getInitialState(),
reducers: {
SOME_ACTION(state, action: SOME_ACTION) {
// DO SOMETHING
}
}
});
所以你最终不得不创建一个“虚拟” initialState
,因为真实状态只会在运行时定义。
无论如何,PRELOADED
到目前为止,状态方法似乎已经完成了这项工作。这个问题有最佳实践吗?
解决方案
这是静态数据,对,所以为什么不将它包含在源文件中,如果它们都需要它,则将其导入到 index.tsc 和 ssrApp.tsx 中。
或者使用您的 PRELOADED 切片,为什么不首先使用您需要的数据填充 getInitialState() 并且在该切片中没有操作和 noop reducer?
我感觉你的描述I have some data that is only defined in my index.tsx file, right before I render my <App/>.
实际上意味着静态数据以外的东西。
推荐阅读
- r - 使用 ggplot 散点图修复调色板
- python - error: non-broadcastable output operand with shape (3,1) doesn't match the broadcast shape (3,3)
- javascript - Background process without influence of Routing in Angular
- python - OpenCV 4 TypeError:参数“标签”的预期 cv::UMat
- node.js - 如何得到猫鼬聚合函数的结果
- javascript - Node app doesn't work after firebase deploy
- android - unable to send image from my application to mvc web api
- python - Using regular expression to divide two words and capture the first word
- python-3.x - Google Cloud Vision API 一次 API 调用中的多个图像注释
- python - 使用切片与范围索引 ndarray 的结果的维度