React useState状态更新问题:如何在函数内将状态设为非空值?
解决React useState状态更新不生效的问题
你的问题出在两个关键错误上,直接修正这两点就能解决:
1. 状态判断用错了变量
在updateEthers函数里,你写的if (setReg == null)完全错误——setReg是React生成的状态更新函数,永远不会是null。你需要判断的是状态变量Reg,也就是改成if (Reg == null)。
2. 用React官方的状态更新函数修改状态
在setRegister里,你声明局部变量let setReg=1根本不会触发React的状态更新,必须调用React提供的setReg函数来修改状态,也就是执行setReg(1)。
修正后的完整代码
// useState 声明 const [Reg, setReg] = useState(null) // 更新合约的函数 const updateEthers = () => { let tempProvider = new ethers.providers.Web3Provider(window.ethereum); setProvider(tempProvider); let tempSigner = tempProvider.getSigner(); setSigner(tempSigner); // 这里判断状态变量 Reg,而非更新函数 setReg if (Reg == null) { let tempContract = new ethers.Contract( phonecontractAddress, Register_abi, tempSigner) setContract(tempContract) } else { let tempContract = new ethers.Contract( codecontractAddress, Code_abi, tempSigner) setContract(tempContract) } } // 按钮点击触发的函数 const setRegister = async (event) => { event.preventDefault(); const Hash = await ipfsbcupload(event.target.setText.value); console.log("sending " + event.target.setText.value + " to the contract"); contract.set(Hash); setPhoneNum(event.target.setText.value) // 调用状态更新函数修改 Reg 的值 setReg(1) }
额外优化(可选)
如果需要在Reg状态更新后自动执行updateEthers切换合约,可以把updateEthers放到useEffect里监听Reg的变化:
useEffect(() => { updateEthers() }, [Reg])
这样每次Reg的值改变时,组件会自动重新执行updateEthers逻辑。
内容的提问来源于stack exchange,提问作者lewigi1234
相关产品推荐
相关产品推荐

