У меня есть базовая настройка MobX в React Native, но мой компонент не рендерится после обновления наблюдаемой, и я не могу понять, почему.
реакция-нативная 0,56.1 ;реагировать 16.4.1 ;mobx 4.5.0 ;mobx-реаги 5.2.8
Магазин
class AppStore {
drawer = false;
toggleDrawer = () => {
this.drawer = !this.drawer;
}
}
decorate(AppStore, {
drawer: observable,
toggleDrawer: action
});
const app = new AppStore();
export default app;
Компонент
class _AppLayout extends React.Component {
constructor(props) {
super(props);
this.state = {
drawerAnimation: new Animated.Value(0)
};
}
UNSAFE_componentWillReceiveProps(nextProps) {
console.log('will not get called');
if (this.props.app.drawer !== nextProps.app.drawer) {
Animated.timing(this.state.drawerAnimation, {
toValue: nextProps.app.drawer === true ? 1 : 0,
duration: 500
}).start();
}
}
render() {
console.log("will only be called on first render");
const translateX = this.state.drawerAnimation.interpolate({
inputRange: [0, 1],
outputRange: [0, -(width - 50)]
});
return (
<Animated.View style={[styles.app, { transform: [{ translateX }] }]}>
<View style={styles.appContent}>
<RouterSwitch />
</View>
<View style={styles.appDrawer} />
</Animated.View>
);
}
}
const AppLayout = inject("app")(observer(_AppLayout));
Триггер (из другого компонента)
<TouchableOpacity
onPress={() => {
app.toggleDrawer();
// will reflect the new value
console.log(app.drawer)
}}
style={styles.toggle}
/>
РЕДАКТИРОВАТЬ: После некоторого исследования не было сгенерировано повторного рендеринга, потому что я не использовал хранилище в методе render()
, только в componentWillReceiveProps
,Мне это кажется странным?
Когда я использую хранилище в рендере, даже просто присваивая переменную, он начинает работать:
const x = this.props.app.drawer === false ? "false" : "true";