В моем приложении React Native я пытаюсь изменить состояние и запустить повторный рендеринг компонента. Это должно быть сделано, когда NavBottom
вызывает this.props.navigation.navigate('captureView')
для перехода к CaptureView
. Обновление состояния должно сбросить переменную состояния CaptureView
фото обратно в исходное значение.
Как можно изменить состояние в React Native с react-navigation
на 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()
не определено. Странно, в документации написано, что он должен быть доступен