react中ref的使用

react中ref的使用

拿一个简单的例子来说明会更清楚一些,现在我们有两个组件,当前的需求是我想在父组件里面拿到子组件里面本身这个实例,这个官方文档的推荐做法是使用回调函数。我们先使用官方文档上面回调函数的方式来实现。代码如下。


import React, { Component } from "react";
import MyComponent from "./MyComponent";
class Father extends Component {
  ref;
  constructor(props) {
    super(props);
    this.state = {};
  }
  componentDidMount() {
    console.log(this.ref);
  }

  render() {
    return (
      <div>
        <MyComponent ref={(ref)=>{this.ref=ref;}} />
      </div>
    );
  }
}

export default Father;

从下图中可以看到,已经成功获取到我们子组件的实例了

image

但现在我们想在子组件里面使用表单,于是我们使用了ant-design的Form.create将我们的子组件包裹起来.


export default Form.create()(MyComponent);

然后我们想拿到我们的子组件本身,我们在通过同样的方式试试看,发生了什么。

image

唉?奇怪,为什么获取到的实例不对啊,仔细看看,可以看到,里面有很多 form 实例具有的的方法,说明我们拿到的是返回的高阶组件的实例。而不是我们组件的实例。

ref 是 无法获取到高阶组件包裹的低阶组件的

ref获取高阶组件包裹的低阶组件

父组件

class Father extends Component {
  ref;
  constructor(props) {
    super(props);
    this.state = {};
  }

  componentDidMount() {
    console.log(this.ref);
  }

  onRef=(ref)=>{
      this.ref=ref;
  }

  render() {
    return (
      <div>
        <MyComponent onRef={this.onRef} />
      </div>
    );
  }
}

export default Father;

子组件

class MyComponent extends Component {
  constructor(props) {
    super(props);
    props.onRef(this);
    this.state={
    }
  }

  render() {
    return (
      <div>
        <Form>
          <Button>按钮</Button>
        </Form>
      </div>
    );
  }
}

export default Form.create()(MyComponent);

看一下打印结果,这样就成功拿到子组件这个实例了

image

这样你就能对子组件进行一系列操作了,比如改变子组件的状态, 假设子组件有个 visible 状态控制子组件内部某部分的显示与隐藏, 这样你就可以在父组件中通过

this.ref.setState({visible: false});

来控制该部分的变化了.

ref的强大还待研究, 后续有新的学习再更新相关的内容了.

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • React中Ref是什么? ref是React提供的用来操纵React组件实例或者DOM元素的接口。 ref的作用...
    张培_阅读 36,278评论 2 5
  • 在react中,一般情况下,数据通过props来交互,但是在某些情况下,仍需用到ref,在官网中是这样说的 In ...
    SuperBinlin阅读 5,266评论 0 2
  • 情景描述 将一个form表单封装成了一个组件并且使用antd的Form.create()将组件包裹起来(Form)...
    张培_阅读 7,146评论 0 3
  • 深入JSX date:20170412笔记原文其实JSX是React.createElement(componen...
    gaoer1938阅读 8,190评论 2 35
  • 探索Vue高阶组件 高阶组件(HOC)是 React 生态系统的常用词汇,React 中代码复用的主要方式就是使用...
    君惜丶阅读 1,064评论 0 2

友情链接更多精彩内容