eslint-plugin-react 规则详解:react/no-this-in-sfc —— 禁止无状态函数组件中使用 `this`
开发工具代码质量静态分析【免费下载链接】eslint-plugin-reactReact-specific linting rules for ESLint项目地址https://gitcode.com/gh_mirrors/es/eslint-plugin-react点击查看免费下载react/no-this-in-sfc是 eslint-plugin-react 提供的一条可能错误Possible Errors类检查规则专门用于在无状态函数组件Stateless Functional Component简称 SFC中拦截对this的误用。React 存在类组件与函数组件两种编写风格二者获取 props、context、state 的方式截然不同混用极易在类组件转函数组件或初学者不熟悉差异时埋下隐性 bug。读完本文你将理解该规则检测的误用场景、合法与非法代码的边界、正确的改写方式以及其底层基于 AST 与作用域分析的实现原理。规则背景两种组件风格的本质差异在 React 中组件分为两类类组件class Foo extends React.Component {...}通过this访问实例属性例如this.props.foo、this.state、this.context无状态函数组件SFCfunction Foo(props, context) {...}props 与 context 以两个函数参数形式传入函数体内没有state——即使引入 Hooks 也不会改变这一点SFC 中的局部状态通常应交给React.useState()这类 Hook 管理。由于两者访问数据的方式完全不同在函数组件里试图访问this上的属性有时虽然恰好能运行但绝大多数情况下都是错误要么是开发者不熟悉两种组件风格的差异要么是把类组件改写成 SFC 时漏改了某处this引用。这条规则的价值就在于把这类看起来能跑、实则指向错误对象的代码在编译期揪出来。从源码注释lib/rules/no-this-in-sfc.js可以看出规则的作用对象就是 stateless functional components并在命中时报告消息Stateless functional components should not use \this。Rule Details规则检测什么规则监听成员表达式MemberExpression当表达式主体是ThisExpression即this.xxx且该this位于某个无状态函数组件内部时即判定为违规。该规则没有可配置项schema: []不提供自动修复无fixable属于非 recommended规则README 规则总表 中该行未在 recommended 列勾选需要开发者按需显式启用。错误代码示例以下代码均会触发react/no-this-in-sfc报告function Foo(props) { return ( div{this.props.bar}/div ); }function Foo(props) { const { bar } this.props; return ( div{bar}/div ); }function Foo(props, context) { return ( div {this.context.foo ? this.props.bar : } /div ); }function Foo(props, context) { const { foo } this.context; const { bar } this.props; return ( div {foo ? bar : } /div ); }function Foo(props) { if (this.state.loading) { return Loader /; } return ( div {this.props.bar} /div ); }function Foo(props) { const { loading } this.state; const { bar } this.props; if (loading) { return Loader /; } return ( div {bar} /div ); }注意最后两个示例中出现的this.state.loadingSFC 本身没有 state这种写法在运行时几乎必然出错属于规则重点拦截的高危模式。正确代码示例改写方式很简单把this.props/this.context换成函数参数props/context或直接对参数解构function Foo(props) { return ( div{props.bar}/div ); }function Foo(props) { const { bar } props; return ( div{bar}/div ); }function Foo({ bar }) { return ( div{bar}/div ); }function Foo(props, context) { return ( div {context.foo ? props.bar : } /div ); }function Foo(props, context) { const { foo } context; const { bar } props; return ( div {foo ? bar : } /div ); }function Foo({ bar }, { foo }) { return ( div {foo ? bar : } /div ); }如何在 ESLint 中启用该规则不在react/recommended、react/all预设配置中configs 目录下的 recommended.js 与 all.js 均未包含此规则需要自行显式配置。在传统.eslintrc中{ plugins: [react], rules: { react/no-this-in-sfc: error } }在 ESLint 9 的 flat config 中import react from eslint-plugin-react; export default [ { files: [**/*.{js,jsx}], plugins: { react }, languageOptions: { parserOptions: { ecmaFeatures: { jsx: true } }, }, rules: { react/no-this-in-sfc: error, }, }, ];规则插件在 lib/rules/index.js 中注册键名为no-this-in-sfc。源码实现原理命中判定链路规则主体lib/rules/no-this-in-sfc.js通过Components.detect(...)包裹其核心逻辑如下MemberExpression(node) { if (node.object.type ThisExpression) { const component components.get(utils.getParentStatelessComponent(node)); if (!component || (component.node component.node.parent component.node.parent.type Property)) { return; } report(context, messages.noThisInSFC, noThisInSFC, { node }); } }判定分三步AST 形态匹配只关心MemberExpression且其object必须是ThisExpression即形如this.xxx。直接裸写this不跟随属性访问不会被命中组件归属判断通过utils.getParentStatelessComponent(node)沿作用域向上查找当前代码位于哪个无状态组件内见 lib/util/Components.js例外放行若找不到组件或组件节点的父节点是Property对象字面量属性则跳过不报错。无状态组件识别getParentStatelessComponentlib/util/Components.js 第 637 行起的实现是从当前作用域scope开始逐级向scope.upper回溯对每一层调用getStatelessComponent(scope.block)找到第一个无状态组件即返回遍历到顶层仍未命中则返回null。而getStatelessComponent的判定相当严格同文件第 600 行附近函数体必须返回 JSX 或nullisReturningJSXOrNull且位于允许出现组件的位置非父组件不是无状态组件的嵌套场景具名函数要求首字母大写isFirstLetterCapitalized例如Foo会被识别、foo不会——这也是普通小写函数内使用this不会被误报的原因。关键的例外场景规则特意放行了Property父节点场景。这对应createReactClass这类对象字面量风格组件const Foo React.createClass({ render: function() { return div{this.props.foo}/div; } });此处this.props是 createClass 组件实例的合法访问测试明确将其列为validtests/lib/rules/no-this-in-sfc.js。同理普通对象的方法如obj.notAComponent function () { return this.a || null; }因为不返回 JSX 而不被视为组件使用this同样不报错MeteorValidatedMethod的run方法内部使用this.connection.id也属于合法边界均被测试覆盖为通过用例。测试验证规则的边界行为规则测试文件 tests/lib/rules/no-this-in-sfc.js 从正反两面验证了规则行为可以总结出以下边界规则函数组件内的this.props/this.state/this.context无论出现在 JSX 表达式、解构赋值还是条件判断中一律报错invalid箭头函数组件const Foo (props) span{this.props.foo}/span同样报错说明规则对箭头函数定义的 SFC 同样生效嵌套函数也逃不掉组件内嵌套的function onClick(bar) { this.props.onClick(); }同样会被命中一次代码里出现两处this就会报告两个错误类组件、createClass 组件、普通函数、对象方法均不受影响valid类内部的方法与类字段箭头函数class Foo { bar() { () { this.something(); } } }中this指向类实例属于合法用法不报错。使用建议该规则适合在全量迁移类组件到函数组件、或团队内同时存在两种组件风格的代码库中启用能在编译期快速定位遗漏的this引用由于它只检查函数组件中的this与react/no-deprecated、react/prefer-stateless-function等规则可形成互补前者负责清理过时写法后者鼓励将纯展示类组件改造成 SFC——配合no-this-in-sfc即可把迁移过程中的常见错误一并拦截规则无配置项、无自动修复报告的错误需要开发者手动把this.props替换为参数props、this.context替换为context或将 state 迁移到useState等 Hook 中改写方式可对照上文正确代码示例。赞分享开发工具代码质量静态分析【免费下载链接】eslint-plugin-reactReact-specific linting rules for ESLint项目地址https://gitcode.com/gh_mirrors/es/eslint-plugin-react点击查看免费下载相关推荐eslint-plugin-unicorn 的 no-this-assignment 规则禁止将 this 赋值给变量eslint plugin unicorn 的 no this assignment 规则禁止将 this 赋值给变量 导读 no this assignmeLint代码质量eslint-plugin-unicorn 的 no-array-method-this-argument 规则详解禁止在数组方法中传 thisArgeslint plugin unicorn 的 no array method this argument 规则详解禁止在数组方法中传 thisArg 导读Lint代码质量eslint-plugin-react 规则详解no-access-state-in-setstate禁止在 setState 中读取 this.stateeslint plugin react 规则详解no access state in setstate禁止在 setState 中读取 this.state开发工具代码质量静态分析上一篇AzurLaneAutoScript 配置指南免费自动完成碧蓝航线日常下一篇从 0 到 1 手写 Claude Code 同款 Agent 内核learn-claude-code 实战指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

开源大模型本地部署与安全实战:Qwen微调、微软工具链与谷歌生态

开源大模型本地部署与安全实战:Qwen微调、微软工具链与谷歌生态

1. 开源AI浪潮下的技术选型与安全博弈过去一年里,我身边做开发和运维的朋友聊得最多的话题,从“你用了哪个API”逐渐变成了“你本地跑了哪个模型”。这个转变背后其实是一个很明显的信号:开源大模型的能力已经跨过了“能用”的门槛&#xff0…

2026/9/25 15:57:47 阅读更多 →
开源AI代码评审工具open-code-review:架构、部署与实战

开源AI代码评审工具open-code-review:架构、部署与实战

做代码评审这件事,我一开始是有点抗拒AI介入的。原因很简单:一个不懂业务上下文、没见过团队历史的模型,凭什么对一个改了三行代码的PR指手画脚?后来我被现实教育了——团队规模变大之后,人工评审根本忙不过来&#xf…

2026/9/25 15:57:46 阅读更多 →
Atlas 300V实战:基于昇腾AI加速卡的YOLO推理部署全攻略

Atlas 300V实战:基于昇腾AI加速卡的YOLO推理部署全攻略

1. Atlas 300V到底是什么先说结论:Atlas 300V Pro(也就是大家常说的Atlas 300V 24G)确实是一块运算加速卡,但它不是普通意义上的“显卡”。它是一块专门为AI推理设计的加速卡,主要任务是把已经训练好的深度学习模型&am…

2026/9/25 15:56:46 阅读更多 →

最新新闻

通信+客户数据:DeskcommCRM如何构建带上下文的客服系统

通信+客户数据:DeskcommCRM如何构建带上下文的客服系统

做这套DeskcommCRM的念头,源于我接手客服团队后的第三周。当时团队每天要处理两百多通客户来电,但同事们的日常是:电话一响,先问“您好哪位”,然后手忙脚乱翻Excel、查聊天记录,甚至有人用便利贴在显示器边…

2026/9/25 16:37:09 阅读更多 →
DeskcommCRM:把通话记录与客户管理融为一体的通讯型CRM

DeskcommCRM:把通话记录与客户管理融为一体的通讯型CRM

做CRM选型这些年,我见过太多团队在“客户管理”这件事上走弯路,其中很典型的一类就是——电话一通,客户信息就断了,销售打完电话还要手动补记录,补着补着就漏了,漏着漏着,客户就凉了。直到我实际…

2026/9/25 16:37:09 阅读更多 →
亚马逊卖家如何提高账号权重?方案详解

亚马逊卖家如何提高账号权重?方案详解

对于亚马逊卖家而言,所谓“账号权重”并不是一个公开、单独的官方评分,而是卖家对店铺整体表现的概括。想要长期提升店铺表现,核心要围绕商品质量、销售表现、客户体验、履约能力和合规运营持续优化。先理解:“账号权重”主要看什…

2026/9/25 16:37:09 阅读更多 →
机器人视觉选型:全局快门、卷帘快门与RGB-D的优缺点及场景适配

机器人视觉选型:全局快门、卷帘快门与RGB-D的优缺点及场景适配

给机器人装眼睛这件事,说简单也简单,说难也难。简单在于市面上可选的视觉方案实在是太多了,难就难在——这么多方案,到底哪个才是自己项目真正需要的?我见过不少团队,前期调研不够仔细,拍到一半发现果冻效应严重得离谱,或者视觉系统跑起来才发现深度数据根本喂不饱算法,最后只…

2026/9/25 16:37:09 阅读更多 →
Atlas 300V 24G是AI推理加速卡吗?昇腾环境部署YOLO全流程指南

Atlas 300V 24G是AI推理加速卡吗?昇腾环境部署YOLO全流程指南

前阵子有个朋友在群里问我:“Atlas 300V 24G是运算加速卡吗?我能不能拿它直接部署YOLO?”我一看就知道,这兄弟大概率是从GPU阵营转过来的。类似的问题还有“为什么卡插上了但跑不了PyTorch”“npu-smi死活看不到设备”“模型转换一…

2026/9/25 16:37:09 阅读更多 →
【含最新安装包】保姆级手把手教你,OpenClaw 零基础一键快速部署 TaoToken 配置

【含最新安装包】保姆级手把手教你,OpenClaw 零基础一键快速部署 TaoToken 配置

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

2026/9/25 16:36:09 阅读更多 →

日新闻

AI元人文:从工具使用到思维重构的深度探索

AI元人文:从工具使用到思维重构的深度探索

最近半年我一直在琢磨一件事:AI元人文到底是什么?说白了,就是“用元视角重新审视人与AI的关系”,也在“探索AI如何反向逼着我们发现自己的思考边界”。标题里的“元探索”,在我看就是一层套一层的追问——当你用AI解决…

2026/9/25 0:00:41 阅读更多 →
Python+CNN车牌识别实战:从数据预处理到模型训练与部署

Python+CNN车牌识别实战:从数据预处理到模型训练与部署

简介:基于Python与卷积神经网络的车牌识别项目,面向计算机视觉初学者及智能交通开发者,目标是帮助用户掌握从数据预处理、模型构建到实际部署的完整流程。压缩包共25个文件,包含jpg/png图像样本、py训练脚本、md说明文档、dat数据…

2026/9/25 0:00:41 阅读更多 →
Vim基础操作全攻略:保存退出、模式切换与高频命令实战

Vim基础操作全攻略:保存退出、模式切换与高频命令实战

1. 项目概述1.1 核心需求解析今天聊聊Vim。写这个题目的原因是:几乎每个后端开发者、运维人员、数据工程师某天都会遇到一个场景——深夜加班,服务器登录界面只有黑底白字,编辑器只有vi/vim,你必须在五分钟内完成一次配置修改并保…

2026/9/25 0:00:41 阅读更多 →

周新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/24 14:34:13 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/25 11:15:26 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/24 14:33:56 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/24 12:50:34 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/24 14:33:48 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/24 12:49:17 阅读更多 →