ReactJS 教程

ReactJS - 主页 ReactJS - 简介 ReactJS - 路线图 ReactJS - 安装 ReactJS - 功能 ReactJS - 优势和缺点 ReactJS - 架构 ReactJS - 创建 React 应用程序 ReactJS - JSX ReactJS - 组件 ReactJS - 嵌套组件 ReactJS - 使用组件 ReactJS - 集合组件 ReactJS - 样式 ReactJS - 属性 (props) ReactJS - 使用属性创建组件 ReactJS - props 验证 ReactJS - 构造函数 ReactJS - 组件生命周期 ReactJS - 事件管理 ReactJS - 创建事件感知组件 ReactJS - Expense Manager 事件 ReactJS - 状态管理 ReactJS - 状态管理 API ReactJS - 无状态组件 ReactJS - Hooks 进行状态管理 ReactJS - Hooks 的组件生命周期 ReactJS - 布局组件 ReactJS - 分页 ReactJS - Material UI ReactJS - Http 客户端编程 ReactJS - 表单编程 ReactJS - 受控组件 ReactJS - 非受控组件 ReactJS - Formik ReactJS - 条件渲染 ReactJS - 列表 ReactJS - Key 键 ReactJS - 路由 ReactJS - Redux ReactJS - 动画 ReactJS - Bootstrap ReactJS - Map ReactJS - 表格 ReactJS - 使用 Flux 管理状态 ReactJS - 测试 ReactJS - CLI 命令 ReactJS - 构建和部署 ReactJS - 示例

Hooks

ReactJS - Hooks 简介 ReactJS - 使用 useState ReactJS - 使用 useEffect ReactJS - 使用 useContext ReactJS - 使用 useRef ReactJS - 使用 useReducer ReactJS - 使用 useCallback ReactJS - 使用 useMemo ReactJS - 自定义 Hooks

ReactJS 高级

ReactJS - 可访问性 ReactJS - 代码拆分 ReactJS - 上下文 ReactJS - 错误边界 ReactJS - 转发 Refs ReactJS - 片段 ReactJS - 高阶组件 ReactJS - 与其他库集成 ReactJS - 优化性能 ReactJS - Profiler API ReactJS - Portals ReactJS - 不使用 ES6 ECMAScript ReactJS - 不使用 JSX 的 React ReactJS - Reconciliation ReactJS - Refs 和 DOM ReactJS - 渲染道具 ReactJS - 静态类型检查 ReactJS - 严格模式 ReactJS - Web 组件

其他概念

ReactJS - 日期选择器 ReactJS - Helmet ReactJS - 内联样式 ReactJS - PropTypes ReactJS - BrowserRouter ReactJS - DOM ReactJS - 轮播 ReactJS - 图标 ReactJS - 表单组件 ReactJS - 参考 API

ReactJS 有用资源

ReactJS - 快速指南 ReactJS - 备忘录 Axios - 备忘录 ReactJS - 有用资源 ReactJS - 讨论


ReactJS - 转发 Refs

Ref 是直接操作 DOM 的出口,不受状态更改更新组件的影响。Ref 可以应用于 DOM 元素,但要将 Ref 应用于 React 组件并获取组件内部深处的 DOM 元素,转发 Ref 是最佳选择。 转发 Ref 允许组件从顶级组件接收 ref,并将其进一步传递到下一级组件以获取 DOM 元素。

让我们在本章中学习如何使用 转发 Ref。

forwardRef 方法的签名

forwardRef 的签名如下 −

const new-component = React.forwardRef(fn)

其中 fn 的签名如下 −

(props, ref) => {
    // 通过附加 ref 来渲染一个 React 组件并返回它
}

使用 forwardRef 的一个简单示例如下−

const MyInput = React.forwardRef((props, ref) => (
   <input type="text" ref={ref} value={props.value} />
));

const myRef = React.createRef();
<MyInput ref={myRef} value="Hi" />

这里,

  • MyInput 从顶层获取 ref 并将其传递给底层输入元素。

  • myRef 被分配给 MyInput 组件。

  • MyInput 组件将 myRef 传递给底层输入元素。

  • 最后,myRef 指向输入元素。

在组件中应用 forwardRef

让我们通过开发应用程序来学习 forwardRef 的概念。

首先,创建一个新的 react 应用程序并使用以下命令启动它。

create-react-app myapp
cd myapp
npm start

接下来,打开 App.css (src/App.css) 并删除所有 CSS 类。然后,创建一个简单的组件 SimpleForwardRef (src/Components/SimpleForwardRef.js),如下所示 −

import React from "react";
const SimpleForwardRef = React.forwardRef((props, ref) => (
   <input type="text" ref={ref} value={props.value} />
));
export default SimpleForwardRef

这里我们有,

  • 使用 forwardRef 将 ref 传递给 input 元素。

  • input 元素使用 ref props 设置 ref 值。

接下来,打开 App 组件 (src/App.js) 并使用 SimpleForwardRef 组件更新内容,如下所示 −

import './App.css'
import React, { useEffect } from 'react';
import SimpleForwardRef from './Components/SimpleForwardRef'
function App() {
   const myRef = React.createRef();
   useEffect(() => {
      setTimeout(() => {
         myRef.current.value = "Hello"
      }, 5000)
   })
   return (
      <div className="container">
         <div style={{ padding: "10px" }}>
            <div>
               <SimpleForwardRef ref={myRef} value="Hi" />
            </div>
         </div>
      </div>
   );
}
export default App;

这里,

  • myRef 使用 createRef 方法创建,并将其传递到 SimpleForwardRef 组件中。

  • myRef 表示 SimpleForwardRef 组件渲染的输入元素。

  • useEffect 将通过 myRef 访问输入元素,并尝试将输入的值从 hi 更改为 Hello。

最后,在浏览器中打开应用程序。 5 秒后,输入的值将更改为 Hello,如下所示 −

Applying ForwardRef Component

摘要

Forward ref 增强了 ref 概念,可在 React 应用程序的任何地方使用。任何 DOM 元素(可能是组件层次结构内任何深度的元素)都可以使用转发 Ref 概念进行访问和操作。