React(15)ref

x33g5p2x  于2022-03-06 转载在 其他  
字(1.8k)|赞(0)|评价(0)|浏览(636)

23、ref

用过 Vue 的同学,在使用 React 的 ref 时,注意不要混淆。

在 Vue 中,ref 绑定的 DOM 元素,可以直接在组件实例里,通过 this.$refs.xxx 来获取。

但是在 React 中,ref 的属性的值,是一个函数;

函数的参数是当前 DOM 标签,或是组件实例;

于是你可以在函数体内,通过 this.xxx = xxxx 来将该 DOM 赋值给组件的某个变量。

这样就实现了类似 Vue 的 refs 的功能。

给一个示例:

  1. class RefsDemo extends React.Component {
  2. constructor() {
  3. super()
  4. this.state = {
  5. display: ''
  6. }
  7. }
  8. render() {
  9. return <div>
  10. <div type="text" ref={(input) => {
  11. this.textInput = input
  12. }}></div>
  13. </div>
  14. }
  15. componentDidMount() {
  16. console.log(this.textInput)
  17. }
  18. }

输出结果:

  1. <input type="text">

当然也可以用来获取子组件:

  1. class ChildDemo extends React.Component {
  2. render() {
  3. return <p>123</p>
  4. }
  5. }
  6. class RefsDemo extends React.Component {
  7. constructor() {
  8. super()
  9. this.state = {
  10. display: ''
  11. }
  12. }
  13. render() {
  14. return <div>
  15. <ChildDemo ref={(child) => {
  16. this.child = child
  17. }}/>
  18. </div>
  19. }
  20. componentDidMount() {
  21. console.log(this.child)
  22. }
  23. }

输出:

  1. ChildDemo {props: {…}, context: {…}, refs: {…}, updater: {…}, _reactInternalFiber: FiberNode, …}

父组件获取子组件的 DOM:

首先,我们知道, 不能 直接通过父元素传 props 属性,然后将该 DOM 赋值给这个属性;

所以我们可以用常规的方法:即父组件传一个赋值函数给子组件,然后子组件在 ref 中调用这个函数即可。

示例:

  1. class ChildDemo extends React.Component {
  2. render() {
  3. return <div>
  4. <input type="text" ref={this.props.getInput}/>
  5. </div>
  6. }
  7. }
  8. class RefsDemo extends React.Component {
  9. render() {
  10. return <div>
  11. <ChildDemo getInput={this.getInput.bind(this)}/>
  12. </div>
  13. }
  14. getInput(DOM) {
  15. console.log(DOM)
  16. this.myInput = DOM
  17. }
  18. }

如果熟悉 React 的基本功,那么写出以上代码是毫无难度的。

但是,getInput 这个方法其实并没有必要独立出来,因为他的逻辑很简单,所以完全可以直接将这个函数作为 props 直接传入子组件,这也就有了 React 的教程上的示例。

  1. class ChildDemo extends React.Component {
  2. render() {
  3. return <div>
  4. <input type="text" ref={this.props.getInput}/>
  5. </div>
  6. }
  7. }
  8. class RefsDemo extends React.Component {
  9. render() {
  10. return <div>
  11. {/* 因为函数简单,所以直接写到这里,箭头函数自带绑定this到声明时的作用域 */}
  12. <ChildDemo getInput={DOM => {
  13. console.log(DOM)
  14. this.myInput = DOM
  15. }}/>
  16. </div>
  17. }
  18. // 注释掉
  19. // getInput(DOM) {
  20. // console.log(DOM)
  21. // this.myInput = DOM
  22. // }
  23. }

相关文章