请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

正在回答 回答被采纳积分+3

3回答

提问者 qq_沧海桑田_2 2021-05-29 13:01:33

https://img1.sycdn.imooc.com//szimg/60b1ca5809cf246b18881190.jpg那老师,如何达成这种效果呢,当tagId和param的值相同 引用不同,useEffect里面的东西不打印呢

const [tagId, setTagId] = useState([4, 5]);

const [params, setParams] = useState({ name: "javk" });


const handleClick = () => {

const diffId = [];

[4, 5].forEach((element) => {

if (tagId.includes(element)) {

diffId.push(element);

}

});

setTagId(diffId);

setParams({ name: "javk" });

};


useEffect(() => {

console.log("params changed");

}, [params]);

useEffect(() => {

console.log("tagId changed");

}, [tagId]);


0 回复 有任何疑惑可以回复我~
  • Nolan #1
    只要tagId和params是useState定义的状态,只要你改变它们的引用useEffect就一定会被调用,这个没办法;如果你不需要useEffect被调用,就说明它们不适合用useState来初始化,用useRef比较适合
    回复 有任何疑惑可以回复我~ 2021-05-31 12:21:31
  • 提问者 qq_沧海桑田_2 回复 Nolan #2
    3q,谢谢老师
    回复 有任何疑惑可以回复我~ 2021-05-31 20:00:16
Nolan 2021-05-28 22:32:42

要尽量避免,但是实际情况中不可能完全避免,很多情况下需要用useMemo来控制

0 回复 有任何疑惑可以回复我~
  • 提问者 qq_沧海桑田_2 #1
    那这个demo应该怎么修改一下才能让diffId和tagId相同的时候,不再打印tagId changed
    回复 有任何疑惑可以回复我~ 2021-05-28 23:37:48
提问者 qq_沧海桑田_2 2021-05-28 21:56:04

https://img1.sycdn.imooc.com//szimg/60b0f576095e8b1321181388.jpg

老师,我业务中有这样一段逻辑 就是点击事件处理之后是个[4,5]的数组 ,这个时候会去循环和tagId里面的id做比较,然后把新的id数组给 tagId 有一种情况是 处理之后 diffId和tagId是相同的,但是 tagId change 还是会执行一次,我的预期是不执行,因为id数组是相同的, 怎么处理呢,是哪里有问题嘛 ,

0 回复 有任何疑惑可以回复我~
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信