在 ExpressJS + Reactjs 中传递数据以查看

IT技术 javascript node.js express reactjs
2021-05-01 23:42:37

我有一个应用程序,其中一部分是使用 twitter 登录。登录成功后,我通常会通过以下方式将用户数据传递给模板

app.get('/', function(req, res, next) {
        log("The Home page has the user info: ", req.session.user);
        res.render('pages/home', {
            app: 'home',
            user: req.session.user || '' 
        });
    });

然后您可以根据user数据渲染模板

但是在 React 中,我应该如何在登录后将这些数据传递给组件?

我正在考虑将数据直接放入浏览器中,但我对此没有信心。

<script type="javascript">
  var user = #{user}
</script>

你怎么想??谢谢。

2个回答

通常,您将传递给顶级组件的 props 在脚本标记中发送给客户端。

所以,你在做<MyApp user={user} />MyApp({user: user}),你会创建一个像这样的脚本标签:

var code = "<script>var __react_preload_data = " 
           + JSON.stringify({user: user}) 
           + ";</script>";

而在客户端:

React.renderComponent(MyApp(__react_preload_data), document.body);

有一个名为 react-helper ( https://github.com/tswayne/react-helper )的库适用于 express(和任何其他视图渲染节点框架)。它几乎可以处理您在视图中呈现 React 组件并将数据从任何节点框架中的服务器传递给它们所需的一切。您只需为 webpack 创建一个入口点(js 文件)(lib 有一个 cli 可以为您生成您的 webpack 配置)并向您的控制器和视图添加一行,您的组件将在该页面上呈现。将数据传递到你的 React 组件中非常简单:

const component = reactHelper.renderComponent('MyComponent', {user: 
req.session.user || ''})
res.render('view-to-render', {component})

react-helper(https://github.com/tswayne/express-react-helper还有快速中间件,允许您添加所有视图可用的上下文,方便用户会话数据。

app.use(function(req, res, next) {
 req.reactHelperContext.user = req.session.user || '';
});

然后,您的所有 React 组件都将拥有 user 属性,而无需手动将该逻辑添加到每个控制器操作中。