React-Refs

21 篇文章 0 订阅
11 篇文章 0 订阅

什么是Refs

ref :reference参考,

Refs 引用一部分真实的DOM,我们可以通过这个引用直接操作DOM

组件并不是真是的DOM,而是存在于内存中的一种数据结构,叫做虚拟DOM,当虚拟DOM插入文档后才会变成真的DOM。根据React的diff算法,会将真实DOM与虚拟DOM进行比较,文档只会重新渲染改变的部分,这样可以很大程度上节省性能。

值得注意的是,this.ref返回的的是真实的DOM节点,所以必须得虚拟DOM插入文档后才能使用,否则会报错

与props不同的是

  1. props主要用于父组件与子组件之间的通信,并不能直接操作子组件里面的DOM,

  2. props不可更改,而refs可以强制更改

  3. props在组件还是虚拟DOM的时候就可以使用了,但是Refs引用的是真实的DOM,也就是组件componentDidMount

  4. Ref属性指向的节点不能是函数组件,因为通过ref获得的DOM包含了生命周期和state,但是在函数组件中,可以通过ref指向类组件或者DOM节点

    function MyFunctionComponent(){
      return <div>1</div>
    }
    class Child extends React.Component{
      constructor(props){
        super(props);
        this.myRef=React.createRef();
      }
      render(){
        return <MyFunctionComponent ref={this.myRef}/>
        //报错Warning: Stateless function components 
        //cannot be   given refs. Attempts to access this 
        //ref will fail.
      }
    }
    
  5. 官方提倡多用props,不要滥用Refs

解决的问题

为了能让父组件直接操作子组件中的元素

import React, {Component} from 'react';

function Child(props) {
    return <button>{props.children}</button>
}

class Parent extends Component {
    constructor(props, context) {
        super(props, context);
        this.r = React.createRef()
    }

    render() {
        return <Child ref={this.r}>Click me!!</Child>
    }
}

export default Parent;

这里的this.r拿到的是子组件Child,而不是子组件中的input,就不能在父组件上直接让子组件的input获得焦点

this.r.current.focus() //报错

什么时候使用Refs

下面是几个适合使用 refs 的情况:

  • 管理焦点,文本选择或媒体播放。
  • 触发强制动画。
  • 集成第三方 DOM 库。

避免使用 refs 来做任何可以通过声明式实现来完成的事情。

当你想使用refs时,想想是否可以用state代替。最适合设置state的地方是在层级中较高的位置设置。

举个例子,避免在 Dialog 组件里暴露 open() 和 close() 方法,最好传递 isOpen 属性。

Refs转发

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
React Refs 是 React 提供的一种访问 DOM 元素或组件实例的方法。通过 Refs,我们可以在组件直接访问到被 Refs 引用的 DOM 元素或组件实例,从而进行一些特殊的操作。 下面,我来举一个 React Refs 的案例: 假设我们有一个 Input 组件,需要在组件加载完毕后自动获取焦点,我们可以通过 Refs 来实现这个功能。具体的实现步骤如下: 1. 在 Input 组件定义 Refs: ```jsx class Input extends React.Component { constructor(props) { super(props); this.inputRef = React.createRef(); // 创建 Refs } render() { return <input type="text" ref={this.inputRef} />; } } ``` 2. 在 componentDidMount 生命周期使用 Refs 获取到 input 元素,并调用 focus() 方法: ```jsx class Input extends React.Component { constructor(props) { super(props); this.inputRef = React.createRef(); // 创建 Refs } componentDidMount() { this.inputRef.current.focus(); // 获取 input 元素并获取焦点 } render() { return <input type="text" ref={this.inputRef} />; } } ``` 这样,当 Input 组件加载完毕后,它的 input 元素就会自动获取焦点了。 注意,Refs 只能在类组件使用,不能在函数式组件使用。另外,Refs 的值可以是回调函数,而不仅仅是 React.createRef() 方法返回的对象。如果使用回调函数的方式,可以在回调函数访问到组件实例或 DOM 元素,例如: ```jsx class Input extends React.Component { constructor(props) { super(props); this.inputRef = null; // 创建 Refs this.setInputRef = element => { this.inputRef = element; }; } componentDidMount() { this.inputRef.focus(); // 获取 input 元素并获取焦点 } render() { return <input type="text" ref={this.setInputRef} />; } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值