React将React涉及DOM操作的部分剥离开,目的是为了抽象React,同时使用于Web端和移动端。ReactDOM的关注点在DOM上,因此只适用于Web端。
在React组件的开发实现中,我们并不会用到ReactDOM,只有在顶层组件以及由于React模型所限而不得不操作DOM的时候,才会使用它。
1.ReactDOM
ReactDOM中的API非常少,只有findDOMNode,unmountComponentAtNode和render.
1.findDOMNode
React提供的可以获取DOM的方法之一就是findDOMNode,当组件被渲染到DOM中后,findDOMNode返回该React组件实例相应的DOM节点。它可以用于获取表单的value以及用于DOM的测量。例如,假设要在当前组件加载完时获取当前DOM,则可以使用findDOMNode:
import React,{ Component } from 'React';
import ReactDOM from 'react-dom';
class App extends Component {
componentDidMount() {
const dom = ReactDOM.findDOMNode(this);
}
render() {}
}
如果在render中返回null,那么findDOMNode也返回null.findDOMNode只对已经挂载的组件有效。
2.render
为什么说只有在顶层组件我们才不得不使用ReactDOM呢,这是因为要把React渲染的VirtualDOM渲染到浏览器的DOM当中,就要使用render方法了。
ReactComponent render() {
ReactElement element,
DOMElement container,
[function callback]
}
该方法把元素挂载到container中,并且返回element的实例(即refs引用)。当然,如果时无状态组件,render会返回null.当组件装载完毕时,callback就会被调用
当组件在初次渲染之后再次更新时,React不会把整个组件重新渲染一次,而会用它高效的DOM diff算法做局部的更新。
2.ReactDOM的不稳定方法
ReactDOM中有两个不稳定方法,其中一个方法与render方法颇为相似,unstable_renderSubtreeIntoContainer.它的作用很简单,就是更新组件到传入的DOM节点上,它和render的区别在于是否传入父节点。
3.refs
刚才我们已经详述了ReactDOM的render方法,比如我们渲染了一个App组件到root节点
const myAppInstance = ReactDOM.render(<App />, document.getElementById('root'));
refs是React组件中非常特殊的prop,可以附加到任何一个组件上。从字面意思来看,refs即reference,组件被调用时会创建一个该组件的实例,而refs就会指向这个实例。
import React,{ Component } from 'React';
class App extends Component {
constructor(props) {
super(props);
this.handleClick = this.handleClick.bind(this);
}
handleClick() {
if(this.myTextInput !== null){
this.myTextInput.focus();
}
}
render() {
return (
<div>
<input type="text" ref={(ref) => this.myTextInput = ref} />
<input type="button" value="Focus the text input"
onClick={this.handleClick} />
</div>
);
}
}
refs同样支持字符串。对于DOM操作,不仅可以使用findModule获得该组件DOM,还可以使用refs获得组件内部的DOM。
import React, { componnet } from 'React';
import ReactDOM from 'react-dom';
class App extends Componnet {
componentDidMount() {
const myComp = this.refs.myComp;
const dom = React.findDOMNode(myComp);
}
render() {
return (
<div>
<Comp ref="myComp" />
</div>
);
}
}
要获取一个React组件的引用,既可以使用this来获取当前的React组件,也可以使用refs来获取你拥有的子组件的引用