React Hooks,useState:handleSubmit中的条件被忽略

如何解决React Hooks,useState:handleSubmit中的条件被忽略

我有一个函数,该函数从表单获取输入并在Array原型上运行some方法,然后在isInAPI && wasAPICallMade(i'将数据插入到代码段中)本质上是因为我应该在wasAPICallMade状态正在更新时以任何一种方式获取某种东西,但事实并非如此。

我在做什么错了?

indgredients[{
      id: 1,name: 'Hemp Protein'
    },{
      id: 2,name: 'Avocado'
    },{
      id: 3,name: 'Organic Maca'
    },{
      id: 4,name: 'Organic Kale'
    },{
      id: 5,name: 'Organic Coconut Water'
    },{
      id: 6,name: 'Astragalus'
    },{
      id: 7,name: 'Rhodiola'
    },{
      id: 8,name: 'Other Spices'
    },{
      id: 9,name: 'Green Coffee Beans'
    },{
      id: 10,name: 'Organic Peach'
    },{
      id: 11,name: 'Organic Seabuckthorn'
    },{
      id: 12,name: 'Hijiki Seaweed'
    },{
      id: 13,name: 'Organic Turmeric'
    },{
      id: 14,name: 'Organic Ginger'
    },{
      id: 15,name: 'Lime Juice'
    },{
      id: 16,name: 'Bell Pepper'
    },{
      id: 17,name: 'Organic Spinach'
    },{
      id: 18,name: 'Organic Flax Seeds'
    },{
      id: 19,name: 'Organic Goji Berry'
    },{
      id: 20,name: 'Organic Chlorella'
    },{
      id: 21,name: 'Organic Nutmeg'
    },{
      id: 22,name: 'Kale'
    },{
      id: 23,name: 'Tomato2'
    },{
      id: 24,name: 'Organic Cucumber'
    },{
      id: 25,name: 'Tamari'
    },{
      id: 26,name: 'Organic Cacao'
    },{
      id: 27,name: 'Chaga Mushroom'
    },{
      id: 28,name: 'Raw Cashew'
    },{
      id: 29,name: 'Lemon'
    },{
      id: 30,name: 'Organic Cold Brew Coffee'
    },{
      id: 31,name: 'Organic Sweet Cherry'
    },{
      id: 32,name: 'Japanese Matcha Green Tea'
    },{
      id: 33,name: 'Pink Himalayan Sea Salt'
    },{
      id: 34,name: 'Organic Coconut'
    },{
      id: 35,name: 'Watermelon'
    },{
      id: 36,name: 'Organic Wheatgrass'
    },{
      id: 37,name: 'Coconut Milk'
    },{
      id: 38,name: 'Oats'
    },{
      id: 39,name: 'Shiitake + Crimini Mushrooms'
    },{
      id: 40,name: 'Organic Apple'
    },{
      id: 41,name: 'Organic Camu Camu'
    },{
      id: 42,name: 'Organic Zucchini'
    },{
      id: 43,name: 'Organic Pea Protein'
    },{
      id: 44,name: 'Chia Seed'
    },{
      id: 45,name: 'Spinach'
    },{
      id: 46,name: 'Organic Acerola Cherry'
    },{
      id: 47,name: 'Butternut Squash Noodles'
    },{
      id: 48,name: 'Sweet Potato'
    },{
      id: 49,name: 'Galangal'
    },{
      id: 50,name: 'Basil'
    },{
      id: 51,name: 'Organic Raspberry'
    },{
      id: 52,name: 'Black Garlic'
    },{
      id: 53,name: 'Zucchini'
    },{
      id: 54,name: 'Organic Peppermint'
    },{
      id: 55,name: 'Raw Pumpkin Seed'
    },{
      id: 56,name: 'Golden Figs'
    },{
      id: 57,name: 'Papaya'
    },{
      id: 58,name: 'Dulse Seaweed'
    },{
      id: 59,name: 'Garlic'
    },{
      id: 60,name: 'Madras Curry'
    },{
      id: 61,name: 'Cordyceps Mushroom'
    },{
      id: 62,name: 'Tomato'
    },{
      id: 63,name: 'Reishi Mushroom'
    },{
      id: 64,name: 'Cinnamon'
    },{
      id: 65,name: 'Red Miso'
    },{
      id: 66,name: 'Macadamia Nut'
    },{
      id: 67,name: 'Organic Acai Berry'
    },{
      id: 68,name: 'Raw Almond'
    },{
      id: 69,name: 'Chickpea'
    },{
      id: 70,name: 'Organic Mango'
    },{
      id: 71,name: 'Organic Coconut Oil'
    },{
      id: 72,name: 'Organic Pineapple'
    },{
      id: 73,name: 'Organic Celery'
    },{
      id: 74,name: 'Scallion'
    },{
      id: 75,name: 'Organic Vanilla Bean'
    },{
      id: 76,name: 'Ginger'
    },{
      id: 77,name: 'Cauliflower'
    },{
      id: 78,name: 'Raw Walnut'
    },{
      id: 79,name: 'Organic Blueberry'
    },{
      id: 80,name: 'Organic Date'
    },{
      id: 81,name: 'Organic Banana'
    },{
      id: 82,name: 'Rosemary'
    },{
      id: 83,name: 'Vanilla Bean'
    },{
      id: 84,name: 'Ginseng'
    },{
      id: 85,name: 'Organic Strawberry'
    },{
      id: 86,name: 'Carrot'
    },{
      id: 87,name: 'Oregano'
    },{
      id: 88,name: 'Lemon2'
    },{
      id: 89,name: 'Organic Garbanzo Beans'
    },{
      id: 90,name: 'Organic Blackberry'
    },{
      id: 91,name: 'Organic Raw Almond Butter'
    },{
      id: 92,name: 'Pecans'
    },{
      id: 93,name: 'Organic Mulberry'
    },{
      id: 94,name: 'Organic Pepper'
    },{
      id: 95,name: 'Organic Hemp Seed'
    },{
      id: 96,name: 'Organic Pumpkin'
    },{
      id: 97,name: 'Organic Blue Majik'
    },{
      id: 98,name: 'Organic Gluten-Free Oats'
    },{
      id: 99,name: 'Organic Cardamom'
    },{
      id: 100,name: 'Lemon Juice'
    },
import React,{ useState } from 'react'
import Alert from '@material-ui/lab/Alert'

import TextField from '@material-ui/core/TextField'
import Grid from '@material-ui/core/Grid'

import { makeStyles } from '@material-ui/core/styles'

var useStyles = makeStyles((theme) => ({
    root: {
        '& > *': {
            margin: theme.spacing(1),width: '25ch',},submit: {
            color: 'red',}))

var IngredientInput = ({ indgredients,products }) => {
    var [indgredients,setIngredients] = useState(indgredients)
    var [text,setText] = useState('')
    var [isInAPI,setIsInAPI] = useState(false)
    var [wasAPICallMade,setWastAPICallMade] = useState(false)

    function CheckIngredients(input) {
        if (indgredients.some((item) => item.name === input)) {
            setIsInAPI((prevState) => !prevState)
            console.log('isInAPI ',isInAPI)

            setWastAPICallMade((prevState) => !prevState)
            console.log('wasAPICallMade ',wasAPICallMade)
        }
    }

    function handleTextChange(e) {
        console.log('e',e.target.value)
        setText(e.target.value)
    }

    function handleSubmit(e) {
        e.preventDefault()
        CheckIngredients(text)
        setText('')
    }
    
    var classes = useStyles()

    return (
        <>
            <Grid container justify="center">
                <form onSubmit={handleSubmit} className={classes.root}>
                    <TextField
                        value={text}
                        onChange={handleTextChange}
                        id="outlined-basic"
                        label="Outlined"
                        variant="outlined"
                    />
                    <button type="submit" className={classes.submit}>
                        {' '}
                        Check Ingredient{' '}
                    </button>
                </form>
                {wasAPICallMade ? (
                    isInAPI ? (
                        <Alert severity="success">
                            This is a success alert — check it out!
                        </Alert>
                    ) : (
                        <Alert severity="error">
                            This is an error alert — check it out!
                        </Alert>
                    )
                ) : null}
            </Grid>
        </>
    )
}
export default IngredientInput

更新

根据Emile和Lanxion的建议,我尝试了以下操作:

useEffect(() => {
    console.log('isInAPI in useEffect',isInAPI)
    console.log('wasAPICallMade in useEffect',wasAPICallMade)
},[isInAPI,wasAPICallMade]) 

function CheckIngredients(input) {
    setWastAPICallMade(true)
    var found = indgredients.some((item) => item.name === input)

    console.log('found ',found)
    if (found) {
        setIsInAPI(true)
        console.log('isInAPI ',isInAPI)
    }
}

现在有两个关于此更改的问题:

我的理解是正确的,useEffect会在初始渲染时触发并且每次对这些变量进行 更改?如果没有,useEffect将不会触发。

那么在CheckIngredients函数中,setWastAPICallMade(true)被忽略了吗?

还有var found = indgredients.some((item) => item.name === input)为什么没有正确的答案?

function CheckIngredients(input) {
    setWastAPICallMade(true)
    var found = indgredients.some((item) => item.name === input)

    console.log('found ',isInAPI)
    }
}

解决方法

很有可能您的状态正在更新,但是useState挂钩函数是异步的,因此,如果您在下一行中直接记录该状态,则可能不会立即反映出更改。如果要在更改后查看特定状态的值,可以使用带有第二个值的useEffect钩子作为要监视的状态变量。

useEffect(() => {
    console.log('isInAPI ',isInAPI); 
    console.log('wasAPICallMade ',wasAPICallMade)
},[isInAPI,wasAPICallMade])// This is be executed when "isinApi" or "wasAPICallMade" state changes

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 &lt;select id=&quot;xxx&quot;&gt; SELECT di.id, di.name, di.work_type, di.updated... &lt;where&gt; &lt;if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 &lt;property name=&quot;dynamic.classpath&quot; value=&quot;tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-