Ahs*_*mal 4 javascript reactjs material-ui
所以我使用这个 TagsInput 作为在codesandbox链接中共享的
https://codesandbox.io/s/material-ui-input-with-chips-0s2j4?from-embed=&file=/src/TagsInput.js
我面临的问题是,如果有很多芯片,那么芯片就会超出文本字段
我想做的是找到一种方法,让我可以拥有像多行文本字段这样的方法,这样如果碎片太多,它们就会像在自动完成中那样转到下一行。
export default function TagsInput({ ...props }) {
const classes = useStyles();
const { selectedTags, placeholder, tags, ...other } = props;
const [inputValue, setInputValue] = React.useState("");
const [selectedItem, setSelectedItem] = React.useState([]);
useEffect(() => {
setSelectedItem(tags);
}, [tags]);
useEffect(() => {
selectedTags(selectedItem);
}, [selectedItem, selectedTags]);
function handleKeyDown(event) {
if (event.key === "Enter") {
const newSelectedItem = [...selectedItem];
const duplicatedValues = newSelectedItem.indexOf(
event.target.value.trim()
);
if (duplicatedValues !== -1) {
setInputValue("");
return;
}
if (!event.target.value.replace(/\s/g, "").length) return;
newSelectedItem.push(event.target.value.trim());
setSelectedItem(newSelectedItem);
setInputValue("");
}
if (
selectedItem.length &&
!inputValue.length &&
event.key === "Backspace"
) {
setSelectedItem(selectedItem.slice(0, selectedItem.length - 1));
}
}
function handleChange(item) {
let newSelectedItem = [...selectedItem];
if (newSelectedItem.indexOf(item) === -1) {
newSelectedItem = [...newSelectedItem, item];
}
setInputValue("");
setSelectedItem(newSelectedItem);
}
const handleDelete = item => () => {
const newSelectedItem = [...selectedItem];
newSelectedItem.splice(newSelectedItem.indexOf(item), 1);
setSelectedItem(newSelectedItem);
};
function handleInputChange(event) {
setInputValue(event.target.value);
}
return (
<React.Fragment>
<Downshift
id="downshift-multiple"
inputValue={inputValue}
onChange={handleChange}
selectedItem={selectedItem}
>
{({ getInputProps }) => {
const { onBlur, onChange, onFocus, ...inputProps } = getInputProps({
onKeyDown: handleKeyDown,
placeholder
});
return (
<div>
<TextField
InputProps={{
startAdornment: selectedItem.map(item => (
<Chip
key={item}
tabIndex={-1}
label={item}
className={classes.chip}
onDelete={handleDelete(item)}
/>
)),
onBlur,
onChange: event => {
handleInputChange(event);
onChange(event);
},
onFocus
}}
{...other}
{...inputProps}
/>
</div>
);
}}
</Downshift>
</React.Fragment>
);
}
TagsInput.defaultProps = {
tags: []
};
TagsInput.propTypes = {
selectedTags: PropTypes.func.isRequired,
tags: PropTypes.arrayOf(PropTypes.string)
};
Run Code Online (Sandbox Code Playgroud)
您可以使用AutoComplete它来实现此目的。
代码沙盒示例
<Autocomplete
clearIcon={false}
options={[]}
freeSolo
multiple
renderTags={(value, props) =>
value.map((option, index) => (
<Chip label={option} {...props({ index })} />
))
}
renderInput={(params) => <TextField label="Add Tags" {...params} />}
/>
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3791 次 |
| 最近记录: |