Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to override navigation options in functional component?

To override navigation options using class components, it would be something like

export default class SomeClass extends Component {

    static navigationOptions = ({ navigation }) => {
        return {
            title: navigation.getParam('headerTitle'),
        }
    }

    componentDidMount() {
        this.props.navigation.setParams({ headerTitle: someVariableThatComesFromExternalCall })
    }

    ...
}

But how can I do this using functional component??

export default function SomeFunctionalCompoenent({ navigation }) {

    // How and Where do I change the header title ?

    useEffect(() => { navigation.setParams({ headerTitle: someVariableThatComesFromExternalCall })})
    return (
        ...
    )
}
like image 912
Vencovsky Avatar asked Apr 03 '19 22:04

Vencovsky


1 Answers

I've got a suspicion the accepted answer isn't for the currently latest version of react navigation (5), and it definitely doesn't work for this version, so here's a working example for @react-navigation/native v5.7.2 :

export default function SomeFunctionalComponent({ navigation }) {
  useLayoutEffect(() => { 
    navigation.setOptions({ 
      headerTitle: 'some other title',
    }) 
  }, [])
}

I've used this to access react context - to get the user's name and avatar so I can set a nice title bar for them. I've pasted in the code for this in case it helps anyone:

import React, { useContext, useLayoutEffect } from 'react';
import UserContext from '../context/UserContext';

const HomeScreen = ({ navigation }) => {

  const userContext = useContext(UserContext);

  useLayoutEffect(() => {
    navigation.setOptions({
      title : userContext.name,
      headerLeft : () => (
        <TouchableOpacity
          onPress={() => {
            navigation.openDrawer();
          }}
        >
          <FastImage
            style={styles.userPhoto}
            resizeMode={FastImage.resizeMode.cover}
            source={{ uri: userContext.avatar }}
          />
        </TouchableOpacity>
      ),
    });
  }, [ userContext ]);

  return (
    // etc
  );
}
like image 113
Andy Lorenz Avatar answered Sep 28 '22 04:09

Andy Lorenz