@babel/plugin-proposal-do-expressions
详情
¥Detail
do { .. }
表达式执行一个块(其中包含一条或多条语句),块内的最终语句完成值成为 do 表达式的完成值。¥The
do { .. }
expression executes a block (with one or many statements in it), and the final statement completion value inside the block becomes the completion value of the do expression.
来自 你不知道的 JS, Types & Grammar -> Chapter 5 -> Section Statement Completion Values
¥from You Don't Know JS, Types & Grammar -> Chapter 5 -> Section Statement Completion Values
可以看成是 三元运算符 的复杂版本:
¥It can be seen as a complex version of the ternary operator:
let a = do {
if (x > 10) {
("big");
} else {
("small");
}
};
// is equivalent to:
let a = x > 10 ? "big" : "small";
这个例子不是最好的用法,因为它太简单了,使用三元运算符是一个更好的选择,但是你可以在 do { ... }
表达式中使用多个 if ... else
链的更复杂的条件:
¥This example is not the best usage because it is too simple and using a ternary operator is a better option but you can have a much more complex condition in the do { ... }
expression with several if ... else
chains:
let x = 100;
let y = 20;
let a = do {
if (x > 10) {
if (y > 20) {
("big x, big y");
} else {
("big x, small y");
}
} else {
if (y > 10) {
("small x, big y");
} else {
("small x, small y");
}
}
};
示例
¥Example
在 JSX 中
¥In JSX
do
表达式最有用的用法之一是在 JSX 内部。如果我们想有条件地显示一个组件,我们通常必须调用另一个函数来实现条件并返回正确的值,例如:
¥One of the most useful usage of the do
expression is inside JSX. If we want to conditionally display a component we usually have to call another function which would implement the condition and return the correct value, for example:
const getColoredComponent = color => {
if (color === "blue") {
return <BlueComponent />;
}
if (color === "red") {
return <RedComponent />;
}
if (color === "green") {
return <GreenComponent />;
}
};
const Component = props => (
<div className="myComponent">{getColoredComponent()}</div>
);
使用 do 表达式,你可以在 JSX 中添加逻辑:
¥Using a do expression you can add logic inside JSX:
const Component = props => (
<div className="myComponent">
{do {
if (color === "blue") {
<BlueComponent />;
} else if (color === "red") {
<RedComponent />;
} else if (color === "green") {
<GreenComponent />;
}
}}
</div>
);
安装
¥Installation
- npm
- Yarn
- pnpm
npm install --save-dev @babel/plugin-proposal-do-expressions
yarn add --dev @babel/plugin-proposal-do-expressions
pnpm add --save-dev @babel/plugin-proposal-do-expressions
用法
¥Usage
使用配置文件(推荐)
¥With a configuration file (Recommended)
{
"plugins": ["@babel/plugin-proposal-do-expressions"]
}
通过 CLI
¥Via CLI
babel --plugins @babel/plugin-proposal-do-expressions script.js
通过 Node API
¥Via Node API
require("@babel/core").transformSync("code", {
plugins: ["@babel/plugin-proposal-do-expressions"],
});
参考
¥References
-
对于 JSX 内部的条件非常方便:Reactjs/react-future#35
¥Very handy for conditions inside JSX: reactjs/react-future#35