Javascript 为什么useState也会导致使用默认值重新执行组件

Javascript 为什么useState也会导致使用默认值重新执行组件,javascript,reactjs,react-native,Javascript,Reactjs,React Native,我是一个新的反应本土发展。我想了解useState是如何工作的 import React from 'react' import { View, Text } from 'react-native' import Styles from './AdsStyle' import { useContextSelector } from 'use-context-selector' import { StateContext } from './State' import { useState } f

我是一个新的反应本土发展。我想了解useState是如何工作的

import React from 'react'
import { View, Text } from 'react-native'
import Styles from './AdsStyle'
import { useContextSelector } from 'use-context-selector'
import { StateContext } from './State'
import { useState } from 'react'
import { useRef } from 'react'
import moment from 'moment'
import { useEffect } from 'react'
//To-do: Ads cx countdown timer.
const CountDownTimer = () => {
  const myState = useContextSelector(StateContext, (state) => state.myState)
  const timerRef = useRef(null)
  const [timer, setTime] = useState(myState == null ? 0: myState.endTime)

  if(myState === null){
    clearInterval(timerRef.current)
    return null
  }
  useEffect(()=>{
    updateTimer()
    return () => {
      clearTimeout(timerRef.current)
    } 
  })

  let remainingTime 
  const updateTimer = ()=>{
    timerRef.current = setInterval(()=>{
      remainingTime = timer - 1000
      if(remainingTime <0){
        clearInterval(timerRef.current)
        remainingTime = 0
      }
      setTime(remainingTime)
    },1000)
  }

  const renderCountDownTimer = () => {
    return (
      <View>
       <Text>{moment(timer).format('mm:ss')} </Text>
      </View>
    )}
    return renderCountDownTimer() 
}

export default React.memo(CountDownTimer, () => true) 
从“React”导入React
从“react native”导入{View,Text}
从“./AdsStyle”导入样式
从“使用上下文选择器”导入{useContextSelector}
从“./State”导入{StateContext}
从“react”导入{useState}
从“react”导入{useRef}
从“时刻”导入时刻
从“react”导入{useEffect}
//要做的事情:Ads cx倒计时。
常量倒计时=()=>{
const myState=useContextSelector(StateContext,(state)=>state.myState)
常量timerRef=useRef(空)
const[timer,setTime]=useState(myState==null?0:myState.endTime)
if(myState==null){
clearInterval(timerRef.current)
返回空
}
useffect(()=>{
updateTimer()
return()=>{
clearTimeout(timerRef.current)
} 
})
让我们留下时间
常量更新项=()=>{
timerRef.current=setInterval(()=>{
剩余时间=计时器-1000
如果(剩余时间){
返回(
{时刻(计时器).format('mm:ss')}
)}
返回renderCountDownTimer()
}
导出默认的React.memo(倒计时,()=>true)
我只是在建立倒计时。现在我面临两个问题

  • 当控件转到
    const[timer,setTime]=useState(myState==null?0:myState.endTime)
    时,它只需转到第一行再次重新执行组件。如果在useState中有硬编码的值,一切都可以正常工作
  • 如果我将代码
    const[timer,setTime]=useState(myState==null?0:myState.endTime)
    移动到

    if(myState==null){ clearInterval(timerRef.current) 返回空 }

  • 然后react失败,出现一个错误,
    渲染的钩子比上一次渲染的钩子多

    有人能解释一下这两种情况吗


    提前感谢

    您没有遵守挂钩规则您没有遵守挂钩规则