Refs
在React中我们的数据流是从上至下,通过传递给子组件props
来重新渲染它
但是,有时候我们需要获取某些组件或者DOM元素,强制修改,这时我们可以使用Refs
我们应该使用声明式实现,避免使用refs
,尽量只在一下几种情况下使用:
- 处理焦点、文本选择或媒体控制
- 触发强制动画
- 集成第三方 DOM 库
添加Ref
import React from "react"
class CustomTextInput extends React.Component {
constructor(props) {
super(props)
this.focus = this.focus.bind(this)
}
focus() {
this.textInput.focus()
}
render() {
return(
<div>
//通过ref设置textInput 为此DOM元素
<input type="text" ref={input => this.textInput = input} ></input>
<input type="button" value="获得焦点" onClick={this.focus} ></input>
</div>
)
}
}
export default CustomTextInput
ref={input => this.textInput = input}
ref属性 会在DOM元素加载时将此元素传入ref,卸载时传入null
这种声明方式只对DOM元素和用class声明的组件有效
在函数式组件上,因为没有实例,所以不能使用ref属性
对父组件暴露DOM节点
当我们想要向从父组件访问子组件节点时,我们可以将传递给子组件一个特殊的函数属性,然后将这个函数属性作为ref属性传入子节点,可以通过这个函数将子节点赋值给父节点的属性
class CustomTextInput extends React.Component {
render() {
return(
<div>
<input type="text" ref={this.props.inputRef} ></input>
</div>
)
}
}
class ParentCompnent extends React.Component {
constructor(props) {
super(props)
this.focus = this.focus.bind(this)
}
focus() {
this.textInput.focus()
}
render() {
return(
<div>
<input type="button" value="获得焦点" onClick={this.focus} ></input>
<CustomTextInput inputRef={refCom => this.textInput = refCom}></CustomTextInput>
</div>
)
}
}
export default ParentCompnent
<CustomTextInput inputRef={refCom => this.textInput = refCom}></CustomTextInput>
设置子组件的ref属性回调此函数,将子组件设置为父组件的this.textInput
属性
如果有更深的层级结构 我们只需要一级一级传递即可