В моем приложении React Native я пытаюсь изменить состояние и запустить повторную визуализацию компонента.Это должно быть сделано, когда NavBottom
вызывает this.props.navigation.navigate('captureView')
, чтобы перейти к CaptureView
.Обновление состояния должно сбросить переменную состояния фотографии CaptureView
обратно к исходному значению.
Как можно изменить состояние в React Native с помощью react-navigation
on navigate
?https://reactnavigation.org/docs/en/navigation-actions.html
CaptureView
является частью CaptureStack
import { createStackNavigator } from "react-navigation";
const CaptureStack = createStackNavigator({
captureView: CaptureView,
detailView: DetailView,
reportView: ReportView,
});
const Tab = createBottomTabNavigator({
capture: CaptureStack,
}, {
initialRouteName: 'capture',
tabBarComponent: NavBottom
});
CaptureView.js
:
import { StackActions, NavigationActions, NavigationEvents } from 'react-navigation';
class CaptureView extends Component {
static navigationOptions = {}
constructor(props) {
super(props);
console.log("CaptureView: constructor(props)");
}
componentDidMount() { // called just once
console.log("CaptureView: componentDidMount()");
// this.setState = { // undefined???
// photo: null // this needs to be RESET
// };
}
componentWillUnmount() {
console.log("CaptureView: componentWillUnmount()");
}
async onButtonPress() {
CameraService.takePicture().then((photo)=>{
this.setState({
photo: photo
});
// More actions
this.props.navigation.navigate(
"detailView",
{
id: 'DetailView',
photo
}
);
});
}
render() {
return (
<Camera
cameraSetter={(cam) => {
CameraService.setCamera(cam)
}}
photo={this.state.photo}
/>
<TouchableOpacity onPress={this.onButtonPress.bind(this)}>
<Text>TAKE PHOTO</Text>
</TouchableOpacity>
);
}
}
Затем в другой части приложения естькнопка для возврата к CaptureView.
NavBottom.js
:
export default class NavBottom extends Component {
constructor(props) {
super(props);
}
render() {
return (
<View>
<TouchableOpacity onPress={() => this.props.navigation.navigate('captureView')}>
<Text>CAMERA</Text>
</TouchableOpacity>
</View >);
}
}
Примечания
Я пробовал другие способы из документации ReactJS (не React Native), которая завершилась неудачно:
- https://reactjs.org/docs/react-component.html#componentdidmount -
componentDidMount()
кажется рекомендуемым способом в документации, но в моем приложении он называется ТОЛЬКО ОДИН РАЗ? - Даже когда
componentDidMount()
вызывается один раз в начале, но даже тогда this.setState()
не определено.Странно, в документации написано, что она должна быть доступна