
开发工具代码质量静态分析【免费下载链接】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),仅供参考