如何扩展React组件?

ffx*_*sam 26 reactjs material-ui

假设有一个我喜欢的React组件,但想要修改.对于此示例,我们将使用Material UI LinearProgress.我想用它制作一个可点击的搜索栏.

class SeekBar extends LinearProgress {
  componentDidMount() {
    super.componentDidMount();
    console.log('my stuff here');
  }
}
Run Code Online (Sandbox Code Playgroud)

但我觉得,就改变render回报而言,我可以做的事情非常有限.不过,也许我会把这一切都搞错了.如果我喜欢特定的React组件,例如Material UI组件,那么自定义其外观和功能并使其成为我自己的好的,可重用的方法是什么?

Ina*_*ler 41

在ES6/JSX/React世界中,您可以通过多种方式扩展组件行为和值.考虑到您使用Material UI,我建议使用以下其中一项.

第一种情况:

你有两个扩展Component来自React的组件:

class ExampleComponent extends React.Component {
  render () {
    return(
      <div>
        <button {...this.props}>
          Click me!
        </button>
      </div>
    )
  }
}

class RenderComponent extends React.Component {
  clickHandler () {
    console.log('Click fired!')
  }

  render () {
    return(
      <ExampleComponent onClick={this.clickHandler.bind(this)} />
    )
  }
}
Run Code Online (Sandbox Code Playgroud)

在该示例中,onClick通过渲染中的道具传递ExampleComponent.这里的例子.

第二种情况:

这与Material UI如何扩展自己的组件类似:

class ExampleComponent extends React.Component {
  clickHandler () {
    console.log('Click fired!')
  }
}

class RenderComponent extends ExampleComponent {
  render () {
    return(
      <div>
        <button onClick={this.clickHandler.bind(this)}>
          Click me!
        </button>
      </div>
    )
  }  
} 
Run Code Online (Sandbox Code Playgroud)

在此示例中,您具有Component从React 扩展但仅具有事件方法的组件.然后,扩展此组件并使用扩展行为呈现自己的组件.这是一个实例.

希望能帮助到你!

  • 您不能"覆盖"组件中的render方法.你可以做的是使用`props`来实现不同的风格和/或行为.在答案中扩展我的第一个例子,你可以通过`props`传递自定义类名,请点击这里:https://jsbin.com/wadekateho/1/edit?html,js,console,output - 使用这个想法,你可以在`props`中传递布尔值甚至预渲染代码. (5认同)