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 组件。
这是我的 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 组件。