reactjs - 同时在两个输入字段中写入值ReactJS
问题描述
当我在一个输入字段中输入值时,我遇到了一个问题,它也出现在另一个输入字段中。
在屏幕截图上,我开始在底部字段中输入,但数字也开始出现在顶部字段中。
如果我只在顶部输入字段中输入值,它也会出现在底部。就像它总是使我在任何领域的价值翻倍。
代码
import React from "react";
import { Button, Form } from "react-bootstrap";
const symbols = [
"ADABTC",
"AIONBTC",
"ALGOBTC",
"ARDRBTC",
"KAVABTC",
"ETHBTC",
"ETCBTC"
];
function PriceTriggerField() {
const [searchTerm, setSearchTerm] = React.useState("");
const [searchResults, setSearchResults] = React.useState([]);
const handleChange = event => {
setSearchTerm(event.target.value);
};
React.useEffect(() => {
const results = symbols.filter(symbols =>
symbols.toUpperCase().includes(searchTerm)
);
setSearchResults(results);
}, [searchTerm]);
return (
<div className="App">
<h6>Price Alert History</h6>
<Form>
<input id='hey'
type="text"
placeholder="Symbol"
value={searchTerm}
onChange={handleChange}
/>
</Form>
<input
type="number"
placeholder="Price"
value={searchTerm}
onChange={handleChange}
/>
<ul>
{
searchTerm.length > 0 && searchResults.map(item => <li>{item}</li>)
}
</ul>
<Button variant="secondary">Set</Button>
</div>
);
}
export default PriceTriggerField;
编辑1
在接受@Ziarno 回答后,我开始收到此错误。
示例 - 我ADABTC
在第一个字段中输入,当我开始在另一个字段中输入数字时,它会因此错误而中断(如下所示)
当我在两个输入字段中输入值时,我的反应应用程序中断并且我收到此错误
TypeError: searchSymbols.map is not a function
PriceTriggerField
src/Components/PriceTriggerField.jsx:46
43 | value={searchSymbols}
44 | onChange={handleChangeSymbol}
45 | />
> 46 | <ul>
47 | {
48 | searchTerm.length > 0 && searchSymbols.map(item => <li>{item}</li>)
49 | }
解决方案
首先,您需要为 2 个不同的输入提供 2 个不同的状态值
...
const [searchTerm, setSearchTerm] = React.useState("");
const [searchSymbol, setSearchSymbol] = React.useState("");
const handleChangeTerm = event => {
setSearchTerm(event.target.value);
};
const handleChangeSymbol = event => {
setSearchSymbol(event.target.value);
};
return (
<div className="App">
<h6>Price Alert History</h6>
<Form>
<input id='hey'
type="text"
placeholder="Symbol"
value={searchSymbol}
onChange={handleChangeSymbol}
/>
</Form>
<input
type="number"
placeholder="Price"
value={searchTerm}
onChange={handleChangeTerm}
/>
...
其次,您不必对符号使用 setState,只需显示按搜索词过滤的符号即可。删除整个React.useEffect
并执行此操作:
<ul>
{symbols
.filter(symbol => symbol.toUpperCase().includes(searchTerm))
.map(item => <li>{item}</li>)
}
</ul>
推荐阅读
- automation - 如何从网站下载 3000 个文件?
- python - 使用 * 读取 Python 参数时 Docker 容器 Linux 的奇怪行为
- python - python3中正确的文件夹结构
- java - Java中如何获取内存消耗信息
- docker - Azure Web App + Docker + Linux:必须指定服务器错误 Host.DestinationHostUrl
- reactjs - 使用 Yup 进行逗号分隔的电子邮件验证
- reactjs - React hooks 依赖数组与 TypeScript 区分联合
- node.js - 第一次运行我的客户端反应应用程序后如何修复错误?
- dynamics-crm - 在 Power Bi 中获取子帐户的父帐户名称
- c - 如何在 C 中逐行读取输入文本直到 EOF?