新闻详情

新闻详情

首页 / 资讯中心 / 详情

eslint-plugin-react 的 react/jsx-no-leaked-render 规则:阻止 `` 条件渲染泄漏 0、NaN 等危险值

发布时间:2026/9/25 3:30:13来源:尧图网络
eslint-plugin-react 的 react/jsx-no-leaked-render 规则:阻止 `` 条件渲染泄漏 0、NaN 等危险值
开发工具代码质量静态分析【免费下载链接】eslint-plugin-reactReact-specific linting rules for ESLint项目地址https://gitcode.com/gh_mirrors/es/eslint-plugin-react点击查看免费下载react/jsx-no-leaked-render是 eslint-plugin-react 中专门用于拦截「JSX 内使用做条件渲染却泄漏出0、NaN、空字符串等假值」的规则。它通过静态分析找出可能被渲染进 DOM 的危险值并提供coerce布尔强转与ternary三元表达式两种可自动修复策略。读完本文你将掌握该规则的全部配置项ignoreAttributes、validStrategies、默认修复行为以及它在 规则实现 与 测试用例 中的底层判定逻辑。问题背景为什么条件渲染会「泄漏」危险值在 JSX 中开发者经常用逻辑与运算符做条件渲染{someCondition Something /}当someCondition为真时渲染组件为假时不渲染——这符合直觉。但返回的是操作数本身的值而不是布尔值。如果左侧不是布尔类型它就可能把原始值直接渲染出来const Example () { return ( {0 Something /} {/* React: renders undesired 0 */} {/* React Native: crashes */} {NaN Something /} {/* React: renders undesired NaN */} {/* React Native: crashes */} { Something /} {/* React: renders nothing */} {/* React Native, with React 18: crashes */} / ) }在ReactWeb中0和NaN是合法的渲染值会真的出现在最终 DOM 里造成「明明没写内容页面却多了个 0」的诡异 UI。在React Native中渲染0、NaN会直接抛错、导致渲染方法崩溃React 18 时空字符串同样会崩溃。这正是规则名称中「leaked」泄漏的含义条件判断的原始值绕过了布尔化检查泄漏到了渲染结果中。该规则在 README 规则总表 中标记为 可自动修复类别为 Possible Errors默认不随推荐配置开启。规则详解Rule Detailsreact/jsx-no-leaked-render的目标就是阻止这些危险值被渲染避免「意外值进入 DOM」或「渲染方法崩溃」两种后果。避免泄漏有两种经典写法布尔强转{!!someValue Something /}三元表达式{someValue ? Something / : null}——对假值返回null本规则可自动修复具体修复成哪种写法由validStrategies选项控制见下文 Options 部分。错误代码示例以下写法都会被规则报告count、title、elements、numberA、numberB均视为可能为非布尔值的变量const Component ({ count, title }) { return div{count title}/div }const Component ({ count }) { return div{count spanThere are {count} results/span}/div }const Component ({ elements }) { return div{elements.length List elements{elements} /}/div }const Component ({ nestedCollection }) { return ( div {nestedCollection.elements.length List elements{nestedCollection.elements} /} /div ) }const Component ({ elements }) { return div{elements[0] List elements{elements} /}/div }const Component ({ numberA, numberB }) { return div{(numberA || numberB) Results{numberA numberB}/Results}/div }// If the condition is a boolean value, this rule will report the logical expression // since it cant infer the type of the condition. const Component ({ someBool }) { return div{someBool Results{numberA numberB}/Results}/div }注意最后一个例子即使条件「看起来」是布尔值规则在无法静态推断其类型时仍会报告该逻辑表达式测试用例中同样覆盖了这类「左值可能是布尔但无法证实」的场景。正确代码示例const Component ({ elements }) { return div{elements}/div }// An OR condition its considered valid since its assumed as a way // to render some fallback if the first value is falsy, not to render something conditionally. const Component ({ customTitle }) { return div{customTitle || defaultTitle}/div }const Component ({ elements }) { return divThere are {elements.length} elements/div }const Component ({ elements, count }) { return div{!count No results found}/div }const Component ({ elements }) { return div{!!elements.length List elements{elements} /}/div }const Component ({ elements }) { return div{Boolean(elements.length) List elements{elements} /}/div }const Component ({ elements }) { return div{elements.length 0 List elements{elements} /}/div }const Component ({ elements }) { return div{elements.length ? List elements{elements} / : null}/div }const Component ({ elements }) { return div{elements.length ? List elements{elements} / : EmptyList /}/div }正确示例体现了几类规则认可的「安全形态」||表达式被视为「取兜底值」而非「条件渲染」因此不报告一元取反!count、双重取反!!count、Boolean(...)调用、比较表达式 0、等产生的都是布尔值安全三元表达式只要alternate假值分支返回null或 JSX 元素就等价于「真值渲染、假值不渲染」安全。规则选项Rule Options规则的 schema 定义在 lib/rules/jsx-no-leaked-render.js共两个选项。ignoreAttributes布尔值默认false。设为true后规则会忽略除children之外的所有 JSX 属性中的校验用于规避「属性值由内部校验或安全使用」时产生的误报。配置示例{ // ... react/jsx-no-leaked-render: [enabled, { ignoreAttributes: true }] // ... }假设配置为{ ignoreAttributes: true }以下代码仍是错误的——children表达式不受该选项豁免function MyComponent({ value }) { return ( MyChildComponent nonChildrenProp{value default} {value MyInnerChildComponent /} /MyChildComponent ); }{value MyInnerChildComponent /}位于children位置即使ignoreAttributes: true也依然会被标记。属性内嵌套的 JSX children 同样会被检查const Component ({ enabled }) { return ( Foo bar{ Something{enabled MuchWow /}/Something } / ) }这里Something…/Something虽然整体位于Foo的bar属性内但{enabled MuchWow /}是Something的 children因此仍然被标记。测试用例 tests/lib/rules/jsx-no-leaked-render.js 中给出了完全一致的验证场景。以下代码在{ ignoreAttributes: true }下是正确的const Component ({ enabled, checked }) { return CheckBox checked{enabled checked} / }非 children 属性如checked中的逻辑表达式不再被报告。实现层面该选项对应 isWithinAttribute 函数它沿 AST 父节点向上回溯直到遇到JSXElement/JSXFragmentstopTypes才停止中途若遇到JSXAttribute则判定表达式位于属性内。也就是说只有「最终属于某元素的直接属性」才会被豁免children 与更深层嵌套不受影响。validStrategies数组可包含coerce、ternary或两者默认[ternary, coerce]至少需要 1 个。它决定哪些写法被视为「可接受的防泄漏策略」coerce把 JSX 表达式的条件布尔强转如!!someValue使的返回值恒为布尔ternary把二元表达式改写为三元表达式假值分支返回null数组中第一个值就是自动修复时采用的策略因此顺序有实际意义。配置示例{ // ... react/jsx-no-leaked-render: [enabled, { validStrategies: [ternary, coerce] }] // ... }仅启用ternary假设配置为{ validStrategies: [ternary] }以下代码是错误的count title会泄漏且!!count强转写法也不被认可const Component ({ count, title }) { return div{count title}/div }const Component ({ count, title }) { return div{!!count title}/div }正确写法const Component ({ count, title }) { return div{count ? title : null}/div }const Component ({ count, title, empty }) { return div{count ? title : empty}/div }仅启用coerce假设配置为{ validStrategies: [coerce] }以下代码是错误的count title泄漏count ? title : null这种三元写法因策略未被启用同样被标记const Component ({ count, title }) { return div{count title}/div }const Component ({ count, title }) { return div{count ? title : null}/div }正确写法const Component ({ count, title }) { return div{!!count title}/div }const Component ({ count, title, empty }) { return div{count ? title : empty}/div }当两种策略同时启用默认时自动修复默认优先采用ternary因为它在数组首位测试用例 tests/lib/rules/jsx-no-leaked-render.js 展示了默认策略下count title被修复为count ? title : null、(numberA || numberB) …被修复为(numberA || numberB) ? … : null的完整过程。源码实现原理规则是如何判定与修复的触发选择器与豁免逻辑规则在 create 函数 中监听两类 AST 节点JSXExpressionContainer LogicalExpression[operator]JSX 表达式容器内、运算符为的逻辑表达式JSXExpressionContainer ConditionalExpressionJSX 表达式容器内的三元表达式仅当ternary策略未启用时才需要检查。对于节点判定流程大致如下lib/rules/jsx-no-leaked-render.js若ignoreAttributes: true且表达式位于属性内isWithinAttribute直接跳过若启用了coerce策略且左值类型属于UnaryExpression、BinaryExpression、CallExpression常量 COERCE_VALID_LEFT_SIDE_EXPRESSIONS或其嵌套逻辑表达式整体可强转getIsCoerceValidNestedLogicalExpression则视为安全通过 variable.js 工具 查找左值变量若能静态确认其初始化值是布尔类型则视为安全——这就是「布尔条件虽然报不了类型、但规则尽力推断」的实现细节React 18 特例当左值是字面量且检测到的 React 版本 ≥ 18 时放行见 lib/rules/jsx-no-leaked-render.js——因为 React 18 起空字符串不再需要渲染该行为由 lib/util/version.js 的testReactVersion基于settings.react.version或自动检测的版本判断否则报告错误noPotentialLeakedRender消息文本为 Potential leaked value that might cause unintentionally rendered values or rendering crasheslib/rules/jsx-no-leaked-render.js并附带修复函数。对于三元节点仅当ternary未启用时才检查若alternate假值分支是null、undefined、false常量 TERNARY_INVALID_ALTERNATE_VALUES或 JSX 元素则放行否则报告。这也解释了为什么{count ? title : null}在仅coerce模式下会被要求改写成{!!count title}。自动修复ruleFixer的两个策略修复逻辑集中在 ruleFixer根据validStrategies数组首项选择策略coerce策略先用 extractExpressionBetweenLogicalAnds 把左值链中的各段表达式拆开逐段判断已经是布尔化表达式一元/二元/调用的原样保留否则补!!同时处理括号保留trimLeftNode 会去掉双重取反、避免破坏合法的!取反并针对多行 JSX 右值做缩进包装、针对字面量右值直接放弃修复。测试中可以看到嵌套逻辑表达式{connection (hasError || hasErrorUpdate)}被修复为{!!connection (hasError || hasErrorUpdate)}tests/lib/rules/jsx-no-leaked-render.js。ternary策略把左值经过 trimLeftNode 去双重取反作为条件、右值作为真值分支生成left ? right : null。例如{!!count title}会被修复为{count ? title : null}tests/lib/rules/jsx-no-leaked-render.js。若传入的validStrategies值非法会抛出TypeError(Invalid value for validStrategies option)lib/rules/jsx-no-leaked-render.js但 schema 已用enum限制取值正常配置不会触达。规则元信息在 meta 中fixable: code——支持eslint --fix或编辑器的「修复全部」category: Possible Errors——归类为可能的错误而非风格问题recommended: false——未进入推荐配置需手动开启schema中additionalProperties: false——不允许未知选项。从 CHANGELOG.md 可以追溯到该规则的发展轨迹v7.24 新增ignoreAttributes#3441React 18 时不再报告空字符串#3488后续还修复了 coerce 模式下的无效修复#3511、括号误加#3700以及布尔左值误报#3746等问题说明该规则在真实使用中经过多轮边界打磨。启用方式由于该规则不属于推荐配置需要手动开启。以传统.eslintrc为例{ plugins: [react], rules: { react/jsx-no-leaked-render: error, // 或带选项 react/jsx-no-leaked-render: [error, { ignoreAttributes: true, validStrategies: [ternary, coerce] }] } }运行npx eslint --fix 文件即可自动修复所有可修复的报告。规则已在 lib/rules/index.js 中注册插件加载后即可直接使用。何时不使用When Not To Use It如果你工作在强类型代码库中且团队约定始终使用布尔条件例如通过 TypeScript 的boolean类型约束、或配合react/require-default-props等规则那么左值几乎必然是布尔泄漏风险被类型系统消化此时可以安全地禁用本规则。另外两种常见豁免场景属性传值由组件内部校验对应ignoreAttributes: true以及项目运行 React 18 且确定不会遇到空字符串渲染崩溃。进一步阅读React 官方文档「Inline If with Logical Operator」一节解释了条件渲染及其对0等假值的经典陷阱社区文章 Good advice on JSX conditionals - Beware of zero专门剖析「警惕 0」这一条件渲染反模式关于在 React 与 React Native 中渲染假值falsy values行为差异的讨论0/NaN在 Web 端渲染、在 Native 端崩溃。对源码细节感兴趣的读者可以继续深入 规则实现、完整测试套件 以及 React 版本检测工具从测试用例的 input/output 对照中理解每一种边界行为。赞分享开发工具代码质量静态分析【免费下载链接】eslint-plugin-reactReact-specific linting rules for ESLint项目地址https://gitcode.com/gh_mirrors/es/eslint-plugin-react点击查看免费下载相关推荐eslint-plugin-react 的 react/jsx-no-script-url 规则全面拦截 javascript: 危险 URLeslint plugin react 的 react/jsx no script url 规则全面拦截 javascript: 危险 URL 导读 reac开发工具代码质量静态分析Hindsight 集成 GitHub Copilot CLI用 Hooks 为 Copilot 会话注入长期记忆Hindsight 集成 GitHub Copilot CLI用 Hooks 为 Copilot 会话注入长期记忆 Hindsight 为 GitHub Co开发工具代码质量静态分析eslint-plugin-react 规则详解react/jsx-no-duplicate-props 禁止 JSX 重复属性eslint plugin react 规则详解react/jsx no duplicate props 禁止 JSX 重复属性 react/jsx no d开发工具代码质量静态分析上一篇Vue3大型项目管理实战范围、质量与进度控制完整指南下一篇技术深度解析如何利用Hermes Agent实现智能网页自动化与云端浏览器代理创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

如何快速上手大气层Atmosphere:从SD卡到开机引导的10步安装教程 2026/9/25 4:09:57

如何快速上手大气层Atmosphere:从SD卡到开机引导的10步安装教程

如何快速上手大气层Atmosphere:从SD卡到开机引导的10步安装教程 【免费下载链接】Atmosphere-stable 大气层整合包系统稳定版 项目地址: https://gitcode.com/gh_mirrors/at/Atmosphere-stable 大气层Atmosphere(Atmosphere-stable 稳定整合包&am…

阅读更多 →
GD32H759与RT-Thread的I2C和RTC实战:配置、坑点与排查 2026/9/25 4:09:50

GD32H759与RT-Thread的I2C和RTC实战:配置、坑点与排查

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
Two.js Two.Path 完全指南:掌控顶点、曲线与渲染的可绘制形状核心类 2026/9/25 4:09:50

Two.js Two.Path 完全指南:掌控顶点、曲线与渲染的可绘制形状核心类

图形学前端 【免费下载链接】two.js A renderer agnostic two-dimensional drawing api for the web 项目地址: https://gitcode.com/gh_mirrors/tw/two.js 点击查看 免费下载 Two.js 是一个渲染器无关的二维绘图 API,而 Two.Path 正是其构建所有可绘制…

阅读更多 →
在Windows上构建REPENTOGON源码:CMake + Visual Studio完整编译教程 2026/9/25 4:09:50

在Windows上构建REPENTOGON源码:CMake + Visual Studio完整编译教程

在Windows上构建REPENTOGON源码:CMake Visual Studio完整编译教程 【免费下载链接】REPENTOGON Script extender for The Binding of Isaac: Repentance 项目地址: https://gitcode.com/gh_mirrors/re/REPENTOGON 本教程带你完整走一遍在 Windows 上构建 RE…

阅读更多 →
ESP32上WASM为何不能直接操作硬件?原理与替代方案 2026/9/25 4:09:44

ESP32上WASM为何不能直接操作硬件?原理与替代方案

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
Rockchip MPP H.264硬件编码实战:从交叉编译到调优 2026/9/25 4:09:38

Rockchip MPP H.264硬件编码实战:从交叉编译到调优

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉