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 - useInsertionEffect Hook

"useInsertionEffect" Hook 是在 React JS 的第 18 版中引入的。useInsertionEffect Hook 提供了一种新的、用户友好的方法来管理 DOM 插入操作。开发人员可以使用 useInsertionEffect 在元素放入 DOM 后立即执行操作。

useInsertionEffect Hook 是一个自定义 Hook ,它允许我们在组件的元素放入 DOM 树后立即运行代码。它受到 React 中内置 Hook 的启发,例如 useEffect 和 useLayoutEffect。

语法

useInsertionEffect(setup, dependency)

参数

  • Setup − 这是我们可以放置代码的部分,该代码告诉我们的 React 组件在最初引入网页时执行任何操作。

  • 可选依赖项 − 这类似于我们的设置代码所依赖的对象列表。它可能是来自我们组件外部的任何内容,例如信息、数据或我们在组件内生成的内容。

返回值

此 Hook 返回未定义。

示例

示例 − 将 CSS 添加到 textArea

此软件允许我们将 CSS 代码输入到 textarea 中并查看它在 div 元素上的外观。将 div 元素放入 DOM 后,useInsertionEffect Hook 用于将 CSS 代码插入文档的头部。这可确保在完成任何其他布局效果之前应用 CSS 代码。

import React, { useState, useRef, useInsertionEffect } from 'react';

const App = () => {
   const [styleText, setStyleText] = useState('');
   const styleRef = useRef(null);
   
   useInsertionEffect(() => {
      const styleElement = document.createElement('style');
      styleElement.textContent = styleText;
      document.head.appendChild(styleElement);
      
      return () => {
         document.head.removeChild(styleElement);
      };
   }, [styleText]);
   
   return (
      <div>
         <textarea
            value={styleText}
            onChange={(event) => setStyleText(event.target.value)}
         />
         <div ref={styleRef} />
      </div>
   );
};

export default App;

输出

reactapp

示例 − 动态进度条应用

这是另一个使用 React 中的 useInsertionEffect Hook 的应用示例,展示了其用于创建动态进度条的用法。此应用允许我们调整范围输入,输入的值将反映在动态进度条中。每当进度状态变量发生变化时,useInsertionEffect Hook 用于更新进度条的宽度。

import React, { useState, useRef, useEffect } from 'react';

const App = () => {
   const [progress, setProgress] = useState(0);
   const progressBarRef = useRef(null);
   
   useEffect(() => {
      const progressBarElement = progressBarRef.current;
      progressBarElement.style.width = `${progress}%`;
   }, [progress]);
   
   return (
      <div>
         <input type="range" min="0" max="100" value={progress} onChange={(event) => setProgress(event.target.value)} />
         <div ref={progressBarRef} style={{ height: 20, backgroundColor: '#ccc' }}>
            <div style={{ height: '100%', width: `${progress}%`, backgroundColor: '#007bff' }}></div>
         </div>
      </div>
   );
};

export default App;

输出

progress bar app

示例

因此,我们可以使用 CSS-in-JS 库通过"useInsertionEffect" Hook 注入动态样式。因此,我们将借助一个简短的应用程序详细讨论这一点。

过去,React 组件使用基本 CSS 进行样式设置。

// 在 Javascript 文件中:
<button className="login" />

// 在 CSS 文件中:
.login { color: green; }

简单来说,CSS-in-JS 是一种设置 JavaScript 组件样式的方法。虽然静态和内联样式是首选,但在运行时插入样式可能会导致我们的程序变慢。在 React 中,useInsertionEffect Hook 管理何时添加这些样式,使我们的应用程序更易于使用。

import React from 'react';
import { useInsertionEffect } from 'react'; // 在此处导入 useInsertedEffect Hook 
let isInserted = new Set();

function useCSS(rule) {
   useInsertionEffect(() => {
      if (!isInserted.has(rule)) {
         isInserted.add(rule);
         const style = document.createElement('style');
         style.innerHTML = rule;
         document.head.appendChild(style);
      }
   });
}

function ColoredBox() {
   useCSS('.colored-box { background-color: lightgreen; }');

   return <div className="colored-box">I have a colored background.</div>;
}

function App() {
   return (
      <div>
         <ColoredBox />
      </div>
   );
}
export default App;

输出

background color

在上面的例子中,我们有一个 ColoredBox 组件,它使用 useCSS 自定义 Hook 来动态放置更改背景颜色的 CSS 规则。 useInsertionEffect Hook 确保 CSS 规则位于布局效果之前。

限制

  • 效果(如与 useInsertionEffect 一起使用的效果)仅适用于浏览器中显示的网页。 在网页实际在服务器上创建并传输到我们的浏览器之前,它们不会执行。

  • 我们无法在 useInsertionEffect 中修改组件使用的数据或信息。

  • 执行 useInsertionEffect Hook 时,特殊引用 (refs) 尚未准备好。它们不会立即使用。

  • 我们永远无法确定网页更新时何时会激活 usingInsertionEffect。它可以在页面上的内容发生变化之前或之后运行。

摘要

React 应用程序中的 useInsertionEffect Hook 提供了一种强大且简单的方法来管理 DOM 插入操作。我们可以在将元素添加到 DOM 后立即运行代码来执行 DOM 修改、动画、初始化和清理活动。了解其设置、限制和现实世界的最佳实践将使我们能够正确利用 useInsertionEffect 并改善 React 组件的功能和用户体验。

reactjs_reference_api.html