为了账号安全,请及时绑定邮箱和手机立即绑定

For 循环仅适用于带有 React 钩子的第二个循环

For 循环仅适用于带有 React 钩子的第二个循环

慕桂英546537 2021-09-30 17:05:14
我有一个项目要添加标签,类似于这个站点。我想首先检查用户是否已经选择了标签。我有一个 for 循环来查看添加的标签是否等于已经存在的标签。如果我制作一个名为 Jack 的标签,它会工作得很好。如果我创建另一个名为 Jack 的标签,现在我有两个 Jacks(不好)。在第三次尝试时,它不会添加另一个 Jack(很好。)这是我的相关代码。我也添加了控制台。我的 useState setTagAlreadyThere on 被忽略,直到第三次尝试,当它应该在第二次尝试时变为 true。我在这里做错了什么?const [tagsFound, setTagsFound] = useState([])const [tagsAdded, setTagsAdded] = useState([])    const [tagAlreadyThere, setTagAlreadyThere] = useState(false)const gatherTags = (tags) => {    setTagAlreadyThere(false)    console.log(tagAlreadyThere)    if (tagsAdded.length === 0) {        setTagsAdded([...tagsAdded, tags]);    } else {        console.log(tagsAdded)        for (let i = 0; i < tagsAdded.length; i++) {            console.log(tagsAdded[i])            if (tags === tagsAdded[i]) {                console.log(tagsAdded[i])                console.log(tags)                setTagAlreadyThere(true)                console.log(tagAlreadyThere)            }        }        console.log(tagAlreadyThere)        if (tagAlreadyThere === false) {            setTagsAdded([...tagsAdded, tags]);            console.log(tagsAdded)        } else {            return        }    }    setPostTag('')}安慰。TagAdder.tsx:9 jackpostarticle.tsx:64 falsepostarticle.tsx:69 ["jack"]postarticle.tsx:72 jackpostarticle.tsx:75 jackpostarticle.tsx:76 jackpostarticle.tsx:78 falsepostarticle.tsx:81 falsepostarticle.tsx:84 ["jack"]post.tsx:6 {}postarticle.tsx:92 (2) ["jack", "jack"]post.tsx:6 {}postarticle.tsx:92
查看完整描述

2 回答

?
慕森王

TA贡献1777条经验 获得超3个赞

无意冒犯,但你的代码有很多不必要的东西。


那么为什么会这样。因为你tagAlreadyThere还没有更新。你正在检查它是否有价值。


const gatherTags = (tags) => {

    if (!tagsAdded.inlcudes(tags)) {

      setTagsAdded([...tagsAdded, tags]);

      setPostTag('')

    }

}


不需要 const [tagAlreadyThere, setTagAlreadyThere] = useState(false)


查看完整回答
反对 回复 2021-09-30
?
Smart猫小萌

TA贡献1911条经验 获得超7个赞

我会告诉你为什么这段代码会导致很多问题,没有冒犯的意思。

首先是你在循环中同步调用一个钩子,因为React.useState钩子是异步的,就像基于类的this.setState一样,它批量更新以获得性能。

我在代码沙盒上有一个例子:调用钩子同步和异步

其次,如果您的新状态是从先前状态计算出来的,请使用回调样式,因为您可以访问更新后的先前状态,例如:

setTagsAdded(prevTagsAdded => [...prevTagsAdded, tags])

您可以在此处查看文档:功能更新

希望这可以帮助!


查看完整回答
反对 回复 2021-09-30
  • 2 回答
  • 0 关注
  • 185 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信