【问题标题】:the usestate hook is not working in reactusestate 钩子在反应中不起作用
【发布时间】:2021-04-10 02:20:14
【问题描述】:

大家好,这就是我的代码的样子

export default function Billing() {
    const classes = useStyles();
    const [balance, setBalance] = useState('0.00');
    const [upcoming, setUpcoming] = useState('0.00');
    const [lastmonth, setLastmonth] = useState('0.00');
    const [header, setHeader] = useState('Please Enter The Amount');
    const [open, setOpen] = useState(false);
    const [amountstate, setAmountstate] = useState(false);
    
    const [amounthelper, setAmounthelper] = useState('');
    const [sairam, setSairam] = useState(0);
    const onchange = async (e) => {
        console.log(sairam) 
        setSairam({amount: e.target.value})
    }
    const [modalchild, setModalchild] = useState(<>
    <form noValidate autoComplete="off">
       <TextField
            error={amountstate}
            type="number"
            value={sairam}
            onChange={onchange}
            label='Please enter the amount'
            helperText={amounthelper}
            variant="outlined"
        />
        <br />
        <br />
        <Button variant="contained" color="primary" onClick={() => addBalance()}>Add Balance</Button>
    </form>
    </>);
    const [country, setCountry] = useState(false);
    const [currency, setCurrency] = useState('');

 const addBalance = () => {
        console.log("Clicked :)")
        console.log(sairam) // outputs the inital value not the changed value

});
    return(<>
    <div className="balance-container">
        <div className="columns-top">
            <div className="column-top">
            <h1>${upcoming}</h1>
            </div>
            <div className="column-top">
            <h1>${balance}</h1>
            <Button variant="contained" color="primary" onClick={handleOpen}>Add Balance</Button>
            </div> 
            <div className="column-top">
            <h1>${lastmonth}</h1>
            </div>

        </div>
    </div>

    <Modal
        aria-labelledby="transition-modal-title"
        aria-describedby="transition-modal-description"
        className={classes.modal}
        open={open}
        onClose={handleClose}
        closeAfterTransition
        BackdropComponent={Backdrop}
        BackdropProps={{
          timeout: 500,
        }}
      >
        <Fade in={open}>
          <div className={classes.paper}>
            <h2 id="transition-modal-title">{header}</h2>
            
            {modalchild}
          </div>
        </Fade>
      </Modal>
     </>
    )
}

如果我通过使用函数 setSairam() 更改状态 sairam,则状态不会更新,并且它仅记录初始状态 0 我什至尝试过 loggint 我输入的事件值它工作正常但状态一个人不会改变请帮助我随时给我任何其他选择

【问题讨论】:

    标签: javascript node.js json reactjs


    【解决方案1】:

    setSairam() 是异步方法,因此您无法在setSairam() 之后立即获取sairam 的更新值。

    const onchange = async (e) => {
        setSairam({amount: e.target.value})
        console.log(sairam) // This will console old value of sairam
    }
    

    您应该使用 useEffect 并添加 sairam 依赖项来检查更新的状态值。

    useEffect(() => {
       console.log(sairam) 
    }, [sairam]);
    

    重要

    sairam 将是 TextField 的值,因此您应该将 sairam 更新为字符串值,而不是对象。

    setSairam(e.target.value)
    

    【讨论】:

    • 好吧,我试图在一段时间后获得价值,但我得到了初始值
    • 在您上面的代码库中,您正试图立即在 onChange 中获取值
    • 很抱歉我忘记添加另一段代码让我先添加它
    • 请检查我试图获取值并获取初始值的函数 addBalance()
    • 我认为它应该可以工作,但是您能否使用我的答案中写的 useEffect 检查是否可以看到 sairam 的更新值?
    【解决方案2】:

    您不会在 onChange 函数中获得更新的值,因为该函数不知道状态何时更改。

    使用 useCallback 获取 sairam 的更新值。在依赖数组中传递sairam

    const onchange = useCallback(async (e) => {
            console.log(sairam) 
            setSairam({amount: e.target.value})
        },[sairam]);
    

    或使用prevState

       setSairam(prevState => {
         console.log(sairam) 
        return ({amount: e.target.value})
      });
    

    另一种选择是将sairam 传递给onChange 函数。但我不确定它是如何工作的,因为您的标记存储在状态中

    onChange={(e)=>onchange(e, sairam)}
    
    
    const onchange = async (e, sairam) => {
            console.log(sairam) 
            setSairam({amount: e.target.value})
        }
    

    【讨论】:

    • 我会选择第三个选项,但即使在我尝试获取显示为 0 的状态时单击按钮后稍后使用 setSairam 函数
    • 这可能会发生,因为您没有更新 modalchild。你能用useCallback试试第一种方法吗?或者直接在return 中提供您存储在modalChild 中的标记。有什么理由在状态中存储标记?
    • 是的,将标记存储在状态中的原因是,在我得到用户的输入后,我会将状态更改为不同的标记
    • 最好不要保持标记状态,使用conditional rendering作为回报。检查这个What Shouldn’t Go in State?
    • 感谢您的建议!伙计,我肯定会实施它
    猜你喜欢
    • 1970-01-01
    • 2021-10-16
    • 1970-01-01
    • 1970-01-01
    • 2020-09-24
    • 2021-09-06
    • 1970-01-01
    • 1970-01-01
    • 2019-09-15
    相关资源
    最近更新 更多