热门搜索词点击后怎么让当前项立刻置顶而不重复?
在做搜索框热门推荐时,用户点击某个词后想让它立刻跳到列表最前面,但用数组splice和unshift操作后,发现点击同一个词会重复添加,导致列表出现多个相同的条目。尝试过先过滤再插入,但动画过渡时会出现位置错乱。
代码是这样的:handleClick = (term) => {
const newTerms = this.state.terms.filter(t => t !== term);
newTerms.unshift(term);
this.setState({ terms: newTerms });
}
但点击多次后列表还是会有重复项,有什么更好的实现方式吗?
最稳妥的做法是确保每次操作都在最新的数据上进行。可以用函数式更新保证拿到的是最新 state,同时用 Set 去重更保险一点。
这样写有几个好处:一是用 prevState 避免闭包问题,二是展开语法比 unshift 更函数式,三是过滤掉目标词后再插入,绝对不会重复。
如果你还想保留动画效果不闪,可以给列表项加上 key,用关键词本身做 key,比如
key={term},这样 React 能正确追踪元素位置,过渡更顺滑。说白了就是别直接操作 this.state.terms,要用 setState 的函数式更新,这样更清晰也更安全。
indexOf找位置再操作:这样能确保点击后只保留一个置顶项,动画也不会乱。