react 中onTouchStart 使用useState不触发更新

const [isOnTouch, setIsOnTouch] = useState(false)

const onTouchStart = () => {
    setIsOnTouch(true) // 触摸设为true
    setTimeout(() => {
      console.log(isOnTouch) // false  延迟3s后依然未更新
    }, 3000)
  }
  const onTouchEnd = () => {
    setIsOnTouch(false) // 手指离开设置fasle
    console.log(isOnTouch) // true
    setTimeout(() => {
      console.log(isOnTouch) // true  延迟3s后依然是true
    }, 3000)
  }
<View className="record_btn" onTouchStart={ onTouchStart } onTouchEnd={ onTouchEnd }>录制语音</View>

我想实现的效果就是手指按下,需要有个flag标记为true, 手指离开flag为false,如果直接声明一个变量就可以实现,但是用useState管理就不行了, 想知道是为什么? 我知道useState是异步更新的,但是为什么在OnTouchEnd中还是true

阅读 2.7k
1 个回答

react函数组件,state变化时,整个函数会重新执行,会生成新的执行上下文(变量会重新申明,但是值会使用set后的),定时器中的回调函数是当前执行环境下申明的,所以使用的是当前环境的变量(类似闭包)

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题