reactjs - 在 React 中过滤状态逻辑
问题描述
我想根据输入值过滤我的状态(对象数组),但我很确定我做错了什么并且违反了 React 中的核心概念/规则。它在我输入时过滤我的状态,但是,如果我想回到原始状态(输入值为空),我不能因为我已经改变了数组?我正在尝试将原始状态复制到另一个数组并对其进行处理,但结果是相同的。
根据这个例子过滤状态的正确方法是什么?
const App = () => {
const [persons, setPersons] = useState([
{ name: 'Arto Hellas', number: '040-123456' },
{ name: 'Ada Lovelace', number: '39-44-5323523' },
{ name: 'Mary Poppendieck', number: '39-23-6423122' }
]);
const [name, setName] = useState('');
const handleFilterName = event => {
setName(event.target.value);
if (name !== '') {
const filteredPersons = persons.filter(person =>
person.name.toLowerCase().includes(name.toLowerCase())
);
setPersons(filteredPersons);
}
};
...
return (
<div>
Filter: <input onChange={handleFilterName} value={name} />
</div>
...
解决方案
我可能会这样写:
handleFilterName
只设置名称。- 当您要显示过滤后的列表时(例如在 中
render
),计算filteredPersons
并显示它们。不要更改persons
列表。 - 然后,如果您重设名称,您仍将拥有完整列表。
这是一个工作示例:
function App() {
const persons = [
{ name: "Arto Hellas", number: "040-123456" },
{ name: "Ada Lovelace", number: "39-44-5323523" },
{ name: "Mary Poppendieck", number: "39-23-6423122" }
];
const [name, setName] = useState("");
const handleFilterName = (event: React.ChangeEvent<HTMLInputElement>) => {
setName(event.target.value);
};
const filteredPersons =
name === ""
? persons
: persons.filter(person =>
person.name.toLowerCase().includes(name.toLowerCase())
);
return (
<div>
Filter: <input onChange={handleFilterName} value={name} />
<ul>
{filteredPersons.map(person => (
<li>
{person.name}: {person.number}
</li>
))}
</ul>
</div>
);
}
推荐阅读
- node.js - 当我打开我的应用程序的 url 时,它显示“应用程序错误”。我想我在代码中遗漏了一些东西
- jquery - 选择具有相同名称的所有输入返回 1 个值
- elm - Elm 保存,热重载
- javascript - 如何过滤 Reactjs 的 JSON 输出?
- performance - Clojure comp 不进行尾调用优化(可以创建 StackOverflow 异常)
- spring-cloud-dataflow - 如何修复 Spring Cloud Data Flow Kubernetes 容器就绪探测失败:HTTP 探测失败,状态码:401
- reactjs - 主页与其他页面重叠使用 React Route
- django - 带有电话号码的 URL django
- file - julia1.1.0中如何使用IOBuffer读取文件?
- c++ - 如何在 Sentry 本地版本中创建 CPP 项目