【问题标题】:How to get an element By ID inside React.Fragment?如何在 React.Fragment 中通过 ID 获取元素?
【发布时间】:2019-05-20 14:48:03
【问题描述】:

我试图在 React 中使用 ID 捕获元素,但我不能。

render() {
  //Looping through all menus
  let menuOptions = this.props.menuLists.map(menuList => {
    return (
      <li className="nav-item active" key={menuList.name}>
        <a className="nav-link" href={menuList.anchorLink}>
          {menuList.name}
        </a>
      </li>
    );
  });

  return (
    <React.Fragment>
      <div id="animSec">
        <canvas id="myCanvas" />
      </div>
    </React.Fragment>
  );
}

我想调用 myCanvas ID。

我通过this.refs 尝试过,但它发送给我未定义。我也试过react-dom

ReactDOM.findDOMNode(this.refs.myCanvas);

但一无所获。我首先在构造函数上调用findDOMNode,然后我尝试了componentDidMount,但一无所获。

【问题讨论】:

标签: javascript reactjs


【解决方案1】:

您可以使用Callback Refs 检索ID:

class YourComponent extends React.Component {
  constructor(props) {
    super(props)
    this.canvas = null
  }

  componentDidMount() {
    console.log(this.canvas.id) // gives you "myCanvas"
  }


  render() {
    return (
      <React.Fragment>
        <div id="animSec">
          <canvas id="myCanvas" ref={c => {this.canvas = c}}></canvas>
        </div>
      </React.Fragment>
    )
  }
}

或者,对于 React v16.3+,你可以使用createRef()

constructor(props) {
    super(props)
    this.canvas = React.createRef()
  }

  componentDidMount() {
    console.log(this.canvas.current.id) // gives you "myCanvas"
  }


  render() {
    return (
      <React.Fragment>
        <div id="animSec">
          <canvas id="myCanvas" ref={this.canvas}></canvas>
        </div>
      </React.Fragment>
    )
  }

【讨论】:

  • 感谢它确实有效。但是你能解释一下这行 c => {this.canvas = c} 为什么我必须调用 fun 并通过它传递元素?
  • reactjs.org/docs/refs-and-the-dom.html#callback-refs 首先要明白生命周期是这样的:constructor -> render -> componentDidMount (cdm)。在挂载组件之前,构造函数运行并声明canvas变量,然后在第一次渲染之后,我们使用ref API将存储在this.canvas中,然后我们可以在CDM中访问它。
  • v16.3之后,有一个新的createRef()方法:reactjs.org/docs/refs-and-the-dom.html#creating-refs我会用这个更新的方法更新答案。
  • 非常感谢。是的,这才是真正的原因。我在编码时没有维护生命周期的东西
  • 很高兴它为您解决了问题。如果有帮助,请接受我的回答,谢谢;)
【解决方案2】:

如果你在构造函数中设置一个 ref 为 this.canvasRef = React.createRef() 并将其应用到您的画布上

<React.Fragment> 
  <div id="animSec">
    <canvas ref={this.canvasRef}></canvas>
  </div>
</React.Fragment>

您应该能够直接访问该元素。您可以控制台日志或检查您的开发工具来查看 ref 值。而且(据我所知),与 React 中的 querySelectors 相比,使用 Refs 是最佳实践。您还可以查看this post,看看是否可以使用画布上的方法。

【讨论】:

    【解决方案3】:

    您可以尝试在自定义函数或任何生命周期方法中使用document.getElementById('myCanvas') 来定位所需的元素。
    请注意,如果您使用 next.js 之类的框架执行 SSR,这将不起作用,因为服务器中没有文档对象。

    【讨论】:

    • 它向我发送未定义的错误无法读取 null 的属性“宽度”
    • 尝试在componentDidMount 中使用它并使用clientWidth 来获取宽度。我在componentDidMount 中尝试过,控制台记录了document.querySelector('#myCanvas') 的输出
    • console.log(document.querySelector('#myCanvas'));在componentDidMount内部没有返回构造函数null
    • 这很奇怪。它对我有用。尝试仅使用 &lt;React.Fragment&gt; &lt;canvas id="myCanvas"&gt;&lt;/canvas&gt; &lt;/React.Fragment&gt; 制作一个新组件,并尝试在 componentDidMount 中使用 document.querySelector('#myCanvas')
    猜你喜欢
    • 2016-06-19
    • 2015-08-17
    • 1970-01-01
    • 2015-09-02
    • 1970-01-01
    • 2015-12-05
    • 2020-12-24
    • 1970-01-01
    • 2017-05-26
    相关资源
    最近更新 更多