跳转到内容

react/jsx-curly-brace-presence 样式

在字面量足够的情况下,禁止不必要的 JSX 表达式

禁止在 JSX 子元素或属性中使用不必要的 JSX 表达式,或强制在 JSX 子元素或属性的字面量上使用 JSX 表达式 (react/jsx-curly-brace-presence)

🔧 This rule is automatically fixable by the [`--fix` CLI option](https://oxc-project.github.io/docs/guide/usage/linter/cli.html#fix-problems).

此规则允许您在 JSX 属性和/或子元素中强制使用大括号或禁止不必要的大括号。

对于 JSX 表达式不必要的情况,请参考 React 文档关于 JSX 陷阱的页面

## Rule Details

默认情况下,此规则将检查并警告 JSX 属性和子元素中不必要的大括号。为了向后兼容,默认情况下不考虑 JSX 元素的属性值。

您可以传入选项以强制在 JSX 属性、子元素、JSX 元素的属性值或三者的任意组合上使用大括号。同样的选项也可用于不允许不必要的大括号以及忽略检查。

**注意**:*强烈建议*您使用对象配置此规则,并将“propElementValues”设置为“always”。省略 JSX 元素的属性值周围的大括号的能力是晦涩难懂的,并且有意未记录在案,不应依赖。

## Rule Options

```js
...
"react/jsx-curly-brace-presence": [<enabled>, { "props": <string>, "children": <string>, "propElementValues": <string> }]
...
```

or alternatively

```js
...
"react/jsx-curly-brace-presence": [<enabled>, <string>]
...
```

### Valid options for `<string>`

对于检查 JSX 属性和子元素,它们是 alwaysneverignore

- `always`: always enforce curly braces inside JSX props, children, and/or JSX prop values that are JSX Elements
- `never`: never allow unnecessary curly braces inside JSX props, children, and/or JSX prop values that are JSX Elements
- `ignore`: ignore the rule for JSX props, children, and/or JSX prop values that are JSX Elements

If passed in the option to fix, this is how a style violation will get fixed

- `always`: wrap a JSX attribute in curly braces/JSX expression and/or a JSX child the same way but also with double quotes
- `never`: get rid of curly braces from a JSX attribute and/or a JSX child

- All fixing operations use double quotes.

For examples:

Examples of **incorrect** code for this rule, when configured with `{ props: "always", children: "always" }`:

```jsx
<App>Hello world</App>;
<App prop='Hello world'>{'Hello world'}</App>;
```

They can be fixed to:

```jsx
<App>{"Hello world"}</App>;
<App prop={"Hello world"}>{'Hello world'}</App>;
```

Examples of **incorrect** code for this rule, when configured with `{ props: "never", children: "never" }`:

```jsx
<App>{'Hello world'}</App>;
<App prop={'Hello world'} attr={"foo"} />;
```

They can be fixed to:

```jsx
<App>Hello world</App>;
<App prop="Hello world" attr="foo" />;
```

Examples of **incorrect** code for this rule, when configured with `{ props: "always", children: "always", "propElementValues": "always" }`:

```jsx
<App prop=<div /> />;
```

They can be fixed to:

```jsx
<App prop={<div />} />;
```

Examples of **incorrect** code for this rule, when configured with `{ props: "never", children: "never", "propElementValues": "never" }`:

```jsx
<App prop={<div />} />;
```

They can be fixed to:

```jsx
<App prop=<div /> />;
```

### Alternative syntax

The options are also `always`, `never`, and `ignore` for the same meanings.

在此语法中,仅提供一个字符串,默认情况下将为检查 JSX 属性和子元素设置该选项。

For examples:

Examples of **incorrect** code for this rule, when configured with `"always"`:

```jsx
<App>Hello world</App>;
<App prop='Hello world' attr="foo">Hello world</App>;
```

They can be fixed to:

```jsx
<App>{"Hello world"}</App>;
<App prop={"Hello world"} attr={"foo"}>{"Hello world"}</App>;
```

Examples of **incorrect** code for this rule, when configured with `"never"`:

```jsx
<App prop={'foo'} attr={"bar"}>{'Hello world'}</App>;
```

It can fixed to:

```jsx
<App prop="foo" attr="bar">Hello world</App>;
```

## Edge cases

该修复程序还处理模板字面量、带引号的字符串和带转义字符的字符串。

  • 如果规则设置为去除不必要的大括号,并且 JSX 表达式内的模板字面量没有表达式,它将发出警告并用双引号修复。例如

    jsx
    <App prop={`Hello world`}>{`Hello world`}</App>

    将被警告并修复为

    jsx
    <App prop="Hello world">Hello world</App>
  • 如果规则设置为强制使用大括号,并且字符串带有引号,则 JSX 子元素将用双引号修复,而 JSX 属性将以正常方式修复。此外,双引号将在修复程序中转义。

    例如

    jsx
    <App prop='Hello "foo" world'>Hello 'foo' "bar" world</App>

    将被警告并修复为

    jsx
    <App prop={'Hello "foo" world'}>{"Hello 'foo' \"bar\" world"}</App>
  • 如果规则设置为去除不必要的 JSX 表达式(大括号),并且在其 JSX 形式中有需要转义的字符,例如引号字符、禁止的 JSX 文本字符、转义字符以及任何看起来像 HTML 实体名称的内容,则代码不会被警告,因为修复可能会降低代码的可读性。

    即使配置为 "never",此规则的**正确**代码示例

    jsx
    <Color text={"\u00a0"} />
    <App>{"Hello \u00b7 world"}</App>;
    <style type="text/css">{'.main { margin-top: 0; }'}</style>;
    /**
     * there's no way to inject a whitespace into jsx without a container so this
     * will always be allowed.
     */
    <App>{' '}</App>
    <App>{'     '}</App>
    <App>{/* comment */ <Bpp />}</App> // the comment makes the container necessary

    何时不使用

如果您不关心维护 JSX 属性和/或子元素中大括号的使用以及不必要的 JSX 表达式的使用的一致性,则应关闭此规则。

参考

根据 MIT 许可证发布。