React

关注公众号 jb51net

关闭
首页 > 网络编程 > JavaScript > javascript类库 > React > React refs属性

一文详解React类组件中的refs属性

作者:石小石Orz

react中的ref类似于vue中的ref,都是可以操作dom的,这篇文章我们通过一个demo来学习这个属性,文中有详细的代码示例供大家参考,具有一定的参考价值,需要的朋友可以参考下

使用react实现input值的变化

我们使用类式组件实现如图的一个简单效果

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <title>hello_react</title>
  </head>
  <body>
    <!-- 准备好一个“容器” -->
    <div id="test"></div>
    <!-- 引入react核心库 -->
    <script type="text/javascript" src="./js/react.development.js"></script>
    <!-- 引入react-dom,用于支持react操作DOM -->
    <script type="text/javascript" src="./js/react-dom.development.js"></script>
    <!-- 引入babel,用于将jsx转为js -->
    <script type="text/javascript" src="./js/babel.min.js"></script>
    <!-- 引入组件标签类型声明文件 -->
    <script type="text/javascript" src="./js/prop-types.js"></script>
    <script type="text/babel">
      class Demo extends React.Component {
        addNum = () => {
          let dom = document.getElementById("input");
          dom.value++;
        };
        render() {
          return (
            <div>
              <input type="text" placeholder="请输入数字" id="input" />
              <button onClick={this.addNum}>+</button>
            </div>
          );
        }
      }
      ReactDOM.render(<Demo />, document.getElementById("test"));
    </script>
  </body>
</html>

上述代码,我们通过在按钮上绑定addNum事件实现这个效果,addNum内我们直接操作了dom。

事实上,react也提供了ref属性,帮助我们直接操作dom

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <title>hello_react</title>
  </head>
  <body>
    <!-- 准备好一个“容器” -->
    <div id="test"></div>
    <!-- 引入react核心库 -->
    <script type="text/javascript" src="./js/react.development.js"></script>
    <!-- 引入react-dom,用于支持react操作DOM -->
    <script type="text/javascript" src="./js/react-dom.development.js"></script>
    <!-- 引入babel,用于将jsx转为js -->
    <script type="text/javascript" src="./js/babel.min.js"></script>
    <!-- 引入组件标签类型声明文件 -->
    <script type="text/javascript" src="./js/prop-types.js"></script>
    <script type="text/babel">
      class Demo extends React.Component {
        addNum = () => {
          let dom = document.getElementById("input");
          dom.value++;
        };
        render() {
          return (
            <div>
              <input type="text" placeholder="请输入数字" id="input" />
              <button onClick={this.addNum}>+</button>
            </div>
          );
        }
      }
      ReactDOM.render(<Demo />, document.getElementById("test"));
    </script>
  </body>
</html>

上述代码中,我们在input标签中使用 ref="input" 将其进行标识,然后通过 this.refs.input 直接获取到了dom。

字符串ref

我们给input标签绑定ref后,我们观察下类实例上发生了什么变化

class Demo extends React.Component {
  addNum = () => {
    // 这里的this指向Demo的实例化对象
    console.log(this);
  };
  render() {
    return (
      <div>
        <input type="text" placeholder="请输入数字" ref="myInput" />
        <button onClick={this.addNum}>+</button>
      </div>
    );
  }
}

可以观察到,this实例对象上的refs属性多了一个myInput属性,其值也是input

我们打印下myInput属性的值

addNum = () => {
  // 这里的this指向Demo的实例化对象
  console.log(this.refs.myInput);
};

可以看到,myinput的属性值就是input这个真实dom

这个示例中,我们通过ref="myInput" 对input标签进行了标识,标识后的标签dom可以在实例对象的refs属性中访问到。通过这种方式创建的ref我们称之为字符串类型ref

注:这种方式已经不被官方推荐,后续版本中会移除

回调形式的ref

回调形式的ref本质是一个函数,下面是一个基本的示例

<script type="text/babel">
  class Demo extends React.Component {
    addNum = () => {
      const dom = this.myInput
      dom.value ++
    };
    render() {
      return (
        <div>
          <input type="text" placeholder="请输入数字" ref={(dom)=>{this.myInput = dom}} />
          <button onClick={this.addNum}>+</button>
        </div>
      );
    }
  }
  ReactDOM.render(<Demo />, document.getElementById("test"));
</script>

在这个示例中,我们给ref绑定了一个函数,函数中,我们给this(类组件的实例上)创建了一个myinput属性,并进行了赋值。

我们可以先打印看看dom这个形参是什么东西

  <input type="text" placeholder="请输入数字" ref={(dom)=>{console.log(dom);}} />

通过打印结果,我们能很明确的知道这个形参dom就是input这个dom本身。

那自然在addNum函数里,我们可以通过 this.myInput 拿到input这个dom,并通过 dom.value 实现其值的自增。

createRef

除了字符串ref及回调函数类型的ref,我们还可以使用createRef来实现上述操作,一个基本的demo如下

<script type="text/babel">
  class Demo extends React.Component {
    myRef = React.createRef();
    addNum = () => {
      this.myRef.current.value++;
    };
    render() {
      return (
        <div>
          <input type="text" placeholder="请输入数字" ref={this.myRef} />
          <button onClick={this.addNum}>+</button>
        </div>
      );
    }
  }
  ReactDOM.render(<Demo />, document.getElementById("test"));
</script>

上述代码中,我们在类自身上创建了一个myRef属性,其属性值是React.createRef()创建的一个“容器”,然后,我们在input标签上通过ref={this.myRef}进行了绑定。

我们观察下this.myRef的属性值

addNum = () => {
  console.log(this);
  this.myRef.current.value++;
};

可以看到,myRef的属性内包含一个current属性,这是react内置的,我们无法改变。

当我们的有多个标签需要使用createRef函数时,需要给每个标签定义不同的“myRef”名称。

到此这篇关于一文详解React类组件中的refs属性的文章就介绍到这了,更多相关React refs属性内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文