React中ref的使用

ゝ一世哀愁。 2022-11-15 11:29 305阅读 0赞

一、类式组件使用Ref

1、字符串 Refs

官方目前不推荐使用这种方式创建Ref,因为这种方式存在一些问题,影响效率,可能会在后续版本移除

step

  • 1、在要获取的DOM上,加上ref='xxx'
  • 2、获取的时候通过this.refs.xxx获取当前DOM实例

    import React, { Component, Fragment } from ‘react’;

    class App extends Component {

    1. getName = () => {
    2. //注意:是refs不是$refs
    3. console.log(this.refs.nameRef)
    4. }
    5. render() {
    6. return (
    7. <Fragment>
    8. //使用ref属性,在要获取的DOM身上定义
    9. <input ref="nameRef" type="text" placeholder="请输入姓名"></input>
    10. <button onClick={ this.getName}>获取姓名</button>
    11. </Fragment>
    12. );
    13. }

    }

    export default App;

2、回调 Refs

2.1 内联函数绑定方式
  • 注意:该方式在更新过程中ref绑定的函数它会被执行两次第一次传入参数是null第二次才会传入参数 DOM 元素,但是大多数情况下,它是无关紧要

在需要获取的DOM设置设置ref属性,值是一个函数,<input ref={ele => this.xxx = ele} />,接收的参数就是当前绑定ref属性的DOM

  1. import React, { Component, Fragment } from 'react';
  2. class App extends Component {
  3. inputRef = null
  4. getName = () => {
  5. //获取姓名
  6. console.log(this.inputRef.value)
  7. }
  8. updateData = () => {
  9. this.setState({ })
  10. }
  11. render() {
  12. return (
  13. <Fragment>
  14. <input
  15. ref={
  16. element => {
  17. this.inputRef = element;
  18. //在更新过程中它会被执行两次,第一次传入参数 null,
  19. //然后第二次会传入参数 DOM 元素
  20. console.log(this.element)
  21. }
  22. }
  23. type="text"
  24. placeholder="请输入姓名"></input>
  25. <button onClick={ this.getName}>获取姓名</button>
  26. <button onClick={ this.updateData}>更新数据</button>
  27. </Fragment>
  28. );
  29. }
  30. }
  31. export default App;
2.2 class绑定函数的方式

将 ref 的回调函数定义成 class 的绑定函数的方式可以避免数据更新执行两次

  1. import React, { Component, Fragment } from 'react';
  2. class App extends Component {
  3. inputRef = null
  4. getName = () => {
  5. console.log(this.inputRef.value)
  6. }
  7. updateData = () => {
  8. this.setState({ })
  9. }
  10. setInputRef = ele => {
  11. this.inputRef = ele
  12. console.log(ele)
  13. }
  14. render() {
  15. return (
  16. <Fragment>
  17. //注意:这里将回调函数定义在外面
  18. <input ref={ this.setInputRef} type="text" placeholder="请输入姓名"/>
  19. <button onClick={ this.getName}>获取姓名</button>
  20. <button onClick={ this.updateData}>更新数据</button>
  21. </Fragment>
  22. );
  23. }
  24. }
  25. export default App;

3、创建 Refs

  • 注意: 该方式只能在React 16.3 版本及之后的版本中使用

通过React.createRef()创建Ref容器,通过ref绑定当前容器,让当前容器承载当前ref的节点信息
可通过ref容器的current属性获取到当前节点 。

如果创建出的Ref容器,被多个DOM绑定,前面绑定的DOM会被后面的绑定的DOM替换,因为React.createRef()创建出来的容器是专人专用、专一的”人”,只能承载一个DOM节点信息。

  1. import React, { Component, Fragment } from 'react';
  2. class App extends Component {
  3. //创建Ref容器,承载当前ref绑定的节点信息
  4. inputRef = React.createRef()
  5. getName = () => {
  6. console.log(this.inputRef.current.value)
  7. }
  8. updateData = () => {
  9. this.setState({ })
  10. }
  11. render() {
  12. return (
  13. <Fragment>
  14. //绑定ref,让inputRef容器承载当前节点信息
  15. <input ref={ this.inputRef} type="text" placeholder="请输入姓名" />
  16. <button onClick={ this.getName}>获取姓名</button>
  17. </Fragment>
  18. );
  19. }
  20. }
  21. export default App;

二、函数式组件使用Ref

和类式组件中 创建Refs 相似,把React.createRef()换成了React.useRef(),其它与 类式组件创建Refs一致

  1. import React, { Fragment } from 'react';
  2. const App = () => {
  3. const inputRef = React.useRef()
  4. function getName() {
  5. console.log(inputRef.current.value)
  6. }
  7. return (
  8. <Fragment>
  9. <input ref={ inputRef} type="text" placeholder="请输入姓名"></input>
  10. <button onClick={ getName}>获取姓名</button>
  11. </Fragment>
  12. );
  13. }
  14. export default App

以上就是React三大重要属性之一Ref的使用

发表评论

表情:
评论列表 (有 0 条评论,305人围观)

还没有评论,来说两句吧...

相关阅读

    相关 react------refs

    refs:组件内的标签都可以定义ref属性来标识自己        在组件中科院通过this.refs.refName来获取对应的真实DOM对象        用于操作指定

    相关 react ref 作用

    帮助我们在 react 里面直接获取 dom 元素使用的, 一般情况下尽量不用. 在做复杂业务比如动画, 不可避免要用到页面标签时, 可以用 ref. ref 和 se