【React】this.refs 和 ReactDOM.findDOMNode 区别是什么?

根据说明:this.refs 获得的是虚拟DOM,而ReactDOM.findDOMNode 获得的是实际DOM。
但是我测试代码的时候发现,两个是等效的,都可以直接操作并在页面呈现。请问这个是官方文档的错误吗?

回答

先看ref,第一点就有问题,官方文档说的很清楚,ref添加到Compoennt上获取的是Compoennt实例,添加到原生HTML上获取的是DOM

【React】this.refs 和 ReactDOM.findDOMNode 区别是什么?

再看个demo

class Child extends React.Component {

render() {

return <p>child</p>

}

}

class App extends React.Component {

render() {

return (

<div>

<div ref="div">app</div>

<Child ref="child"/>

<button onClick={()=> {

console.log(this.refs)

}}>log refs

</button>

</div>

)

}

}

新版本的React已经不推荐我们使用ref string转而使用ref callback

class App extends React.Component {

render() {

return (

<div>

<div ref={div => {

this._div = div

}}>app

</div>

<Child ref={child => this._child = child}/>

<button onClick={()=> {

console.log(this._div);

console.log(this._child);

}}>log refs

</button>

</div>

)

}

}

在说ReactDOM.findDOMNode,当参数是DOM,返回值就是该DOM(这个没啥卵用);当参数是Component获取的是该Component render方法中的DOM

class App extends React.Component {

render() {

return (

<div>

<div ref={div => {

this._div = div

}}>app

</div>

<Child ref={child => this._child = child}/>

<button onClick={()=> {

console.log(ReactDOM.findDOMNode(this._div) === this._div);

console.log(ReactDOM.findDOMNode(this._child));

}}>log refs

</button>

</div>

)

}

}

对于属性的支持程度不一样;

refs可以拿子子组件的props/state/方法;

findDOMNOde拿到的是原生的标签相关属性;

我觉得区别应该是this.refs从组件内部获取组件内部的DOM,ReactDOM.findDOMNode从组件外获取组件渲染的DOM。

正好新写的文章里有说到这一块 https://segmentfault.com/a/11...,findDOMNode 目前其实已经不推荐使用了。

以上是 【React】this.refs 和 ReactDOM.findDOMNode 区别是什么? 的全部内容, 来源链接: utcz.com/a/76209.html

回到顶部