我如何进行同步ReactDOM.render

der*_*ery 9 javascript reactjs react-dom

对于我的应用程序,我需要渲染一些孩子,然后测量结果div.在伪代码中,它看起来像这样:

function getDims(child) {
    var testEl = document.getElementById('test-el');
    ReactDOM.render(child, testEl);
    var dims = testEl.getBoundingClientRect();
    ReactDOM.unmountComponentAtNode(testEl);
    return dims;
}
Run Code Online (Sandbox Code Playgroud)

不幸的是,根据文档ReactDOM.render可能在未来变得异步.是否有一个面向未来的选项来强制同步渲染,以便上述功能可以工作?

Pra*_*avi 5

您可以将回调传递给ReactDOM.render(ReactElm, DOMNode, callback). 一旦加载到 . 中,就会callback执行。ReactElmDOMNode

希望这可以帮助!

function getDims(child) {
    var testEl = document.getElementById('test-el');
    ReactDOM.render(child, testEl, function(){
       var dims = testEl.getBoundingClientRect();
       ReactDOM.unmountComponentAtNode(testEl);
       return dims;
    }); 
}
Run Code Online (Sandbox Code Playgroud)

使用示例:

function getDims(child) {
    var testEl = document.getElementById('test-el');
    ReactDOM.render(child, testEl, function(){
       var dims = testEl.getBoundingClientRect();
       ReactDOM.unmountComponentAtNode(testEl);
       return dims;
    }); 
}
Run Code Online (Sandbox Code Playgroud)
class App extends React.Component{
  render(){ return <h1>Hello</h1>}
}
  
  ReactDOM.render(<App/>,
    document.getElementById('app'),
    () => console.log('Component Mounted'))
Run Code Online (Sandbox Code Playgroud)

  • 您好,我特别询问将来如何同步执行此操作 - 有时我宁愿在计算某些尺寸时阻止渲染,也不愿获得 FOBUC (4认同)
  • 恐怕你做不到!如果 React 提供了一种异步渲染方式,而你想让它同步,这是不可能的。它更像是“如何使 ajax 同步?”。我认为没有其他方法可以在不使用 ReactDOM.render 的情况下将组件渲染到 DOM 中。相反,您可以使用回调,或者 React 可能会返回一个“promise”,您可以使用它构建“async wait”(ES 7 功能) (2认同)