开发工具代码质量静态分析【免费下载链接】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),仅供参考
企业数字化 ERP 产品动态
相关推荐
ai写论文软件哪个好?2026软件工程专业横评5款主流工具 「ai写论文软件哪个好」大概是2026年毕业生群里被问最多的问题。作为软件工程专业的学生,我习惯了用测评思维解决问题:定指标、跑流程、看数据。过去两个月,我把市面上五款主流工具挨个实测了一遍,用同一篇开题报告做测试样本&… · 2026/9/25 15:57:26
RisingWave 持续集成(CI)实战指南:Fork PR 审批、CI 标签体系与回归二分定位 数据库流处理后端数据工程 【免费下载链接】risingwave Event streaming platform for agentic AI. Continuously ingest, transform, and serve event streams in real time, at scale. 项目地址: https://gitcode.com/gh_mirrors/ri/risingwave 点击查看 免费下载… · 2026/9/25 15:57:26
怕花钱没效果,哪些降AI工具能先免费试用、未达标还能退款? 怕花钱没效果,哪些降AI工具能先免费试用、未达标还能退款?
担心付款后AI率没降,先看能不能用自己的论文试一段,再看退款到底保证什么。明确面向知网、同时提供试用和有条件效果退款的,可以看比话;率零有改… · 2026/9/25 15:57:26
GEOFlow知识库搭建完整指南:pgvector向量检索让AI内容生产有据可依 GEOFlow知识库搭建完整指南:pgvector向量检索让AI内容生产有据可依 【免费下载链接】GEOFlow Open-source GEO content engineering and multi-site distribution platform with AI quality inspection, illustrated admin help, hosted sites, browser-assisted pu… · 2026/9/25 16:23:31
Agent Skills 实用指南:构建可复用智能体技能体系 "agent-skills"这个词,最近在AI圈子里被反复提起。我做智能体开发也有两三年了,从最早的提示词堆砌,到后来的函数调用,再到现在围绕技能(skills)来构建智能体,最大的感受是࿱… · 2026/9/25 16:23:31
Atlas 300V 24G推理加速卡上部署YOLO:从模型转换到性能调优全攻略 1. Atlas 300V 24G到底是个什么卡1.1 它就是热搜里问的那张“运算加速卡”先说结论:是的,Atlas 300V 24G就是一张标准的运算加速卡,但你要注意它并不是显卡,更不是用来打游戏的。它是昇腾生态里面向数据中心和边缘侧推理场景的PCI… · 2026/9/25 16:23:13
AI Agent工程化:分层交付架构设计与落地实践 1. 为什么“分层交付”是 AI Agent 工程化的第一道生死线做 AI Agent 项目最怕什么?不是模型不够聪明,而是你把所有逻辑——意图识别、工具调用、状态管理、结果渲染——全塞进一个巨大的提示词或者一个巨型函数里。我见过太多团队,Demo 阶段… · 2026/9/25 16:23:07
昇腾Atlas 300V 24G部署YOLOv8推理实战与排障 1. 先搞明白Atlas 300V 24G到底是什么1.1 一张“推理加速卡”而不是“图形卡”我最初拿到Atlas 300V 24G这张卡的时候,也跟不少刚接触昇腾生态的朋友一样,第一反应是“它是不是跟游戏显卡一样,插上去就能跑图形渲染”。这个理解其实是错的&am… · 2026/9/25 16:23:00
一人+AI工作流重构:IPO基元与模型路由实战指南 1. 工作流重构的底层逻辑:为什么一人AI能跑通复杂流程1.1 从“人肉流水线”到“工序化拆解”的认知转变大多数人对工作流的理解还停留在“把任务串起来”的阶段——用个看板工具,画几条泳道,把任务从“待办”拖到“完成”,就觉得自… · 2026/9/25 16:22:54
创维E900V22D刷机全攻略:S905L3SB芯片兼容性解析与救砖实战 /* 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 1:00:31
MQTT协议原理与Broker服务器搭建实战:从Mosquitto到EMQX /* 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 1:00:37