如何在 React 中构建内联可编辑的 UI

随着 React 客户端 UI 库变得越来越强大,用户界面也变得越来越复杂。如今,我们可以通过试验 React 内联可编辑 UI 组件(如可编辑表、列表和文本字段)来创建更令人兴奋的用户体验。

反应内联可编辑用户界面

 下面是一个基本的 React 内联可编辑 UI 的示例:

我们将使用 Asana 创建任务函数的简化版本在 React 中构建基本的、内联可编辑的 UI 组件。如何在Windows 10中校准显示器?六个步骤轻松校准我们的可编辑 UI 将只有一个任务名称和一个描述字段。

我们将介绍以下内容:

  • 流行的内联可编辑 UI 工具
  • 反应内联可编辑 UI 组件库
    • 反应-轻松-编辑
    • 阿特拉斯安
    • 反应文本
    • 反应内容可编辑
    • 反应表
    • 农业网格
  • 可编辑的 UI 如何工作?
  • 为可编辑的 UI 构建一个简单的 React 组件
    • 解决焦点问题
    • 键控事件故障
  • 具有 Tab 键导航的表单的辅助功能
  • 何时使用 React 内联可编辑 UI
  • React 中内联可编辑 UI 的限制

请随时查看我们将在本如何在Windows中启用或禁用DHCP?怎么查看我又没有启用DHCP?演练中构建的 React 可编辑 UI 的演示。让我们开始吧!

流行的内联可编辑 UI 工具

首先,让我们回顾一些在Windows 10/8/7中启用或禁用Aero Peek的方法使用具有清晰用户体验的内联可编辑 UI 的最突出的产品。

  • 体式:具有内联可编辑表格和表单的最佳自定义UI之一
  • Jira:为字段提供自定义内联编辑功能。下面是来自 Jira 设计系统的设计示例
  • Trello:您只需单击Trello卡即可对其进行编辑
  • Airtable 和 Notion 是使用内联可编辑 UI 元素的现代应用程序
  • Google S Heets:为网络提供内联可编辑的智能表格 UI

反应内联可编辑 UI 组件库

在开始我们的内联可编辑组件的自定义实现之前,怎么打开UMD文件?什么是UMD文件?让我们考虑一些现有的 React 组件库,您可以使用它们来实现各种内联可编辑的 UI 元素。

反应-轻松-编辑

反应轻松编辑库允许对 HTML 5 输入组件进行内联编辑,Apache tomcat 6.0安装以及环境配置图文详细教程这意味着您可以在反应轻松编辑库之上自定义样式和功能。下面是使用该组件的简单示例:textbox

import React, { Component } from 'react';
import EasyEdit from 'react-easy-edit';
​
function App() {
​
  const save = (value) => {alert(value)}
  const cancel = () => {alert("Cancelled")}
​
  return (
    <EasyEdit
      type="text"
      onSave={save}
      onCancel={cancel}
      saveButtonLabel="Save Me"
      cancelButtonLabel="Cancel Me"
      attributes={
   
   { name: "awesome-input", id: 1}}
      instructions="Star this repo!"
    />
  );
}

您可以在Stackblitz上查看更多示例。

阿特拉斯安

构建 Jira 的团队 Atlassian免费的硬盘驱动器测试软件有哪些?6款免费mhdd硬盘检测和诊断软件 拥有一个具有内联编辑功能的设计系统。虽然它依赖于 Atlassian 设计系统,但它是一个可靠的库,如果您的应用程序需要可靠的功能,您可以考虑它。

反应文本

React-EdiText 是一个内联编辑库,Windows防火墙打不开怎么解决?防火墙服务无法启用处理方法可将元素转换为可编辑的内容。下面是一个 react-editext 的简单示例:textarea

import React, { Component } from 'react'
2import EdiText from 'react-editext'
3
4export default class App extends Component {
5  onSave = val => {
6    console.log('Edited Value -> ', val)
7  }
8
9  render () {
10    return (
11      <EdiText
12        type='text'
13        value='What is real? How do you define real?'
14        onSave={this.onSave}
15      />
16    )
17  }
18}

react-editext 还允许您使用样式化组件设置 如何配置Apache Web服务器?需要更改的指令有哪些EdiText 的样式。为了更好地理解它,您可以参考Stackblitz的示例。

反应内容可编辑

react-contenteditable 可以说是内联可编辑如何使用Nero6刻录CD/DVD?如何将数据刻录到空白CD/DVD UI 最著名的包。react-contenteditable 和其他组件库之间的主要区别在于它允许您内联编辑 HTML,而不仅仅是文本内容。

您可以使用 react-contenteditable 在 UI 中编辑标记和标记。您还可以管理可编辑元素的高度,以自定义输入或元素的外观。随意查看Stackblitz上的示例。textarea

反应表

React Table 是最流行的 UI 库之一,它允许您使用内联可怎么使用Outlook发送电子邮件?如何在Outlook中回复电子邮件编辑功能构建表和数据网格。您可以通过自定义 React Table 库组件来创建类似于 Google 表格的 UI。

2020 年 2022 月,React Table 创建者 Tanner Linsley 发布了 React Table,他将其描述为“将整个库重构为仅钩子 UI/样式/标记不可知的Windows11如何关闭用户帐户控制 (UAC)?四种图文教程教你如何关闭表构建实用程序的多年工作的高潮”。8 年 <> 月,TanStack Table v<> 发布,其中包括对 TypeScript 的完全重写。但是,在撰写本文时,迁移指南尚不可用。

要详细了解最新稳定版 React Table 中的新增功能,iphone开不了机黑屏充电也没反应怎么办?故障原因在哪里请查看我们关于使用 React Table v7 构建和固定表的综合指南。或者,继续阅读以了解如何使用 React Table 渲染您自己的 React 表组件。您还可以查看 React Table 厨房水槽,iphone越狱有什么用?iPhone越狱的优点和缺点有哪些?了解此可编辑 UI 在表格布局中的工作原理。

农业网格

Ag Grid 是另一个流行的库,iphone连不上itunes怎么办?iTunes无法识别连接的iOS设备解决方法用于构建具有内联可编辑功能的数据网格。像 ag-grid-react 和 React Table 这样的库帮助我们构建一个数据网格,Windows10通过网络共享打印机详细图文教程步骤以可视化表结构中的大量数据。内联编辑是其中包含的功能之一。

下面是一个基本实现:ag-grid-react

//javascript
import { AgGridReact } from "ag-grid-react";
​
return( <AgGridReact
   rowData={mockTransactionData()}
   columnDefs={mockTransactionDataColumns()}
 />);

您可以在Stackblitz上查看完整的示例。

可编辑的 UI 如何工作?

现在我们已经熟悉了一些有用的组件库,让我们来探讨一下可编辑 UI 的工作原理。

首先,可编辑的 UI 显示一个标签。悬停时,它将显示边框,使 UI 看起来内联且可编辑。单击时,它会将简单标签转换为自定义输入元素。一些值得注意的输入元素是输入字段、组件、日期选择器等。textarea``select

通过单击 或 ,我们将返回到初始状宽带限速怎么设置?如何查看带宽使用情况态并显示标签。如果单击 ,它将再次切换到输入元素,并使组件可以使用键盘访问。Enter``Escape``Tab

在本教程中,我们将构建一个没有该功能的简单版本。您可以轻松添加功能,但我会将其留给您。随意创建对我的存储库的拉取请求。Tab``Tab

为可编辑的 UI 构建一个简单的 React 组件

首先,我们将使用 Create React App 创建一个简单的 React 应用程序。我正在使用Tailwind CSS进行样式设置。有关更多信息,请查看我们关于在 React 中使用 Tailwind CSS 配置创建 React 应用程序的文章。

现在,让我们使用以下代码创建 React 组件:Editable

// Editable.js
import React, { useState } from "react";
​
// Component accept text, placeholder values and also pass what type of Input - input, textarea so that we can use it for styling accordingly
const Editable = ({
  text,
  type,
  placeholder,
  children,
  ...props
}) => {
  // Manage the state whether to show the label or the input box. By default, label will be shown.
// Exercise: It can be made dynamic by accepting initial state as props outside the component 
  const [isEditing, setEditing] = useState(false);
​
// Event handler while pressing any key while editing
  const handleKeyDown = (event, type) => {
    // Handle when key is pressed
  };
​
/*
- It will display a label is `isEditing` is false
- It will display the children (input or textarea) if `isEditing` is true
- when input `onBlur`, we will set the default non edit mode
Note: For simplicity purpose, I removed all the classnames, you can check the repo for CSS styles
*/
  return (
    <section {...props}>
      {isEditing ? (
        <div
          onBlur={() => setEditing(false)}
          onKeyDown={e => handleKeyDown(e, type)}
        >
          {children}
        </div>
      ) : (
        <div
          onClick={() => setEditing(true)}
        >
          <span>
            {text || placeholder || "Editable content"}
          </span>
        </div>
      )}
    </section>
  );
};
​
export default Editable;

该组件非常简单。如果状态为 ,则显示子项。在这里,我们传递 or 元素。输入状态将在此组件外部进行管理。isEditing``true``input``textarea

如果状态为 ,则根据文本值是否为空,显示简单标签或 。isEditing``false``text``placeholder

让我们看看一个简单的输入可编辑组件是什么样的:

// App.js - Input editable UI
​
import React, { useState } from "react";
import Editable from "./Editable";
​
function App() {
  // State for the input
  const [task, setTask] = useState("");
​
  /*
    Enclose the input element as the children to the Editable component to make it as inline editable.
  */
  return (
    <Editable
      text={task}
      placeholder="Write a task name"
      type="input"
    >
      <input
        type="text"
        name="task"
        placeholder="Write a task name"
        value={task}
        onChange={e => setTask(e.target.value)}
      />
    </Editable>
  );
}
​
export default App;

在上面的代码中,我们封闭在组件内部。您可以封装任何自定义表单组件,使其成为可编辑的 UI。input``Editable

这个例子非常简单。如果要为可编辑 UI 创建更复杂的示例,可以创建更高阶组件或自定义 Hook 来管理可编辑组件之外的所有状态。

让我们看看可编辑组件如何用于:textarea

<Editable
  text={description}
  placeholder="Description for the task"
  type="textarea"
>
  <textarea
    name="description"
    placeholder="Description for the task"
    rows="5"
    value={description}
    onChange={e => setDescription(e.target.value)}
  />
</Editable&gt

就是这么简单。我们刚刚将输入元素换成了 .只要我们根据我们传递组件的类型提供正确的 CSS,它就会起作用。textarea``Editable

但是,我们会遇到一些问题:

  • 当我们点击标签时,它不会自动聚焦在输入元素上
  • 可以使用密钥导航简单的表单。但是,如果不手动实现该功能,则无法导航内联可编辑 UITab

解决焦点问题

为了解决焦点问题,我们需要使用对输入元素的引用,并在设置编辑状态时聚焦它:

// App.js
import React, { useRef, useState } from "react";
import Editable from "./Editable";
​
function App() {
  /* 
    1. create a reference using use reference and add the ref={inputRef} to input element
    2. pass this reference to the Editable component, use different name than ref, I used `childRef`. Its basically a normal prop carrying the input element reference.
  */
  const inputRef = useRef();
  const [task, setTask] = useState("");
​
  return (
    <Editable
      text={task}
      placeholder="Write a task name"
      childRef={inputRef}
      type="input"
    >
      <input
        ref={inputRef}
        type="text"
        name="task"
        placeholder="Write a task name"
        value={task}
        onChange={e => setTask(e.target.value)}
      />
    </Editable>
  );
}
export default App;

接下来,我们将输入元素引用传递给组件,然后在状态为 :Editable``isEditing``true

// Editable.js
import React, { useState, useEffect } from "react";
import "./Editable.css";
​
const Editable = ({ childRef, ... }) => {
  const [isEditing, setEditing] = useState(false);
​
  /* 
    using use effect, when isEditing state is changing, check whether it is set to true, if true, then focus on the reference element
  */ 
  useEffect(() => {
    if (childRef && childRef.current && isEditing === true) {
      childRef.current.focus();
    }
  }, [isEditing, childRef]);
​
  const handleKeyDown = (event, type) => {
    ...
  };
​
  return (
    ...
};
​
export default Editable;

键控事件故障

处理键控事件时需要注意一些事项。输入元素的键,包括 、 ,并将状态设置为 。Enter``Escape``Tab``isEditing``false

对于元素,键必须在 内添加一个新行,因此我们需要单独处理此用例:textarea``Enter``textarea

const handleKeyDown = (event, type) => {
    const { key } = event;
    const keys = ["Escape", "Tab"];
    const enterKey = "Enter";
    const allKeys = [...keys, enterKey]; // All keys array
​
  /* 
    - For textarea, check only Escape and Tab key and set the state to false
    - For everything else, all three keys will set the state to false
  */
    if (
      (type === "textarea" && keys.indexOf(key) > -1) ||
      (type !== "textarea" && allKeys.indexOf(key) > -1)
    ) {
      setEditing(false);
    }
}:

具有键导航的表单的辅助功能Tab

默认情况下,输入 和 是隐藏的。因此,我们无法仅通过按键来导航表单字段。textarea``Tab

为了实现键盘支持,我们需要监视组件或整个页面上的键事件,并为每个元素手动设置状态。然后,我们可以在下一次按键时导航到下一个表单元素。Tab

我们没有在我们的示例代码中实现这一点,但值得一试,以确保您可以在 React 中处理页面上的按键事件。

何时使用 React 内联可编辑 UI

您不需要内联可编辑 UI 来满足基本表单需求。但是,对于复杂的 React 应用程序,最好在一个地方构建视图和编辑,在这些应用程序中,您有很多内容和编辑选项。如果不这样做,则必须维护两个不同的 UI。

React 中内联可编辑 UI 的限制

在内联可编辑 UI 中可能遇到的最重大挑战涉及显示错误。在考虑用户体验时,最好考虑到这一点。


您可能还难以实现支持鼠标事件所需的辅助功能。触摸事件也可能是一个问题。

最后,当表单元素被隐藏时,支持移动设备可能会很困难。如果 UI 必须支持移动布局,这将特别棘手,因为没有悬停来向用户显示字段是否可在触摸屏上内联编辑。

结论

这是一个在 React 中创建内联可编辑组件的简单示例和概述。尝试使用现有组件,但如果没有一个组件符合您的需求,则可以创建自定义组件。您可以在此处查看演示,在此处查看代码库。祝您编码愉快!

猜你喜欢

转载自blog.csdn.net/weixin_47967031/article/details/130219405