开发者社区> 问答> 正文

每次渲染前如何在UseEffect React Hooks中重置数据?

这是情况。我useEffect过去曾过滤一些数据,但效果很好。这是代码和codesandbox。 const data = [ {name: 'aml', age: 10}, {name: 'abcb', age: 12}, {name: 'asr', age: 20}, {name: 'plo', age: 30}, {name: 'bvcq', age: 15}, {name: 'bfro', age: 21}, {name: 'zxwh', age: 19} ]

function App() { const [keyword, setKeyword] = React.useState('') const [result, setResult] = React.useState(data) const [isAged, setIsAged] = React.useState(false) const [isNameLength3, setIsNameLength3] = React.useState(false) React.useEffect(() => { const doSearch = () => { // setResult(data) if (isAged) { setResult(result.filter(item => item.age >= 20)) } if (isNameLength3) { setResult(result.filter(item => item.name.length === 3)) } if (keyword) { setResult(result.filter(item => item.name.toLowerCase().includes(keyword.toLowerCase()))) } } doSearch() }, [isAged, keyword, isNameLength3, result]) return (

<input value={keyword} type='text' onChange={(e) => setKeyword(e.currentTarget.value)} placeholder='search...' />
<input onChange={() => setIsAged(!isAged)} type='checkbox' checked={isAged} /> Age >= 20 <input onChange={() => setIsNameLength3(!isNameLength3)} type='checkbox' checked={isNameLength3} /> NameLength3
{ result && result.length > 0 && result.map((item, index) => <p key={'result' + index}>{item.name} -> {item.age}

) }
) } 在result当我改变搜索关键字或复选框改变每次。但是没有回头路了。

例如,我选中了两个复选框,结果将是:

asr -> 20

plo -> 30 现在我输入a,结果变为

asr -> 20 问题是,当我删除时a,我想要的结果

asr -> 20

plo -> 30 我知道result被削减了,但是我该如何实现呢?

我认为它应该搜索是否已使用原始数据更改了任何过滤器(复选框和关键字)。

所以我在一开始就尝试了useEffect。

setResult(data) 但不幸的是,它没有按我预期的那样工作。

展开
收起
被纵养的懒猫 2019-09-30 14:57:11 1041 0
0 条回答
写回答
取消 提交回答
问答排行榜
最热
最新

相关电子书

更多
利用编译将 Vue 组件转成 React 组件 立即下载
React Native 全量化实践 立即下载
React在大型后台管理项目中的工程实践 立即下载