【发布时间】:2020-02-27 15:57:04
【问题描述】:
我最近开始在 react 中使用钩子,我经常遇到这个问题:我创建了一个由我的所有组件使用的第一个大状态,但是我的组件的一些较小的部分划分了这个状态并创建了自己的状态简单。
例如
import React, { useState } from "react";
const initialFilters = {
name: "",
code: ""
};
function Filter({ value, setFilters }) {
const [tempValue, setTempValue] = useState(value);
return (
<input
value={tempValue}
onChange={e => setTempValue(e.target.value)}
onBlur={() => setFilters(tempValue)}
/>
);
}
function App() {
const [filters, setFilters] = useState(initialFilters);
const agents = [
{ name: "bob", code: "123" },
{ name: "burger", code: "3123" },
{ name: "sponge", code: "34" }
];
return (
<div>
<label>Name filter</label>
<Filter
value={filters.name}
setFilters={value =>
setFilters(filters => ({ ...filters, name: value }))
}
/>
<label>Code filter</label>
<Filter
value={filters.code}
setFilters={value =>
setFilters(filters => ({ ...filters, code: value }))
}
/>
<button onClick={() => setFilters(initialFilters)}>Reset filters</button>
<ul>
{agents
.filter(
agent =>
agent.name.includes(filters.name) &&
agent.code.includes(filters.code)
)
.map((agent, i) => (
<li key={i}>
name: {agent.name} - code: {agent.code}
</li>
))}
</ul>
</div>
);
}
export default App;
CodeSandox 可用here
在此示例中,过滤器工作正常,但当我们使用“重置”按钮时,它们的值并未清空。
过滤器创建自己的状态以仅在模糊时分派新状态,并且仍然受到控制。我想我可以在这里使用 ref,但我使用这个例子来展示一个简单的 state 依赖于另一个 state(因此依赖于 props)的案例。
我应该如何以惯用的 React 方式实现这一点?
【问题讨论】:
标签: javascript reactjs react-hooks