gpt4 book ai didi

javascript - React 和 ES6 继承

转载 作者:数据小太阳 更新时间:2023-10-29 04:40:26 25 4
gpt4 key购买 nike

注意:这篇文章是在 React 不支持 ES6 (v12) 时发布的。

我有一个 ES6 类:

class BaseClass {
getInitialState(){
return {message: 'Hello!'};
}

render() {
return (
<div>
<div>{this.state.message}</div>
</div>
)
}
}

我可以使用这个表达式在 ES6 中导出(来源:react ES6 browserify)

export default React.createClass(BaseClass.prototype)

这很好用。现在我想使用 ES6 继承来扩展我的 BaseClass 类:

class ExtendedClass extends BaseClass{
getInitialState(){
return {message: "Hello! I'm an extension"};
}
}

但是当我在 ExtendedClass 类上调用 React.createClass 时,出现以下异常:

Invariant Violation: ReactCompositeComponentInterface: You are attempting to define `constructor` on your component more than once. This conflict may be due to a mixin.

我知道 React 0.13 应该对 ES6 更友好,但有什么办法可以解决这个问题吗?

编辑:

我正在使用 Traceur 编译我的 ES6 类。 ExtendedClass 的输出如下:

function ExtendedClass() {
"use strict";
if (BaseClass !== null) {
BaseClass.apply(this, arguments);
}
}
for (BaseClass____Key in BaseClass) {
if (BaseClass.hasOwnProperty(BaseClass____Key)) {
ExtendedClass[BaseClass____Key] = BaseClass[BaseClass____Key];
}
}
____SuperProtoOfBaseClass = BaseClass === null ? null : BaseClass.prototype;
ExtendedClass.prototype = Object.create(____SuperProtoOfBaseClass);
ExtendedClass.prototype.constructor = ExtendedClass;
ExtendedClass.__superConstructor__ = BaseClass;
ExtendedClass.prototype.getInitialState = function() {
"use strict";
return {message: "Hello! I'm an extension"};
};
React.createClass(ExtendedClass.prototype);

最佳答案

有一篇关于在 ES6 中编写 ReactJS 的好文章。

http://ilikekillnerds.com/2015/02/developing-react-js-components-using-es6/

无论如何,当你使用 ES6 时,你不会使用 React.createClass。你只需创建扩展 React.Component 的类

同样在 ES6 中你没有 getInitialState 而不是 defaultProps。它被替换为在构造函数中使用 this.state。

查看此示例。假设您有 Card 组件和扩展 Card 组件的欢迎面板。

代码如下:

卡片组件:

import React , { Component } from 'react'
class Card extends Component {
constructor(props){
super(props);
}

render() {
return (
<div className="card">
<div className="card__content">
<label>{this.props.content}</label>
</div>
</div>
)
}

initPanel(el,content){
React.render( <Card content={content} />, el);
}
}

export default Card;

欢迎面板组件:

import React from 'react';
import Card from 'components/card.component';

class WelcomePanel extends Card {
constructor(props){
super(props);
this.state = {
content: "Welcome Panel",
index: 0
}
}

componentClicked(){
this.setState({content: "Component Clicked", index: this.state.index + 1})
}

render() {
return (
<div className="welcome-panel" onClick={this.componentClicked.bind(this)}>
<Card content={`${this.state.content} ${this.state.index > 0 ? this.state.index : ''} ${this.state.index > 0 ? 'times' : ''} `} />
</div>
)
}

initPanel(el,content){
React.render( <WelcomePanel />, el);
}
}

export default { Class: WelcomePanel }

关于javascript - React 和 ES6 继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27233491/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com