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 - cloneElement() 函数

React 是一个用于创建用户界面的著名 JavaScript 库。它包含许多功能,可帮助我们创建灵活且可维护的代码。CloneElement 就是其中一种工具,它允许我们基于前一个 React 元素创建新的 React 元素,同时修改其属性和子元素。那么让我们看看 cloneElement 是什么以及如何使用它。

什么是 cloneElement?

术语 cloneElement 是一种 React 方法,它允许我们使用现有元素创建新的 React 元素。当我们想要更新元素的属性或向其添加子元素而不更改原始元素时,这很有用。

语法

const clonedElement = cloneElement(elem, props, ...children)

参数

  • elem − 这是一个有效的 React 元素,如 JSX 节点或另一个 cloneElement 调用的结果。

  • props − 它是一个对象或 null,允许我们覆盖元素的属性。如果我们传递 null,则克隆的元素将保留所有原始 props。

  • ...children − 有零个或多个子节点。它们可以是任何 React 节点,例如元素、字符串或数字。如果我们不传递任何子元素,则将使用原始子元素。

返回值

函数 cloneElement 返回具有以下属性的 React 元素对象 −

  • type − 与 element.type 相同。

  • props − element.props 和覆盖 props 的组合。

  • ref − 原始 ref,除非被 props.ref 覆盖。

  • key − 原始 key,除非被 props.key 覆盖。

cloneElement 最常见的用途是覆盖元素的属性。如果我们有一个现有元素并想更新特定功能,我们只需使用 cloneElement 即可。

示例

示例 − 添加新的 Prop 和 Button

在此应用中,我们将首先从"react"库导入必要的模块。导入 cloneElement 是为了对基本 React 元素进行修改。现在我们将使用 JSX 创建一个基本 React 元素。此元素是一个带有文本内容的简单 <div>。定义 App 功能组件。在此组件内,我们将使用 cloneElement 创建 basicElement 的修改版本。修改涉及添加一个名为 newProp 的新 prop,其值为"添加的 prop 值"。

import React, { cloneElement } from 'react';

const basicElement = <div>This is a basic React element.</div>;
const App = () => {
   const modifiedElement = cloneElement(basicElement, { newProp: 'Added prop value' });
   return (
   <div>
   {modifiedElement}
   <button onClick={() => alert('Button clicked!')}>Click me</button>
   </div>
   );
};

export default App;

输出

basic react element

当我们在 React 应用程序中使用此组件时,它将渲染修改后的元素以及一个按钮。单击按钮将显示一条警告,提示"按钮已单击!"。

示例 − 添加项目列表

在此示例中,我们将首先从"react"库导入必要的模块。同时导入 cloneElement 以对基本 React 元素进行修改。现在我们将使用 JSX 获得一个基本 React 元素。此元素是一个简单的 <div>,文本内容为"这是一个基本 React 元素"。然后定义 App 功能组件。在这个组件内,我们将定义一个项目数组。我们将使用 cloneElement 创建 basicElement 的修改版本。修改包括添加一个段落(<p>)和一个无序列表(<ul>),其中包含通过 items 数组映射生成的列表项。

import React, { cloneElement } from 'react';

const basicElement = <div>This is a basic React element.</div>;
const App = () => {
   const items = ['Item 1', 'Item 2', 'Item 3'];
   const modifiedElement = cloneElement(basicElement, null,
   <>
      <p>List of Items:</p>
      <ul>
         {items.map((item, index) => (
            <li key={index}>{item}</li>
         ))}
      </ul>
   </>
   );
   return <div>{modifiedElement}</div>;
};

export default App;

输出

list of items

当我们在 React 应用程序中使用此组件时,它将呈现修改后的元素,显示一个段落和一个无序列表的项目。

示例 − 让我们使用 cloneElement 创建一个应用程序

在此应用程序中,我们将创建一个简单的 React 应用程序,该应用程序使用 cloneElement 突出显示项目列表中的特定项目。该应用程序由两个组件组成:一个 List 组件和一个 Row 组件,以及一个显示产品列表的父 App 组件。

  • List 组件 − 它接收子组件列表。维护 selectedIndex 状态以跟踪当前突出显示的项目。使用 Children.map 迭代子项,并使用 cloneElement 根据 selectedIndex 修改 isHighlighted 属性。

  • Row 组件 − 它将产品标题呈现为一行。如果 isHighlighted 属性为真,则应用 CSS 类进行突出显示。

  • data.js 模块 − 它定义产品对象数组。

  • App.js − 在此文件中,我们将导入 List 和 Row 组件以及产品数据。并使用 List 组件呈现产品列表。

List.js

import { Children, cloneElement, useState } from 'react';

export default function List({ children }) {
   const [selectedIndex, setSelectedIndex] = useState(0);
   
   return (
   <div className="List">
      {Children.map(children, (child, index) =>
         cloneElement(child, {
            isHighlighted: index === selectedIndex,
         })
      )}
      <hr />
      <button
         onClick={() => {
            setSelectedIndex((i) => (i + 1) % Children.count(children));
         }}
      >
         Next
      </button>
   </div>
   );
}

Row.js

export default function Row({ title, isHighlighted }) {
   return (
      <div className={['Row', isHighlighted ? 'RowHighlighted' : ''].join(' ')}>
         {title}
      </div>
   );
}

Data.js

export const products = [
   { title: 'Laptop', id: 1 },
   { title: 'Smartphone', id: 2 },
   { title: 'Headphones', id: 3 },
   { title: 'Tablet', id: 4 },
];

App.js

import List from "./List.js";
import Row from "./Row.js";
import { products } from "./data.js";

export default function App() {
   return (
      <List>
         {products.map((product) => (
            <Row key={product.id} title={product.title} />
         ))}
      </List>
   );
}

输出

cloneElement

总结

因此 cloneElement 是 React 中的一个有用函数,它通常被使用,并且可能会给我们的程序增加复杂性和问题。了解何时在 React 应用程序中使用 cloneElement 以及何时使用其他技术可以帮助我们编写更干净、更高效的代码。

reactjs_reference_api.html