React,如何从同一个组件访问我的渲染函数中的 DOM 元素

IT技术 javascript css reactjs jsx
2021-05-17 02:25:00

我想知道从同一组件访问渲染函数中的 DOM 元素的最佳实践是什么。请注意,我将在页面上多次渲染此组件。

例如

var TodoItem = React.createClass({
    ...
    render:function(){

        function oneSecLater(){
            setTimeout(function(){
            //select the current className? this doesn't work, but it gives you an idea what I want.
            document.getElementsByClassName('name').style.backgroundColor = "red";
                )}, 1000);
        }

        return(
            <div className='name'>{this.oneSecLater}</div>
        )



})
4个回答

您可以使用ReactDOM.findDOMNode(this)来访问底层 DOM 节点。但是访问 DOM 节点并像您一样操作是违反 React 编程风格的。最好使用状态变量并调用setState方法重新渲染DOM。

在这里,不需要使用 setTimeout。组件有生命周期方法,componentDidMount在渲染后调用。因此,您可以在方法中获取对 div 的引用。

var TodoItem = React.createClass({
  ...
  componentDidMount: function () {
     if(this.myDiv) {
        this.myDiv.style.backgroundColor = "red";
     }
  }
  render:function(){
    return(
        <div className='name' ref = {c => this.myDiv = c}></div>
    );
});

你可以使用ref callback访问 react 中的 dom 元素,这是 React Docs 推荐遵循的

并在componentDidMount生命周期函数中执行此操作,因为在创建 DOM 之前将无法访问 refs

var TodoItem = React.createClass({
    ...
    componentDidMount() {
          setTimeout(function(){
               this.myDiv.style.backgroundColor = "red";
          )}, 1000);
    }
    render:function(){

        return(
            <div className='name' ref={(ele) => this.myDiv = ele}></div>
        )

})

文件

你应该避免访问 DOM 元素,因为 React 的重点是将抽象置于 dom 之上。React 将 DOM 的表示保存在内存中,称为 VirtualDom。使用 VirtualDom 将使您的应用程序的单元测试更容易。如果您真的知道自己在做什么,下面是如何做:

componentDidMount(){
const name=this.name.current.style() //current will return the actual DOM 
element
}
name=React.createRef()  //create a ref object

<div ref={this.name} className="anything" /> //your classname does not need to be named as "name". You access the element via the "ref" attribute not the classname.

在 ComponentDidMount 中,当您的组件被挂载时,其样式更改将被应用。