Как обновить начальные параметры в React Navigation?

#javascript #reactjs #react-native #react-navigation

#javascript #reactjs #react-native #react-навигация

Вопрос:

У меня есть приложение, в котором массив извлекается из хранилища и передается на экран

Вот голая версия. Здесь, если GetItem задерживается, после рендеринга экранный массив обновляется автоматически

 import React from 'react';
import AsyncStorage from '@react-native-async-storage/async-storage'

import Vocabulary from "./Screens/Vocabulary";

export default function App() {
  const [ vocabulary, setVocabulary] = React.useState([]);

  React.useEffect(() => {
    AsyncStorage.getItem('@vocabulary').then(value => setVocabulary(value !=null ? JSON.parse(value) : []) )
  }, []);
    
  return (
    <VocabularyWithEdit vocabulary={vocabulary} />
  );
}
 

Затем я попытался использовать React Navigation и установить массив в initialParams

 import React from 'react';
import AsyncStorage from '@react-native-async-storage/async-storage'
import { NavigationContainer } from '@react-navigation/native'
import { createStackNavigator } from '@react-navigation/stack'

import Vocabulary from "./Screens/Vocabulary"

export default function App() {
  const [ vocabulary, setVocabulary] = React.useState([]);

  React.useEffect(() => {
    AsyncStorage.getItem('@vocabulary').then(value => setVocabulary(value !=null ? JSON.parse(value) : []) )
  }, []);
  const Stack = createStackNavigator()
    
  return (
    <NavigationContainer>
      <Stack.Navigator>
        <Stack.Screen name="Vocabulary" component={Vocabulary} initialParams={{ vocabulary: vocabulary, str: "hey" }}/>
      </Stack.Navigator>
    </NavigationContainer>
  );
}
 

Но там массив не был обновлен после рендеринга и установлен как [] или когда-то я не определил

Пожалуйста, дайте мне знать, как это исправить и обновить параметры

Ответ №1:

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

Ответ №2:

Для тех, кто сталкивается с этой проблемой, вы можете использовать children вместо component для передачи реквизитов Screen . Таким образом, когда состояние обновляется в App , обновленные значения будут переданы в Screen .

Например, вместо:

 <Stack.Screen name="Vocabulary" component={Vocabulary} initialParams={{ vocabulary: vocabulary, str: "hey" }}/>
 

используйте это:

 <Stack.Screen name="Vocabulary" children={() => <Vocabulary vocabulary={vocabulary} str="hey" />} />
 

Документы здесь.