【react】react中ref的使用

ref的作用

一句话总结:获取真实DOM

Refs 是 React 中引用(references)的简写。可以用于获取一个 DOM 节点或者 React 组件的引用。它是一个有助于存储对特定的 React 元素或组件的引用的属性,它将由组件渲染配置函数返回。可以用来绑定到 render() 输出的任何组件上。

createRef()获取DOM节点引用

①在constructor中this.name = React.createRef();

②在元素上绑定ref = { this.name }

③获取ref值:this.name.current.value

constructor(){
        super();
        this.name = React.createRef();
}
render() {
        return (
                <div>
                        <input type="text" name="name" ref={this.name}/>

                        <button onClick={()=>{
                                console.log(this.name.current.value)
                        }}>获取DOM节点的引用</button>
                </div>
        )
}

createRef()获取class组件引用

假如我们在父组件中引入一个输入框子组件,要获取这个输入框的值,如何做呢?

①将子组件作为普通DOM元素,在父组件中引入子组件,并为子组件添加ref,ref = { this.input }

②如果在父组件中调用this.input.current,就可以获取子组件的信息

③在父组件中调用this.input.current.name.value,就可以获取子组件输入框中的值

// 父组件
export default class RefComponent extends Component {

        constructor(){
                super();
                this.input = React.createRef()
        }
        
        render() {
                return (
                        <div>
                                <InputComponent ref={this.input}></InputComponent>
                                <button onClick={()=>{
                                        console.log(this.input.current)
                                        console.log(this.input.current.name.value)
                                }}>获取组件中的ref值</button>
                        </div>
                )
        }
}

// 子组件
class InputComponent extends Component {
        constructor(){
                super();
                this.name = React.createRef()
        }

        render() {
                return (
                        <div>
                                <input type="text"ref={this.name}/>
                        </div>
                )
        }
}

forwardRef()获取function组件引用

上述方法只能在父组件中获取类组件的引用,如果在函数组件上添加ref,则会报错。要在父组件中获取函数组件的引用,可以使用forwardRef()

export default class RefComponent extends Component {

        constructor(){
                super();
                this.input = React.createRef()
        }

        render() {
                const Input = React.forwardRef(InputComponent);
                return (
                        <div>
                                <Input type="text" ref={this.input}/>
                                
                                <button onClick={()=>{
                                        console.log(this.input.current.value);
                                }}>获取function组件ref</button>
                        </div>
                )
        }
}


function InputComponent(props, ref){
        return(
                <div>
                        <input type="text" ref={ref}/>
                </div>
        )
}

useRef()获取DOM节点引用

①useRef创建ref:const nameRef = useRef("");

②在元素上绑定ref = { nameRef }

③获取ref值:this.nameRef.current.value

function App() {
  const nameRef = useRef('');

  return (
    <div>
      <input ref={nameRef} />
      <div
        onClick={() => {
          console.log(nameRef.current.value);
        }}
      >
        submit
      </div>
    </div>
  );
}

回调函数获取DOM节点引用

①在constructor中this.name = null;

②定义回调函数

getNameRef = (e) => { this.name = e; }

③在元素上绑定ref = { this.getNameRef }

④获取ref值:this.name.value

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值