【发布时间】:2017-02-14 16:46:35
【问题描述】:
我使用 react-redux + thunk + redial 并在服务器端生成我的 HTML。我想通过 react-helmet 使用来自另一台服务器的用户数据生成元标记。 在我的服务器中:
import { trigger } from 'redial';
trigger('fetch', components, locals)
.then(() => {
const state = getState();
var html = ReactDOMServer.renderToString (
<Provider store={store} key="provider">
<ReactRouter.RouterContext {...renderProps} />
</Provider>
);
let head = Helmet.rewind();
response.send(`<!DOCTYPE html>
<head>
<meta charSet="UTF-8"></meta>
<meta httpEquiv="X-UA-Compatible" content="IE=edge,chrome=1"></meta>
<meta name="viewport" content="width=device-width, initial-scale=1"></meta>
<link rel='stylesheet' href='/css/bootstrap.css'/>
${style? "<style>"+style+"</style>" : "<link rel='stylesheet' href='/css/app.css'/>"}
${head.title}
${head.meta}
${head.link}
${head.script}
</head>
<body>
<div id="app">${html}</div>
<script src='/javascript/bundle.js'></script>
${popUp}
</body>
</html>`);
在我的组件中,我在 render() 函数中调用 dispatch 以在操作文件中运行一个函数,该函数调用 API 并返回用户数据。无论我在哪里使用调度,它都有相同的结果。在最好的情况下,React 返回请求并等待来自其他服务器的数据。但由于我设置为检查从服务器接收到的数据的条件,它没有返回任何内容。
我的组件
var profile=[], shouldRender = false
export var Profile = React.createClass({
render () {
var {x,y,z} = this.props;
var pathArray = (this.props.path).split( '/' );
if(!canUseDOM && shouldRender == false)dispatch(
actions.theProfile(x,y,z)
).then((es) => {profile = es; shouldRender= true;Promise.resolve()})
.catch((et) => console.log("error"));
if(shouldRender){
console.log("got inside");
return (
<div className="container">
<RightSideBar page="profile"/>
<Helmet
title={metaData('title', name, profileId)}/>
<div className="col-md-6 col-xs-12 col-md-offset-3 content right">
<div className="row">
{profileContent(ideaTypes)}
</div>
</div>
<div className="col-md-3 col-xs-12 sidebar-left hidden-xs hidden-sm hidden-md">
<LeftSideBar page="profile"/>
</div>
</div>
)
}
});
以及我使用 axios 调用 API 的操作
export var viewingProfile = (ux,y,z) => {
return function (dispatch, getState) {
return axios.post(root + '/api/getUser', {
Id: x,
orgid: y,
profileId: z
})
.then(function (res) {
if(res.data.statusEntity.statusCode == -201){
window.location.href = "/user-not-found"
} else {
dispatch(updateState(res.data))
return res.data;
}
})
}
}
【问题讨论】:
标签: reactjs redux react-redux redux-thunk