- 使用refs而不是findDOMNode()去获取DOM节点.
- 使用this找到DOM节点
- 以前的做法:
- 使用ref之后的做法
- 使用字符串ref找到DOM节点
- 使用字符串ref的做法
- 使用回调ref的做法
- 调用子组件的ref
- 不使用ref的做法:
- 使用ref的做法
- 使用this找到DOM节点
- 参考资料:
使用refs而不是findDOMNode()去获取DOM节点.
注意:
React实际上也支持使用字符串作为ref, 来访问DOM节点. 但是需要注意的是这是一种已经不被官方推荐的用法.
- 更多关于ref的知识
- 为什么字符串形式的ref已经不被推荐了?
使用this找到DOM节点
以前的做法:
class MyComponent extends Component {
componentDidMount() {
findDOMNode(this).scrollIntoView();
}
render() {
return <div />
}
}
使用ref之后的做法
class MyComponent extends Component {
componentDidMount() {
this.node.scrollIntoView();
}
render() {
return <div ref={node => this.node = node}/>
}
}
使用字符串ref找到DOM节点
使用字符串ref的做法
class MyComponent extends Component {
componentDidMount() {
findDOMNode(this.refs.something).scrollIntoView();
}
render() {
return (
<div>
<div ref='something'/>
</div>
)
}
}
使用回调ref的做法
class MyComponent extends Component {
componentDidMount() {
this.something.scrollIntoView();
}
render() {
return (
<div>
<div ref={node => this.something = node}/>
</div>
)
}
}
调用子组件的ref
不使用ref的做法:
class Field extends Component {
render() {
return <input type='text'/>
}
}
class MyComponent extends Component {
componentDidMount() {
findDOMNode(this.refs.myInput).focus();
}
render() {
return (
<div>
Hello,
<Field ref='myInput'/>
</div>
)
}
}
使用ref的做法
class Field extends Component {
render() {
return (
<input type='text' ref={this.props.inputRef}/>
)
}
}
class MyComponent extends Component {
componentDidMount() {
this.inputNode.focus();
}
render() {
return (
<div>
Hello,
<Field inputRef={node => this.inputNode = node}/>
</div>
)
}
}
参考资料:
- ESLint Rule proposal: warn against using findDOMNode()
- Refs and the DOM