tab在jsx里不展开缩写,需先确认语法模式为javascript (babel)或react jsx,并配置emmet响应source.js scope;启用jsx语法profile、filters含jsx,且缩写如li[key=${$}]*3才正确生成带key的jsx结构。

Tab在JSX里不展开缩写?先确认语法模式和触发条件
Sublime Text默认不把 .jsx 或 .js 文件当作Emmet可作用的上下文,所以输入 div.container 按 Tab 没反应,不是插件坏了,而是根本没进Emmet的处理流程。
- 右下角状态栏必须显示
JavaScript (Babel)或React JSX(不是JavaScript或Plain Text);可通过Ctrl+Shift+P→Set Syntax: JavaScript (Babel)强制切换 - Emmet默认只监听
source.js、text.html等 scope,需手动配置让它响应 JSX:打开Preferences → Package Settings → Emmet → Key Bindings – User,粘贴带"operand": "source.js"的完整绑定规则(见后文) -
Tab不生效时,优先试Ctrl+E(Windows/Linux)或Cmd+E(macOS),这是 Emmet 的 fallback 触发键,不依赖语法 scope 判断
JSX中class要自动转成className?改Emmet的输出规则
Emmet 默认生成 class="xxx",但在 React 里必须是 className="xxx",否则运行时报错或样式不生效。这不是 Babel 或 ESLint 能修复的问题,得从 Emmet 输出源头控制。
- 打开
Preferences → Package Settings → Emmet → Settings – User - 加入以下配置:
{ "variables": { "lang": "en" }, "filters": "html, jsx", "syntaxProfiles": { "jsx": "html" }, "snippets": { "jsx": { "abbreviations": { "cl": "className" } } } } - 更关键的是启用 JSX 专用 filter:在同个设置文件里加
"filters": "html, jsx",并确保syntaxProfiles中"jsx": "html"存在,否则div.foo还是输出class
缩写嵌套 + 动态属性怎么写才不出错
React 开发中常要写带 key、onClick、style 的结构,Emmet 缩写若不按规则写,要么展开失败,要么生成非法 JSX。
-
ul>li*3展开后每项都缺key—— 正确写法是ul>li[key=${$}]*3,其中${$}是 Emmet 的计数变量,生成key="1"、key="2"等 - 写内联样式别用
style="color:red"缩写,Emmet 不解析字符串值;应写成div[style={{"color":"red"}}],注意双大括号和引号嵌套 -
button[type="button"]在 JSX 里会报错,因为type是 DOM 原生属性,但 React 要求小驼峰:button[on-click="handleClick"]也不对,正确是button[onClick="handleClick"]—— Emmet 不自动转换事件名,得手写
为什么装了Emmet还是不能用rcc生成React组件?那是另一个插件
rcc、ren、cdm 这类快捷生成 React 组件的缩写,不属于 Emmet 功能,而是 Sublime-React 插件提供的。混淆这两者,是新手最常踩的坑。
- Emmet 只管 HTML/CSS/JSX 结构展开,不管组件模板逻辑;
rcc是 Sublime-React 定义的 snippet,触发后插入class XXX extends Component全套骨架 - 安装 Sublime-React:同样走
Package Control: Install Package→ 搜Sublime-React(作者是 ryanmcdermott),不是ReactSnippets或其他拼写变体 - 装完后,必须确保当前文件是
JavaScript (Babel)语法,且光标在空行——rcc+Tab才会生效;如果已输了一堆代码再打rcc,它不会覆盖,而是插入到当前位置
"operand": "source.js",Tab 就永远静音。











