让我们用 React JS 创建一个“添加标签”输入框。
本文将向大家展示如何使用 React.js 和少量 CSS 创建多标签输入框。
让我们运行npx create-react-app myapp
以下命令创建一个新的 React JS 项目。为了简化操作,我将删除src文件夹中除 `.js`App.js和 ` .htm` 之外的所有文件index.js,并创建一个新的style.css文件。所以我们的文件夹结构应该如下所示。很好,现在让我们也删除 `.js` 和`.htm` 中所有不必要的代码。
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')
);
// src/App.js
function App() {
return (
<div className="App">
<h2>Enter Some Tags ...</h2>
</div>
);
}
export default App;
我还会将这些 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;
}
如果你想更详细地了解 CSS,可以观看我的这个视频。
好了,现在如果我们运行应用程序,npm start它应该看起来像这样。好的,现在让我们在src文件夹内创建一个名为components 的 文件夹,我们将在该文件夹中创建一个名为TagsInput.js的组件文件。
// 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">×</span>
</div>
<input type="text" className="tags-input" placeholder="Type somthing" />
</div>
)
}
export default TagsInput
现在我们可以导入并在我们的系统中使用。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;
很好,但是我们不想像这样硬编码标签,而是想要一个数组,然后遍历这个数组,并为每个元素显示一个标签。所以我们用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">×</span>
</div>
)) }
<input type="text" className="tags-input" placeholder="Type somthing" />
</div>
)
}
export default TagsInput

好的,默认情况下我们的数组应该是空的,当我们在输入框中输入内容并按下回车键时,应该在标签状态数组中添加一个新项。所以让我们为此创建一个函数,并为输入框添加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">×</span>
</div>
)) }
<input onKeyDown={handleKeyDown} type="text" className="tags-input" placeholder="Type somthing" />
</div>
)
}
export default TagsInput

最后,当用户点击标签的
关闭按钮(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)}>×</span>
</div>
)) }
<input onKeyDown={handleKeyDown} type="text" className="tags-input" placeholder="Type somthing" />
</div>
)
}
export default TagsInput

至此,我们使用 React 和少量 JavaScript 代码成功创建了一个标签输入框。
觉得有用吗?请我喝杯咖啡吧☕
别忘了看看我的其他文章和YouTube频道。

