如何编写扩展功能组件的 ES6 类 React 组件?

Rya*_*yan 9 javascript ecmascript-6 reactjs

我知道在香草ES6你可以写一个classextendSA功能类。这是解释here

React 通过extending支持 ES6 类组件React.Component和功能组件。但是,在尝试extend使用功能组件时出现以下错误。

TypeError: Cannot call a class as a function
Run Code Online (Sandbox Code Playgroud)

我正在尝试编写一些扩展组件适用于 ES6 类组件和功能组件的代码。我想编写一个返回组件的函数,但我只想扩展和修改一些道具而不是高阶组件。

下面是一些我尝试过但不起作用的示例代码。这可能吗?我意识到BarExtended根本不会渲染Bar,但我只是在测试。除非这是问题的一部分。

function Bar() {
    return (
    <h1>Bar</h1>
  );
}

class BarExtended extends Bar {
    render() {
    return (
        <h1>BarExtended</h1>
    );
  }
}

ReactDOM.render(
    <div>
    <BarExtended />
    </div>,
  document.getElementById("foo")
);
Run Code Online (Sandbox Code Playgroud)

Enj*_*ayy 8

警告至少据我所知,这实际上不可能在反应方面做到,因为你需要从 React.Component 继承以使其成为反应组件,就像 bar 只是一个函数一样。

class Bar extends React.Component {

}
Run Code Online (Sandbox Code Playgroud)

您不必使用带有 React 的类,您可以使用常规函数。但我认为您正在寻找的是高阶组件。这可以为您传递给它的任何组件提供额外的功能。

function Bar(WrappedComponent){
 return class BarExtended extends React.Component {
  addThisFunction(){
    console.log('I extended the wrapped component with functionality')
  }
  render (
    return (
     <WrappedComponent addThisFunction={this.addThisFunction}/>
    )
  )
 }
}
Run Code Online (Sandbox Code Playgroud)

如果你真的想参加常规课程,你可以这样做。这是来自类文档的正确信息。

function Animal (name) {
  this.name = name;  
}

Animal.prototype.speak = function () {
  console.log(this.name + ' makes a noise.');
}

class Dog extends Animal {
  speak() {
    console.log(this.name + ' barks.');
  }
}

var d = new Dog('Mitzie');
d.speak();
Run Code Online (Sandbox Code Playgroud)

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Classes