发布于 2026-01-06 1 阅读
0

让我们用 React JS 创建一个“添加标签”输入框。

让我们用 React JS 创建一个“添加标签”输入框。

本文将向大家展示如何使用 React.js 和少量 CSS 创建多标签输入框。
React JS 添加 React JS 添加标签 输入标签 输入演示

让我们运行npx create-react-app myapp
以下命令创建一个新的 React JS 项目。为了简化操作,我将删除src文件夹中除 `.js`App.js和 ` .htm` 之外的所有文件index.js,并创建一个新的style.css文件。所以我们的文件夹结构应该如下所示。很好,现在让我们也删除 `.js` 和`.htm` 中所有不必要的代码。React 应用文件夹结构
index.jsApp.js

// src/index.js
import React from 'react';
import ReactDOM from 'react-dom';
import "./style.css";
import App from './App';

ReactDOM.render(
  <React.StrictMode>
    <App />
  </React.StrictMode>,
  document.getElementById('root')
);
Enter fullscreen mode Exit fullscreen mode
// src/App.js
function App() {
  return (
    <div className="App">
      <h2>Enter Some Tags ...</h2>
    </div>
  );
}

export default App;
Enter fullscreen mode Exit fullscreen mode

我还会将这些 CSS 样式添加到我们的src/index.js 文件中。

*{
    margin: 0;
    padding: 0;
}
html, body{
    height: 100%;
}
body{
    display: flex;
    justify-content: center;
    align-items: center;
    font-family: 'Courier New', Courier, monospace;
    font-weight: bold;
}

.tags-input-container{
    border: 2px solid #000;
    padding: .5em;
    border-radius: 3px;
    width: min(80vw, 600px);
    margin-top: 1em;
    display: flex;
    align-items: center;
    flex-wrap: wrap;
    gap: .5em;
}

.tag-item{
    background-color: rgb(218, 216, 216);
    display: inline-block;
    padding: .5em .75em;
    border-radius: 20px;
}
.tag-item .close{
    height: 20px;
    width: 20px;
    background-color: rgb(48, 48, 48);
    color: #fff;
    border-radius: 50%;
    display: inline-flex;
    justify-content: center;
    align-items: center;
    margin-left: .5em;
    font-size: 18px;
    cursor: pointer;
}

.tags-input{
    flex-grow: 1;
    padding: .5em 0;
    border: none;
    outline: none;
}
Enter fullscreen mode Exit fullscreen mode

如果你想更详细地了解 CSS,可以观看我的这个视频。

好了,现在如果我们运行应用程序,npm start它应该看起来像这样。好的,现在让我们在src文件夹内创建一个名为components 的 文件夹,我们将在该文件夹中创建一个名为TagsInput.js的组件文件。
基础 React 应用

// src/components/TagsInput.js
function TagsInput(){
    return (
        <div className="tags-input-container">
            <div className="tag-item">{/* One hardcoded tag for test */}
                <span className="text">hello</span>
                <span className="close">&times;</span>
            </div>
            <input type="text" className="tags-input" placeholder="Type somthing" />
        </div>
    )
}

export default TagsInput
Enter fullscreen mode Exit fullscreen mode

现在我们可以导入并在我们的系统中使用。App.js

// src/App.js
import TagsInput from "./components/TagsInput"

function App() {
  return (
    <div className="App">
      <h2>Enter Some Tags ...</h2>
      <TagsInput />
    </div>
  );
}

export default App;
Enter fullscreen mode Exit fullscreen mode

硬编码标签演示

很好,但是我们不想像这样硬编码标签,而是想要一个数组,然后遍历这个数组,并为每个元素显示一个标签。所以我们用useState来实现这一点。

// src/components/TagsInput.js
import { useState } from 'react'

function TagsInput(){
    const [tags, setTags] = useState([
        "HTML", "CSS", "JavaScript"
    ])
    return (
        <div className="tags-input-container">
            { tags.map((tag, index) => (
                <div className="tag-item" key={index}>
                    <span className="text">{tag}</span>
                    <span className="close">&times;</span>
                </div>
            )) }
            <input type="text" className="tags-input" placeholder="Type somthing" />
        </div>
    )
}

export default TagsInput
Enter fullscreen mode Exit fullscreen mode

React 使用 useState 和 map 动态渲染标签
好的,默认情况下我们的数组应该是空的,当我们在输入框中输入内容并按下回车键时,应该在标签状态数组中添加一个新项。所以让我们为此创建一个函数,并为输入框添加onKeyDown事件监听器。

// src/components/TagsInput.js
import { useState } from 'react'

function TagsInput(){
    const [tags, setTags] = useState([])

    function handleKeyDown(e){
        // If user did not press enter key, return
        if(e.key !== 'Enter') return
        // Get the value of the input
        const value = e.target.value
        // If the value is empty, return
        if(!value.trim()) return
        // Add the value to the tags array
        setTags([...tags, value])
        // Clear the input
        e.target.value = ''
    }

    return (
        <div className="tags-input-container">
            { tags.map((tag, index) => (
                <div className="tag-item" key={index}>
                    <span className="text">{tag}</span>
                    <span className="close">&times;</span>
                </div>
            )) }
            <input onKeyDown={handleKeyDown} type="text" className="tags-input" placeholder="Type somthing" />
        </div>
    )
}

export default TagsInput
Enter fullscreen mode Exit fullscreen mode

React JS 中的事件处理和状态更新
最后,当用户点击标签的
关闭按钮(x)时,该标签应该从标签数组中移除。因此,我们创建一个函数,该函数接受一个索引作为参数,并从标签数组中移除该索引处的元素。同时,为关闭按钮添加onClick 事件监听器。

// src/components/TagsInput.js
import { useState } from 'react'

function TagsInput(){
    const [tags, setTags] = useState([])

    function handleKeyDown(e){
        if(e.key !== 'Enter') return
        const value = e.target.value
        if(!value.trim()) return
        setTags([...tags, value])
        e.target.value = ''
    }

    function removeTag(index){
        setTags(tags.filter((el, i) => i !== index))
    }

    return (
        <div className="tags-input-container">
            { tags.map((tag, index) => (
                <div className="tag-item" key={index}>
                    <span className="text">{tag}</span>
                    <span className="close" onClick={() => removeTag(index)}>&times;</span>
                </div>
            )) }
            <input onKeyDown={handleKeyDown} type="text" className="tags-input" placeholder="Type somthing" />
        </div>
    )
}

export default TagsInput
Enter fullscreen mode Exit fullscreen mode

React JS 添加标签 输入完成演示
至此,我们使用 React 和少量 JavaScript 代码成功创建了一个标签输入框。

觉得有用吗?请我喝杯咖啡吧☕

别忘了看看我的其他文章和YouTube频道。

对您有帮助吗?请在Patreon上支持我。

Patreon 标志

文章来源:https://dev.to/0shuvo0/lets-create-an-add-tags-input-with-react-js-d29