iis服务器助手广告
返回顶部
首页 > 资讯 > 精选 >React的Ref如何限制
  • 910
分享到

React的Ref如何限制

2023-07-02 16:07:36 910人浏览 薄情痞子
摘要

本篇内容介绍了“React的Ref如何限制”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!为什么是逃生舱?先思考一个问题:为什么ref、eff

本篇内容介绍了“React的Ref如何限制”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

为什么是逃生舱?

先思考一个问题:为什么refeffect被归类到逃生舱中?

这是因为二者操作的都是脱离React控制的因素。

effect中处理的是副作用。比如:在useEffect中修改了document.title

document.title不属于React中的状态,React无法感知他的变化,所以被归类到effect中。

同样,使DOM聚焦需要调用element.focus(),直接执行DOM api也是不受React控制的。

虽然他们是脱离React控制的因素,但为了保证应用的健壮,React也要尽可能防止他们失控。

失控的Ref

对于Ref,什么叫失控呢?

首先来看不失控的情况:

  • 执行ref.currentfocusblur等方法

  • 执行ref.current.scrollIntoView使element滚动到视野内

  • 执行ref.current.getBoundinGClientRect测量DOM尺寸

这些情况下,虽然我们操作了DOM,但涉及的都是React控制范围外的因素,所以不算失控。

但是下面的情况:

  • 执行ref.current.remove移除DOM

  • 执行ref.current.appendChild插入子节点

同样是操作DOM,但这些属于React控制范围内的因素,通过ref执行这些操作就属于失控的情况。

举个例子,下面是React文档中的例子:

按钮1点击后会插入/移除 P节点,按钮2点击后会调用DOM API移除P节点:

export default function Counter() {  const [show, setShow] = useState(true);  const ref = useRef(null);  return (    <div>      <button        onClick={() => {          setShow(!show);        }}>        Toggle with setState      </button>      <button        onClick={() => {          ref.current.remove();        }}>        Remove from the DOM      </button>      {show && <p ref={ref}>Hello world</p>}    </div>  );}

按钮1通过React控制的方式移除P节点。

按钮2直接操作DOM移除P节点。

如果这两种移除P节点的方式混用,那么先点击按钮1再点击按钮2就会报错:

React的Ref如何限制

这就是使用Ref操作DOM造成的失控情况导致的。

如何限制失控

现在问题来了,既然叫失控了,那就是React没法控制的(React总不能限制开发者不能使用DOM API吧?),那如何限制失控呢?

React中,组件可以分为:

  • 高阶组件

  • 低阶组件

低阶组件指那些基于DOM封装的组件,比如下面的组件,直接基于input节点封装:

function MyInput(props) {  return <input {...props} />;}

在低阶组件中,是可以直接将ref指向DOM的,比如:

function MyInput(props) {  const ref = useRef(null);  return <input ref={ref} {...props} />;}

高阶组件指那些基于低阶组件封装的组件,比如下面的FORM组件,基于Input组件封装:

function Form() {  return (    <>      <MyInput/>    </>  )}

高阶组件无法直接将ref指向DOM,这一限制就将ref失控的范围控制在单个组件内,不会出现跨越组件的ref失控。

以文档中的示例为例,如果我们想在Form组件中点击按钮,操作input聚焦:

function MyInput(props) {  return <input {...props} />;}function Form() {  const inputRef = useRef(null);  function handleClick() {    inputRef.current.focus();  }  return (    <>      <MyInput ref={inputRef} />      <button onClick={handleClick}>        input聚焦      </button>    </>  );}

点击后,会报错:

React的Ref如何限制

这是因为在Form组件中向MyInput传递ref失败了,inputRef.current并没有指向input节点。

究其原因,就是上面说的为了将ref失控的范围控制在单个组件内,React默认情况下不支持跨组件传递ref。

人为取消限制

如果一定要取消这个限制,可以使用forwardRef API显式传递ref

const MyInput = forwardRef((props, ref) => {  return <input {...props} ref={ref} />;});function Form() {  const inputRef = useRef(null);  function handleClick() {    inputRef.current.focus();  }  return (    <>      <MyInput ref={inputRef} />      <button onClick={handleClick}>        Focus the input      </button>    </>  );}

使用forwardRefforward在这里是传递的意思)后,就能跨组件传递ref

在例子中,我们将inputRefForm跨组件传递到MyInput中,并与input产生关联。

在实践中,一些同学可能觉得forwardRef这一API有些多此一举。

但从ref失控的角度看,forwardRef的意图就很明显了:既然开发者手动调用forwardRef破除防止ref失控的限制,那他应该知道自己在做什么,也应该自己承担相应的风险。

同时,有了forwardRef的存在,发生ref相关错误后也更容易定位错误。

useImperativeHandle

除了限制跨组件传递ref外,还有一种防止ref失控的措施,那就是useImperativeHandle,他的逻辑是这样的:

既然ref失控是由于使用了不该被使用的DOM方法(比如appendChild),那我可以限制ref中只存在可以被使用的方法。

useImperativeHandle修改我们的MyInput组件:

const MyInput = forwardRef((props, ref) => {  const realInputRef = useRef(null);  useImperativeHandle(ref, () => ({    focus() {      realInputRef.current.focus();    },  }));  return <input {...props} ref={realInputRef} />;});

现在,Form组件中通过inputRef.current只能取到如下数据结构

{  focus() {    realInputRef.current.focus();  },}

就杜绝了开发者通过ref取到DOM后,执行不该被使用的API,出现ref失控的情况。

“React的Ref如何限制”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

--结束END--

本文标题: React的Ref如何限制

本文链接: https://www.lsjlt.com/news/342980.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • React的Ref如何限制
    本篇内容介绍了“React的Ref如何限制”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!为什么是逃生舱?先思考一个问题:为什么ref、eff...
    99+
    2023-07-02
  • 如何深入理解React的ref 属性
    目录概述1. Refs 对象的创建1.1 React.createRef()1.2 React.useRef(initialValue)2. ref 属性的使用2.1 为原生DOM元...
    99+
    2024-04-02
  • React中的Ref是什么
    这篇文章主要介绍React中的Ref是什么,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!Intro在 React 项目中,有很多场景需要用到 Ref。例如使用 ref 属性获取 DO...
    99+
    2024-04-02
  • React ref的使用示例
    目录什么是 ref 如何使用 ref 放在 dom 元素上放在类组件上 放在函数组件上 总结 写了一段时间的 react,99%都在写 state、prop、useState、use...
    99+
    2024-04-02
  • React ref的使用案例
    本篇内容主要讲解“React ref的使用案例”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“React ref的使用案例”吧!什么是 ref官网介绍:在典型的 React 数据流中,props ...
    99+
    2023-06-14
  • React ref的原理和应用
    本篇内容介绍了“React ref的原理和应用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!提到 ref或...
    99+
    2024-04-02
  • React中的ref怎么使用
    这篇文章主要介绍“React中的ref怎么使用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“React中的ref怎么使用”文章能帮助大家解决问题。1. ref 的理解与使用对于 Ref 的理解,要从...
    99+
    2023-07-04
  • 深入详解React中的ref
    对于 Ref 理解与使用,一些读者可能还停留在用 ref 获取真实 DOM 元素和获取类组件实例层面上其实 ref 除了这两项常用功能之外,还有很多别的小技巧通过本篇文章的学习,你将收获 React ref 的基本和进阶用法,并且能够明白 ...
    99+
    2023-05-14
    ref React
  • React中ref的示例分析
    这篇文章给大家分享的是有关React中ref的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。为了摆脱繁琐的Dom操作, React提倡组件化, 组件内部用数据来驱动视图的...
    99+
    2024-04-02
  • React 组件权限控制的实现
    目录前话正文1. 控制方式1.1 直接计算1.2 通用权限Hoc1.3 权限包裹组件2. 控制结果2.1 显隐控制2.2 自定义渲染3. 权限数据3.1 静态权限3.2 动态权限前话...
    99+
    2024-04-02
  • Proftpd 权限是如何限制的
    今天就跟大家聊聊有关Proftpd 权限是如何限制的,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。ProFTPD是继Wu-FTP之后最为流行的FTP服务器软件。Proftpd的权限都...
    99+
    2023-06-16
  • React中ref属性的示例分析
    这篇文章主要介绍了React中ref属性的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。概述首先,Refs 和 ref 是两个概念,Refs 是 React 提供的可...
    99+
    2023-06-15
  • React-Router(V6)的权限控制实现示例
    目录接口权限页面权限1. 菜单权限2. 路由权限按钮权限参考在一个后台管理系统中,安全是很重要的。不光后端需要做权限校验,前端也需要做权限控制。 我们可以大致将权限分为3种: 接口权...
    99+
    2023-05-19
    React-Router权限控制 React-Router权限
  • 详解Ref在React中的交叉用法
    目录一、首先说明下什么是Ref二、ref在hooks中的用法1、ref在hooks中HTMLDom的用法2、ref在hooks中与函数式组件的用法3、ref在hooks中与类组件一同...
    99+
    2024-04-02
  • react中props 的使用及进行限制的方法
    组件的props( props是一个对象 ) 作用:接收传递给组件的数据 特点: 可以给组件传递任意类型的数据 props是只读的对象,只能读取属性的值,无法修改对...
    99+
    2024-04-02
  • React中的ref属性的使用示例详解
    目录ref 简介1. 字符串形式的ref2. create形式的ref3. 回调函数形式的ref总结:ref 简介 React提供的这个ref属性,表示为对组件真正实例的引用,其实就...
    99+
    2023-05-17
    React ref属性使用 React ref属性
  • react-redux的connect与React.forwardRef结合ref失效的解决
    目录react-redux的connect与React.forwardRef结合ref失效原因解决办法dva/redux的connect 和useRef/forwardRef混用的问...
    99+
    2023-05-20
    react-redux的connect React.forwardRef connect与React.forwardRef结合ref失效
  • nginx如何请求限制
    这篇文章主要介绍“nginx如何请求限制”,在日常操作中,相信很多人在nginx如何请求限制问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”nginx如何请求限制”的疑惑有所帮助!接下来,请跟着小编一起来学习吧...
    99+
    2023-06-20
  • MySQL中如何限制用户权限和访问控制
    在MySQL中,可以通过以下几种方法限制用户权限和访问控制: 使用GRANT语句授予或撤销用户权限。GRANT语句允许管理员为用...
    99+
    2024-03-06
    MySQL
  • 如何理解MySQL InnoDB表的限制
    这期内容当中小编将会给大家带来有关如何理解MySQL InnoDB表的限制,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。在 < 3.23.50 版本的 InnoDB...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作