setState() 在两个 setState() 运行 时阻塞 UI

setState() block the UI when two setState() run

这是我的 componentDidMount() 方法:

componentDidMount() {
    const subscription = accelerometer.subscribe(({ x, y, z, timestamp }) => {
        x = Math.trunc(x*100);
        this.setState({x})
    });
}

在上面的方法中,状态每100毫秒变化一次。我在 render() 方法中使用了该状态,如下所示:

render() {
    const animatedImageStyle = StyleSheet.flatten([
      styles.captureButton,
      {
        transform: [{rotateZ:this.state.x + 'deg'}]
      }
    ])

    return (
      <SideMenu 
        menu={leftMenu}
        isOpen={this.state.isOpenLeftMenu}
        menuPosition={'left'}
        bounceBackOnOverdraw={false}
        onChange={(isOpenLeftMenu) => this.updateLeftMenuState(isOpenLeftMenu)}
      >
        <View>
            <TouchableOpacity 
                activeOpacity={0.5}
                onPress={(this.state.recordingMode == 'camera')?() => this.takePicture():() => this.toggleRecording()}
              > 
                <Image 
                  source={require('../assets/imgs/forRotate.png')}
                  style={animatedImageStyle}
                />
            </TouchableOpacity>
        </View>
      </SideMenu>
    )
}

现在,问题是当我试图打开侧边菜单时,它没有打开,我的意思是打开但挂得太久了。我的整个应用挂得太多了。

我认为这是因为以下方法:

updateLeftMenuState(isMenuOpen) {
    this.setState({
      isOpenLeftMenu:isMenuOpen
    })
}

请注意,我正在更新另一个名为 isOpenLeftMenu 的状态,它可能在我更新状态 x 期间被阻止。

谁能告诉我这里哪里出了问题?

您可以将动画视图与订阅逻辑一起移动到单独的组件中。因此该组件的状态更新不会影响 SideMenu 组件。