4

我有以下代码:

const priceCalculator = ReactDOM.render(<PriceCalculator />, reactHolder);

我需要priceCalculator稍后在我的代码中使用,但 ESLint 抱怨我不应该使用ReactDOM.render(). 那时我发现您可以将第三个参数传递ReactDOM.render()回调。太好了,我想...

ReactDOM.render(<PriceCalculator />, reactHolder, function(priceCalculator) {
    // do something with priceCalculator
});

但是priceCalculator是未定义的。在调试器中,我暂停异常并发现this当我在这个函数中时它被设置为我的 React 组件。所以我重写它...

ReactDOM.render(<PriceCalculator />, reactHolder, function() {
    const priceCalculator = this;
    // do something with priceCalculator
});

它仍然未定义。这是怎么回事?

我正在使用 Webpack 编译 es6 React 代码(使用 babel)。

4

1 回答 1

6

在您链接的ESLint 文档页面中,它说使用回调 ref

ReactDOM.render() 当前返回对根 ReactComponent 实例的引用。然而,使用这个返回值是遗留的,应该避免,因为未来版本的 React 在某些情况下可能会异步渲染组件。如果您需要对根 ReactComponent 实例的引用,首选的解决方案是将回调 ref附加到根元素。

来源:React 顶级 API 文档

render因此,您可以通过 prop 将回调传递给根组件,并通过根节点的prop从其方法中引用组件的根节点来调用它ref

例如(工作小提琴):

class Hello extends React.Component {
  render () {
    return (
      <div ref={(node) => this.props.cb(node)}>
        Hello {this.state.name}
      </div>
    )
  }
}

let node

ReactDOM.render(<Hello cb={(n) => node = n} />, ...);

console.log(node)

注意:这种方法很幼稚,因为ReactDOM.render可能并不总是同步渲染,在这种情况下console.log语句会打印"undefined"。(参见上面的引用:“React 的未来版本在某些情况下可能会异步渲染组件”。)

于 2016-12-07T12:15:17.247 回答