You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 08:54:25