В React Native, чтобы вызвать функцию из другого экрана, мы можем использовать различные подходы в зависимости от того, как мы организовываем навигацию в нашем приложении.
1. Если мы используем библиотеку React Navigation, то мы можем воспользоваться функцией navigation.navigate()
для навигации между экранами и передавать параметры через объект params
. В этом случае, мы можем передать функцию из одного экрана в другой при переходе.
В примере ниже мы передаем функцию myFunction
из экрана ScreenA
в экран ScreenB
:
// ScreenA.js import React from 'react'; import { Button } from 'react-native'; const ScreenA = ({ navigation }) => { const myFunction = () => { console.log('Function called'); }; return ( <Button title="Go to Screen B" onPress={() => navigation.navigate('ScreenB', { myFunction })} /> ); }; export default ScreenA;
// ScreenB.js import React, { useEffect } from 'react'; const ScreenB = ({ navigation, route }) => { const { myFunction } = route.params; useEffect(() => { myFunction(); }, []); return ( // ... ); }; export default ScreenB;
2. Если мы используем библиотеку React Navigation и Redux, то можно использовать Redux для передачи функции из одного экрана в другой. Для этого мы можем сохранить функцию в Redux-хранилище и затем получить ее из другого экрана.
В примере ниже мы используем Redux для передачи функции myFunction
из экрана ScreenA
в экран ScreenB
:
// actions.js export const setFunction = (func) => ({ type: 'SET_FUNCTION', payload: func, });
// reducer.js const initialState = { myFunction: null, }; const reducer = (state = initialState, action) => { switch (action.type) { case 'SET_FUNCTION': return { ...state, myFunction: action.payload, }; default: return state; } }; export default reducer;
// ScreenA.js import React from 'react'; import { Button } from 'react-native'; import { useDispatch } from 'react-redux'; import { setFunction } from './actions'; const ScreenA = () => { const dispatch = useDispatch(); const myFunction = () => { console.log('Function called'); }; const goToScreenB = () => { dispatch(setFunction(myFunction)); navigation.navigate('ScreenB'); }; return ( <Button title="Go to Screen B" onPress={goToScreenB} /> ); }; export default ScreenA;
// ScreenB.js import React, { useEffect } from 'react'; import { useSelector } from 'react-redux'; const ScreenB = () => { const myFunction = useSelector((state) => state.myFunction); useEffect(() => { myFunction(); }, []); return ( // ... ); }; export default ScreenB;
3. Если мы используем библиотеку React Navigation и Context API, то мы можем использовать контекст для передачи функции из одного экрана в другой. Мы создаем контекст, в котором храним функцию, и затем используем его значения в разных экранах.
В примере ниже мы используем контекст для передачи функции myFunction
из экрана ScreenA
в экран ScreenB
:
// MyContext.js import React from 'react'; const MyContext = React.createContext({ myFunction: () => {}, }); export default MyContext;
// ScreenA.js import React from 'react'; import { Button } from 'react-native'; import MyContext from './MyContext'; const ScreenA = () => { const myFunction = () => { console.log('Function called'); }; return ( <MyContext.Provider value={{ myFunction }}> <Button title="Go to Screen B" onPress={() => navigation.navigate('ScreenB')} /> </MyContext.Provider> ); }; export default ScreenA;
// ScreenB.js import React, { useEffect } from 'react'; import MyContext from './MyContext'; const ScreenB = () => { const context = React.useContext(MyContext); useEffect(() => { context.myFunction(); }, []); return ( // ... ); }; export default ScreenB;
Перечисленные методы предоставляют различные варианты для вызова функции из другого экрана в React Native. Выбор подхода зависит от вашего предпочтения, архитектуры приложения и используемых библиотек.