React Native - панель перерисовки React Navigation на goBack ()

Я использую в своем приложении React Navigation. Как я могу обновить данные на моей предыдущей панели, когда вернусь к ней?

Практический пример: я сейчас нахожусь в панели A, я перехожу на панель B, где я обновляю данные в своей базе данных, которые отображаются на панели A . После того, как я goBack () перехожу в панель A после изменения данных в базе данных, я хочу, чтобы панель A была повторно отрисована и содержит новые данные из база данных.

Я читал, что могу передать настраиваемую функцию обновления в качестве параметров дочернему классу и вызвать ее перед возвращением, однако я думаю, что это не лучший способ добиться того, чего я хочу, поскольку я обновляю компонент, который еще не смонтирован, и я может просто выдать ошибку.


person GIV    schedule 23.03.2018    source источник
comment
Вы используете redux? что вы имеете в виду под базой данных? Локальное состояние, сокращение или API, называемое данными?   -  person Revansiddh    schedule 20.04.2018


Ответы (6)


Вот как я добился!

На панели А

refreshFunction()
{
    //your refresh code should be here
}

 <TouchableOpacity onPress={()=>{
   this.props.navigation.navigate('PanelB', {refreshFunction: this.refreshFunction});
 }}>
    Redirect to Panel B
 </TouchableOpacity>

На панели B

const refreshFunction = this.props.navigation.state.params.refreshFunction;
if(typeof refreshFunction === 'function')
{
  refreshFunction();                
  //your back function
  this.goBack();
}
person Jitender Badoni    schedule 20.04.2018
comment
Связанные решения проблемы: github.com/react-navigation/react-navigation/issues / 922 - person steviesh; 12.09.2018
comment
React navigation добавил еще один подход (я думаю, createStackNavigator), который отключает компонент в действии перенаправления. Таким образом, каждый раз, когда компонент рендеринга запускает метод componentDidMount. - person Jitender Badoni; 12.09.2018

React Navigation предоставляет слушателей, который можно использовать для этого точного сценария.

Например, прикрепите прослушиватель к панели A, который будет повторно получать обновленные данные при фокусировке (т. Е. Когда панель A "возвращается"):

componentDidMount() {
  const { fetchDatabaseData, navigation } = this.props
  fetchDatabaseData()
  this.willFocusListener = navigation.addListener(
    'willFocus',
    () => {
      fetchDatabaseData()
    }
  )
}

componentWillUnmount() {
  this.willFocusListener.remove()
}
person Bataleon    schedule 04.10.2018
comment
А в версии 5 Navigation я использовал focus вместо willFocus. Это сработало. - person BertC; 08.11.2020

После стольких поисков вывод: да, вы можете:

render(){
...
   <NavigationEvents
      onWillFocus={() => {
      //Call whatever logic or dispatch redux actions and update the screen!
      }}
   />
...
}

Источник: https://github.com/react-navigation/react-navigation/issues/1171

person Duverney    schedule 02.06.2019

При использовании redux + firebase у меня возникла проблема, когда наблюдаемые данные из firebase.on('value', snapshot => { dispatch(data) }, которые были mappedToProps, обновляли хранилище redux при сохранении до того, как компонент, который перечислял эти данные, возвращался в представление onBack(), поэтому повторная визуализация не запускалась в списке. Я решил это, сравнив прошлые и текущие реквизиты и повторно запустив firebase.on fn только тогда, когда реквизиты не совпадают. Это лучше, чем всегда срабатывать при переходе к компоненту списка, но я бы предпочел решение, которое принудительно запускает повторный рендеринг без вызова firebase fn вообще.

  componentDidUpdate(prevProps) {
    if (prevProps.data !== this.props.data) this.props.fetchdata();
  }
person Andrew    schedule 06.08.2019

В соответствии с документами для событий навигации согласно навигации

function Profile({ navigation }) {
  React.useEffect(() => {
    const unsubscribe = navigation.addListener('focus', () => {
      // do something
    });

    return unsubscribe;
  }, [navigation]);

  return <ProfileContent />;
}
person Mohamed Daher    schedule 20.02.2021

Если у вас есть такие сценарии, как этот, вы можете использовать redux, которое поможет вам управлять данными на вкладках / экране и в компоненте, потому что сокращение связано с хранилищем, в хранилище redux все состояние приложения удалось.

person RANVIR GORAI    schedule 21.04.2018
comment
Использование redux не является решением поставленной проблемы. - person steviesh; 12.09.2018