react-18-input-autosize
是一个 React 18 兼容的输入框自动伸缩组件,可以让 <input>
输入内容时 根据文本长度自动调整宽度,而无需手动设置 size
或监听输入事件动态计算宽度。
它是 react-input-autosize
的 React 18 版本分支,常用于 标签输入、搜索框、表单动态输入 等场景。
输入框宽度随内容自动变化
支持受控和非受控输入
value
控制,也可以用内部状态React 18 兼容
完全样式可控
npm install react-18-input-autosize
或 Yarn:
yarn add react-18-input-autosize
import React, { useState } from "react";
import AutosizeInput from "react-18-input-autosize";
function AutoWidthInput() {
const [value, setValue] = useState("");
return (
<AutosizeInput
value={value}
onChange={(e) => setValue(e.target.value)}
placeholder="输入内容试试"
/>
);
}
export default AutoWidthInput;
特点:
input
的实际宽度Prop | 类型 | 说明 |
---|---|---|
value |
string | 输入框的值(受控模式) |
defaultValue |
string | 默认值(非受控模式) |
onChange |
function | 输入变化回调 (event) => {} |
placeholder |
string | 占位符 |
inputClassName |
string | 自定义输入框 class |
inputStyle |
object | 自定义输入框 style |
minWidth |
number | 输入框最小宽度(默认 1px) |
maxWidth |
number | 输入框最大宽度 |
style |
object | 外层容器样式 |
className |
string | 外层容器 class |
标签输入框(Tag Input)
Select
多选模式,输入框宽度随内容变化搜索框/命令输入框
动态表单
import React, { useState } from "react";
import AutosizeInput from "react-18-input-autosize";
function TagInput() {
const [tags, setTags] = useState(["React"]);
const [input, setInput] = useState("");
const handleKeyDown = (e) => {
if (e.key === "Enter" && input.trim()) {
setTags([...tags, input.trim()]);
setInput("");
}
};
return (
<div style={{ display: "flex", gap: 4, flexWrap: "wrap", border: "1px solid #ccc", padding: 4 }}>
{tags.map((tag, idx) => (
<span key={idx} style={{ background: "#eee", padding: "2px 6px", borderRadius: 4onst [input, setInput] = useState("");
const handleKeyDown = (e) => {
if (e.key === "Enter" && input.trim()) {
setTags([...tags, input.trim()]);
setInput("");
}
};
return (
<div style={{ display: "flex", gap: 4, flexWrap: "wrap", border: "1px solid #ccc", padding: 4 }}>
{tags.map((tag, idx) => (
<span key={idx} style={{ background: "#eee", padding: "2px 6px", borderRadius: 4 }}>
{tag}
</span>
))}
<AutosizeInput
value={input}
onChange={(e) => setInput(e.target.value)}
onKeyDown={handleKeyDown}
placeholder="输入并回车"
inputStyle={{ border: "none", outline: "none" }}
/>
</div>
);
}
export default TagInput;
效果:
react-18-input-autosize
让 <input>
根据内容长度自动调整宽度<input>
,不支持 <textarea>
(可用 react-textarea-autosize
)