react native 功能组件中构造函数的解决方案是啥?

Posted

技术标签:

【中文标题】react native 功能组件中构造函数的解决方案是啥?【英文标题】:What is solution for constructor in functional components in react native?react native 功能组件中构造函数的解决方案是什么? 【发布时间】:2020-11-01 17:51:41 【问题描述】:

让我带你解决我的问题。我正在制作一个计时器功能组件,我将 startValue 传递给组件,然后该组件将使用通过 props 传递的 startValue 启动计时器(以秒为单位减少一秒)。

const FunctionalComponent = (props: any) => 

const [timerValue, setTimerValue] = useState(props.initialValue)

console.log('Set State')

useEffect(() => 
    console.log('UseEffects called')

    setInterval(() => 
        setTimerValue(timerValue - 1)
    , 1000)

, [])

return <View><Text style=styles.textStyle>timerValue</Text></View>

我在 Parent 中的渲染函数。

render() 
    return <View style=styles.mainView>
        <FunctionalComponent  initialValue=30 />
    </View>

现在,每次 react 重新渲染父组件时,FunctionalComponent 都会被调用并重置 timerValue 值。我使用类组件构造函数解决了这个问题,但我想知道在功能组件中是否有任何解决方案。

class OTPTimer extends Component 

    constructor(props: any) 
        super(props)

        this.state = 
            timeLeft: props.fromStart
        

        if (props.startTimer) 

            this.startTimer()

        
    

    componentDidUpdate(prevProps: any) 

        if (!prevProps.startTimer && this.props.startTimer) 
            this.startTimer()
            this.setState(
                timeLeft: this.props.fromStart
            )
        
    

    startTimer = () => 
        var interval = setInterval(() => 

            this.setState(
                timeLeft: this.state.timeLeft - 1
            )

            if (this.state.timeLeft === 0) 
                clearInterval(interval)

            

        , 1000)
    

    render() 
        return <Text style=globalStyles.testStyleThree>`00:$this.state.timeLeft > 9 ? this.state.timeLeft : `0$this.state.timeLeft``</Text>
    



【问题讨论】:

【参考方案1】:

人们建议useEffect,但它会在渲染后被调用。

改用useMemo

useMemo(() => 
  console.log('This is useMemo')
, []);

【讨论】:

【参考方案2】:

这就是使用React.memo 的意义所在,以防止在子组件的道具不更改时重新渲染它们。

React.memo 是一个高阶组件。它类似于 React.PureComponent 但用于函数组件而不是类。

如果你的函数组件在相同的情况下呈现相同的结果 道具,您可以将其包装在对 React.memo 的调用中以提高性能 在某些情况下,通过记忆结果。这意味着 React 将跳过 渲染组件,并重用上次渲染的结果。

    const FunctionalComponent = React.memo<initialValue: number>(initialValue) => 
      const [timerValue, setTimerValue] = useState(initialValue)
    
      console.log('Set State')
    
      useEffect(() => 
          console.log('UseEffects called')
    
          setInterval(() => 
              setTimerValue(timerValue - 1)
          , 1000)
    
      , [])
    
      return <View><Text style=styles.textStyle>timerValue 
 </Text></View>

    ;

【讨论】:

【参考方案3】:

checkout React.memo,如果子组件的 props 没有改变,witch 会阻止子组件重新渲染

const FunctionalComponent = React.memo((props: any) =>  ....  )

【讨论】:

以上是关于react native 功能组件中构造函数的解决方案是啥?的主要内容,如果未能解决你的问题,请参考以下文章

在 react-native 组件中实现 async/await 功能

React Native的生命周期解析

React Native Component不能使用super

为啥组件在状态更改后不重新渲染。在 react-native 函数组件中

如何在 React Native 中使用函数渲染组件

是否有一个函数返回一个承诺,当在 React Native 中应用了对组件的任何未决更改时,该承诺得到解决?