React-native/react-navigation: how do I access a component's state from `static navigationOptions`?

前端 未结 4 1353
野趣味
野趣味 2020-12-15 07:11

How do you handle cases when you have, say, a form component, and you need to submit a part of the component\'s state using button in navigation bar?



        
相关标签:
4条回答
  • 2020-12-15 07:33

    On your componentDidMount, you can use

    this.navigation.setParams({
     myTitle: this.props.myTitle
    })
    

    Then, pass a function to your header on static props. This function has access to the params you set before

    Thanks to rafaelcorreiapoli

    0 讨论(0)
  • 2020-12-15 07:34

    You are getting this error because you are using props and state before declaring constructor() . As in constructor we first call super(props) so that we can use props in our component. Please do the following to get desired result.

    constructor(props) {
        super(props);
        this.state = {
          formText: ''
        };
    
      static navigationOptions = {
        header: (props) => ({
          tintColor: 'white',
          style: {
            backgroundColor: cs.primaryColor
          },
          left: navBtn('clear', () => props.goBack()),
          right: navBtn('done', () => this.submitForm()), // error: this.submitForm is not a function
        }),
        title: 'Form',
      }
      }
    

    Cheers:)

    0 讨论(0)
  • 2020-12-15 07:36

    Send a binded function with setParams, then you will have access to component's state within that function.

    Example:

    constructor(props) {
        super(props);
        this._handleButtonNext = this._handleButtonNext.bind(this);
        this.state = { selectedIndex: 0 }
    }
    
    componentDidMount() {
        this.props.navigation.setParams({
            handleButtonNext: this._handleButtonNext,
        });
    }
    
    _handleButtonNext() {
        let action = NavigationActions.setParams({
            params: { selectedImage: images[this.state.selectedIndex] }
        });
        this.props.navigation.dispatch(action);
    }
    

    Now you can have a button handler related to component's state.

    static navigationOptions = ({ navigation }) => {
        const { state, setParams, navigate } = navigation;
        const params = state.params || {};
    
        return {
            headerTitleStyle: { alignSelf: 'center' },
            title: 'Select An Icon',
            headerRight: <Button title='Next' onPress={params.handleButtonNext} />
        }
    }
    
    0 讨论(0)
  • 2020-12-15 07:50

    Simple Design Pattern

    Just as a follow-up to @val's excellent answer, here's how I structured my Component so that all the params are set in the componentWillMount. I find this keeps it simpler and is an easy pattern to follow for all other screens.

    static navigationOptions = ({navigation, screenProps}) => {
      const params = navigation.state.params || {};
    
      return {
        title:       params.title,
        headerLeft:  params.headerLeft,
        headerRight: params.headerRight,
      }
    }
    
    _setNavigationParams() {
      let title       = 'Form';
      let headerLeft  = <Button onPress={this._clearForm.bind(this)} />;
      let headerRight = <Button onPress={this._submitForm.bind(this)} />;
    
      this.props.navigation.setParams({ 
        title,
        headerLeft,
        headerRight, 
      });
    }
    
    componentWillMount() {
      this._setNavigationParams();
    }
    
    _clearForm() {
      // Clear form code...
    }
    
    _submitForm() {
      // Submit form code...
    }
    
    0 讨论(0)
提交回复
热议问题