React.Component子类声明中的类内赋值问题——Egghead教程示例
React类组件中直接声明state的类字段语法解析
嘿,我来给你拆解一下你在Egghead教程里看到的这个state = {lapse: 0, running: false}写法——这其实是类字段(Class Fields)语法,属于ES6+的扩展特性,现在已经成为ECMAScript标准的一部分,React生态里也广泛支持它。
1. 语法的本质:语法糖背后的逻辑
在早期的React类组件写法里,我们必须在constructor中初始化state,像这样:
class StopWatch extends React.Component { constructor(props) { super(props); this.state = { lapse: 0, running: false }; } // ...其他代码 }
而你看到的直接在类内赋值state的写法,是上面传统写法的语法糖。经过Babel或者React官方编译工具(比如Create React App)转译后,这段代码会被转换成和上面constructor初始化完全一致的逻辑——也就是说,它本质上还是在组件的构造阶段完成了state的初始化,this依然指向组件实例。
2. 为什么能这么用?
这个语法能在React项目里正常运行,是因为现在主流的React开发环境(比如CRA、Vite)默认配置了支持类字段的转译工具,不需要你额外做配置就能直接使用。它的出现就是为了减少React类组件里的样板代码,让代码更简洁易读。
3. 这种写法的优势和注意点
- 优势:
- 省去了写
constructor和super(props)的麻烦,代码更紧凑 - 可以直接在state初始化里引用
props,比如state = { count: props.initialCount }(和在constructor里使用this.props效果一致) - 和类字段风格的事件处理函数搭配使用时,能统一代码风格,比如:
class StopWatch extends React.Component { state = { lapse: 0, running: false }; handleStart = () => { // 这里this自动绑定到组件实例,不用手动bind this.setState({ running: true }); } // ... }
- 省去了写
- 注意点:
- 如果你的初始化逻辑比较复杂(比如需要调用其他方法、处理复杂的props转换),还是建议回到
constructor写法,这样逻辑更清晰 - 类字段语法是ES标准特性,不是React专属的,所以在其他类里也能使用
- 如果你的初始化逻辑比较复杂(比如需要调用其他方法、处理复杂的props转换),还是建议回到
结合你的StopWatch例子来看
你代码里的state = {lapse: 0, running: false}就是给StopWatch组件设置初始状态:lapse初始为0毫秒,running初始为false(表示计时器未启动),和在constructor里初始化的效果完全相同,只是写法更简洁而已。
内容的提问来源于stack exchange,提问作者oquiroz
相关产品推荐
相关产品推荐

