【问题标题】:How does ReactJS evaluate any JavaScript Expression inside JSX?ReactJS 如何评估 JSX 中的任何 JavaScript 表达式?
【发布时间】:2018-02-09 07:32:31
【问题描述】:

ReactJS 文档对他们的 JSX 的功能做了一些有趣且强大的说明:

你可以在 JSX 中嵌入任何 JavaScript 表达式,方法是用 curly 包裹它 大括号。例如,2 + 2user.firstNameformatName(user) 都是有效的表达式。

https://reactjs.org/docs/introducing-jsx.html#embedding-expressions-in-jsx

这对我来说是如此强大和有趣,因为这在 AngularJS 和 EmberJS 中是不可能的。 Angular 在其标记中使用 Angular 表达式,而 EmberJS 在其标记中使用 Handlebar 表达式。

Q1)ReactJS如何实现读取JSX内部的any JS Expression?

Q2) 他们在后台使用 eval() 吗?

【问题讨论】:

  • 我不能给你一个深入的答案,因为我不是 React 内部的专家。但是,也许可以通过阅读以下内容来解决问题:reactjs.org/docs/react-without-jsx.html 和那里的 babel 编译器的链接。 React.createElement 接受任意数量的参数,我认为这些参数会被执行、附加和返回。我快速搜索了一下,但分发的 React 文件中没有 eval

标签: javascript reactjs jsx


【解决方案1】:

JSX 是 a Babel plugin,它会提前转换您的源代码,而不是在运行时。
理解这一点让我们了解Yuri's answer is correct 的原因,以及 JSX 如何评估任意表达式。

作为一个简短的前缀,Babel 是一个常用的 Javascript 编译器,根据您的配置,它允许您做许多有用的事情。一个非常常见的例子是转译 ES6 特性,以便代码可以在 ES5 环境中使用:

代码在:

[1, 2, 3].map(n => n * 2);

代码输出:

[1, 2, 3].map(function (n) {
  return n * 2;
});

JSX Babel 插件做了类似的事情,它将易于阅读的 JSX 语法转换为 React 函数调用(或其他类似的事情,如果你没有在 React 中使用它)。

From their own demo,代码在:

var profile = <div>
  <img src="avatar.png" className="profile" />
  <h3>{[user.firstName, user.lastName].join(' ')}</h3>
</div>;

代码输出:

var profile = React.createElement("div", null,
  React.createElement("img", { src: "avatar.png", className: "profile" }),
  React.createElement("h3", null, [user.firstName, user.lastName].join(" "))
);

理解了这一点,现在很容易看出 1) 任何表达式都可以使用,因为表达式根本不被计算;和 2) eval 根本不需要 — 代码已提前转换。

【讨论】:

  • 感谢您明确而直接的回答。是的,我看到了 React 如何在 Babel 插件的帮助下实现它:JSX 花括号中的 JS 表达式被转换为 React.createElement() 的参数。
【解决方案2】:

React 不评估任何东西。你只需要看看编译的代码。 JSX 只是一个语法扩展,它转换为由引擎评估的普通旧 js。

() => <div>{2 + 2}</div>

变成了一个调用React.createElement的函数

function () {
  return React.createElement(
    "div",
    null,
    2 + 2
  );
};

【讨论】:

  • 此回复提供了有用和有用的信息,但不直接回答问题。如果您根据问题回答,它可能会有所改进。
  • @MichaelR 我的回答有什么不清楚的地方? React 不评估任何东西 - 回答你的第一个问题并让第二个问题变得多余,因为它再次根本不评估任何东西。 BTW jsx 甚至没有具体反应
猜你喜欢
  • 1970-01-01
  • 2012-05-25
  • 1970-01-01
  • 2021-03-28
  • 1970-01-01
  • 2013-11-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多