子类声明中的赋值 - React.Component
assignment inside subclass declaration - React.Component
我正在学习 Egghead 的 React 教程,在其中一课中我发现了以下 class 声明:
class StopWatch extends React.Component {
state = {lapse: 0, running: false}
render() {
const {lapse, running} = this.state
const buttonStyles = {
border: '1px solid #ccc',
background: '#fff',
fontSize: '2em',
padding: 15,
margin: 5,
width: 200
}
return (
<div style={{textAlign: 'center'}}>
<label style={{fontSize: '5em', display: 'block'}}>
{lapse}ms
</label>
<button style={buttonStyles}>{running ? 'Stop' : 'Start'}</button>
<button style={buttonStyles}>Clear</button>
</div>
)
}
}
所以看着代码,我只是对顶部的那个作业感到好奇。我查看了 class 并扩展了 MDN 上的文档,它没有说明允许在 class 声明中进行赋值。
此外,我在示例代码上进行了尝试,但它抛出了一个错误:
class Square {
constructor(prop1, prop2) {
this.prop1 = prop1
this.prop2 = prop2
}
}
class Polygon extends Square {
constructor(prop1, prop2, prop3) {
super(prop1, prop2)
}
prop2 = prop3
render() {
console.log(prop2)
}
}
那么...为什么它有效?
您尝试使用的语法未标准化,您需要 Babel 来转换您的代码。或者,您可以在 类 -
中使用静态成员
let Foo = class {
static get staticData() {
return 'Static Data';
}
}
console.log(Foo.staticData);
subclass 使用 class 个字段 stage 3 proposal and aren't a part of existing standard. They provide syntactic sugar for constructor body. As explained in ,class 字段分配有一个特定的顺序。
subclass 与此 ES6 class 相同(另请检查 Babel output 以了解发生了什么):
class Polygon extends Square {
constructor(prop1, prop2, prop3_that_doesnt_collide) {
super(prop1, prop2);
this.prop2 = prop3;
}
render() {
console.log(prop2)
}
}
console.log(prop2)
指的是 non-existing prop2
变量而不是 prop2
属性.
注意,因为 prop3
位于构造函数方法之外,它不引用 prop3
构造函数参数,而是引用一些 non-existing prop3
变量,所以 prop3_that_doesnt_collide
参数和prop3
不冲突。
由于prop2
赋值依赖于构造器参数,所以应该放在构造器方法中:
class Polygon extends Square {
constructor(prop1, prop2, prop3) {
super(prop1, prop2);
this.prop2 = prop3;
}
render() {
console.log(this.prop2)
}
}
因为它只是立即用 prop3
替换 prop2
值,它可以是:
constructor(prop1, prop2, prop3) {
super(prop1, prop3);
}
我正在学习 Egghead 的 React 教程,在其中一课中我发现了以下 class 声明:
class StopWatch extends React.Component {
state = {lapse: 0, running: false}
render() {
const {lapse, running} = this.state
const buttonStyles = {
border: '1px solid #ccc',
background: '#fff',
fontSize: '2em',
padding: 15,
margin: 5,
width: 200
}
return (
<div style={{textAlign: 'center'}}>
<label style={{fontSize: '5em', display: 'block'}}>
{lapse}ms
</label>
<button style={buttonStyles}>{running ? 'Stop' : 'Start'}</button>
<button style={buttonStyles}>Clear</button>
</div>
)
}
}
所以看着代码,我只是对顶部的那个作业感到好奇。我查看了 class 并扩展了 MDN 上的文档,它没有说明允许在 class 声明中进行赋值。
此外,我在示例代码上进行了尝试,但它抛出了一个错误:
class Square {
constructor(prop1, prop2) {
this.prop1 = prop1
this.prop2 = prop2
}
}
class Polygon extends Square {
constructor(prop1, prop2, prop3) {
super(prop1, prop2)
}
prop2 = prop3
render() {
console.log(prop2)
}
}
那么...为什么它有效?
您尝试使用的语法未标准化,您需要 Babel 来转换您的代码。或者,您可以在 类 -
中使用静态成员let Foo = class {
static get staticData() {
return 'Static Data';
}
}
console.log(Foo.staticData);
subclass 使用 class 个字段 stage 3 proposal and aren't a part of existing standard. They provide syntactic sugar for constructor body. As explained in
subclass 与此 ES6 class 相同(另请检查 Babel output 以了解发生了什么):
class Polygon extends Square {
constructor(prop1, prop2, prop3_that_doesnt_collide) {
super(prop1, prop2);
this.prop2 = prop3;
}
render() {
console.log(prop2)
}
}
console.log(prop2)
指的是 non-existing prop2
变量而不是 prop2
属性.
注意,因为 prop3
位于构造函数方法之外,它不引用 prop3
构造函数参数,而是引用一些 non-existing prop3
变量,所以 prop3_that_doesnt_collide
参数和prop3
不冲突。
由于prop2
赋值依赖于构造器参数,所以应该放在构造器方法中:
class Polygon extends Square {
constructor(prop1, prop2, prop3) {
super(prop1, prop2);
this.prop2 = prop3;
}
render() {
console.log(this.prop2)
}
}
因为它只是立即用 prop3
替换 prop2
值,它可以是:
constructor(prop1, prop2, prop3) {
super(prop1, prop3);
}