[英]With React / Redux, how do I dynamically pre-load state?
我在使用React / Redux进行预加载状态时遇到了困难。
在将其标记为重复之前,我已经阅读了以下内容:
这是我的情况:
User
对象。 我需要此User
对象处于无需往返服务器的状态 。 User
对象是动态的,因此无法将其包含在捆绑包中。 我的问题:
最初如何将用户对象从服务器加载到客户端的商店中?
在这个答案中 ,丹·阿布拉莫夫说:
在客户端上,您将从全局变量中读取它,并使用它创建客户端存储实例。 换句话说,您不必手动创建initialState-您应该使用store.getState()在服务器上捕获它,将其传递给客户端,然后使用它创建一个商店。
因此,我假设通过全局变量 ,他的意思是这样的:
// Here, window._initialState.user is being sent to the client in a <script/> tag.
const store = createStore(reducers, { user: window._initialState.user);
上面的方法可能有用,问题在于我没有信心这实际上是一个好习惯,因为我没有在互联网上找到任何有关它的例子。
那么,这是正确的做法吗? 有没有更好/更推荐的方法?
这直接从redux配方页面获取 :
为了传递状态,我们添加了一个标签,该标签将preloadedState附加到
window.__PRELOADED_STATE__
。
function renderFullPage(html, preloadedState) {
return `
<!doctype html>
<html>
<head>
<title>Redux Universal Example</title>
</head>
<body>
<div id="root">${html}</div>
<script>
// WARNING: See the following for security issues around embedding JSON in HTML:
// http://redux.js.org/docs/recipes/ServerRendering.html#security-considerations
window.__PRELOADED_STATE__ = ${JSON.stringify(preloadedState).replace(/</g, '\\u003c')}
</script>
<script src="/static/bundle.js"></script>
</body>
</html>
`
}
从服务器加载页面时,从数据库加载User对象。 我需要此User对象处于无需往返服务器的状态。
我认为如果您不进行服务器渲染,则应该对服务器进行初始往返。 我的看法是,您必须至少对服务器进行两次调用:一个调用可缓存的捆绑包,另一个调用数据。 即使您正在加载将全局变量设置为具有某些初始状态的脚本,您仍然必须再次调用以使包正确吗? 我可能会误会我,但我看不出以您描述的方式设置初始状态的优势。 如果您不是服务器渲染,那么也许一个简单的宁静API和SPA更简单。
最初如何将用户对象从服务器加载到客户端的商店中?
我的建议是仅使服务器第一次往返并等待获取承诺解决,然后创建商店并渲染应用程序。
fetch('http://example.com/something').then(data => data.json()).then(initalState => {
render(
<Provider store={/*stored created with initalState*/}>
<App />
</Provider>,
document.getElementById('app')
)
});
同样,在这里我可能会误解您的问题/体系结构,但这只是我的两分钱。 祝好运!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.