将变量从 jade 文件传递​​给 React 组件

IT技术 node.js express reactjs pug
2021-05-21 19:25:11

我在将变量从 .jade 文件传递​​到 react 组件时遇到问题。这是我的玉文件的一部分:

block content #example var user = '#{user}'; span #{user.id} span #{user.displayName}

这是 app.jsx,我希望可以访问变量 user 的 react 组件。

var React = require('react');
var HelloWorld = require('./HelloWorld.jsx');
var $ = jQuery = require('../../libraries/jquery/dist/jquery');
var bootstrap = require('../../libraries/bootstrap-sass-official/assets/javascripts/bootstrap');

React.render(
    <HelloWorld/>,
    document.getElementById('example')
);

我试过从 app.jsx登录this.props.userwindow.user到控制台,但它是未定义的。理想情况下,我希望this.props.userapp.jsx 成为玉文件有权访问的用户。例如,然后我就可以将该用户变量传递到 HelloWorld 组件中。也许有更好的方法来做到这一点,我是玉石和react的新手,当然会很感激这个建议。

4个回答

我没有使用过 React,我不确定 React.render 做了什么或者它的参数是什么,所以这可能不适用。

要从服务器到客户端 javascript 获取变量,请尝试将 json 字符串模板化到 html 中并从 javascript 加载它。EJS 处理引号转义,我认为 Jade 也可以。作为参考,content!= safeString告诉 Jade 跳过转义,content !{safeString}.

- var user={id:1, displayName:'foo'}
#example
  meta(data-userJSON=JSON.stringify(user))
script(src="//code.jquery.com/jquery-1.11.3.min.js")
script.
  var user = JSON.parse(
    $('#example meta').attr('data-userJSON')
  )
  console.log(user);
span #{user.id}
span #{user.displayName}

您可以在渲染之前手动提取 DOM 属性,例如:

var node = document.getElementById('example')
var user = {
  id: node.children[0].textContent,
  displayName: node.children[1].textContent
}

React.render(<HelloWorld user={user} />, node)

但我可能会建议您使用 JSON 或 ajax 来获取数据,而不是解析 DOM。

试试这个答案(我试图添加评论,但它不会让我)。

在您的玉石中,您将拥有:

script. var user = (!{JSON.stringify(user)});

然后,在 React 中:

React.render( <HelloWorld user={user} />, document.getElementById('example') );

小心在客户端中传递您不想让任何人看到的数据。

从一个类似的问题复制我的答案:

“有一个库可以很好地与 express(和任何其他视图渲染节点框架)配合使用,称为 react-helper(https://github.com/tswayne/react-helper)。它几乎可以处理渲染所需的一切在您的视图中react组件并将数据从任何节点框架中的服务器传递给它们。您只需为 webpack 创建一个入口点(js 文件)(lib 有一个可以为您生成 webpack 配置的 cli)并添加一行到您的控制器和视图以及您的组件将在该页面上呈现。将数据传递到您的 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 组件都将拥有用户属性,而无需手动将该逻辑添加到每个控制器操作中。”

该库将为您呈现您的组件并将其存储到您可以传递给 jade 的变量中,然后在 jade 中您只需像打印字符串一样打印变量。这将为您处理 React.render,因此您将不再需要它在您的视图中,甚至示例 div 中。您的入口点将只“注册”HelloWorld 组件,您就可以开始了。