Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 17.08.2024, 14:09
Интересующийся
Отправить личное сообщение для acvafor Посмотреть профиль Найти все сообщения от acvafor
 
Регистрация: 03.08.2024
Сообщений: 13

Как передать функцию?
Как передать функцию?
<Stack.Screen name="Home" component={HomeScreen} />
<Stack.Screen name="Settings" component={Settings} />


Хочу из home передать в settings функцию и установить в ней новые значения

Home
export default function HomeScreen() {
  const [taskList, setTaskList] = useState<Array<Item>>([]);
  const navigation = useNavigation();
  const goToMessageScreen = () => {
      navigation.navigate('Settings', {
          setTaskList,
      });
  };
}

<Button title="Submit" onPress={goToMessageScreen} color="green" />


Settings
const Settings = () => {
    const route = useRoute();
    const taskClear = () => {
        route.params.setTaskList("")
    }
    return (
        <View style={styles.container}>
            <Text style={styles.title}>
                <Button title="Submit" onPress={taskClear} color="green"/>
            </Text>
        </View>
    );
};


Срабатывает но выдаёт предупреждение
his can break usage such as persisting and restoring state. This might happen if you passed non-serializable values such as function, class instances etc. in params. If you need to use components with callbacks in your options, you
Ответить с цитированием
  #2 (permalink)  
Старый 17.08.2024, 16:33
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,588

Проблема описана в тексте предупреждения.

А о взаимодействии компонентов уже 100500 раз написано.
Надо передать что-то из компонента А в компонент Б:
1. Если компонент Б лежит в компоненте А - используйте props.
2. Если компонент Б лежит в одном родителе с компонентом A - родитель слушает событие компонента А, меняет state и передаёт его в props компонента Б.
3. В любых иных случаях используется context. (в особо сложных - сторонний store)
__________________
29375, 35

Последний раз редактировалось Aetae, 17.08.2024 в 16:37.
Ответить с цитированием
  #3 (permalink)  
Старый 17.08.2024, 19:26
Интересующийся
Отправить личное сообщение для acvafor Посмотреть профиль Найти все сообщения от acvafor
 
Регистрация: 03.08.2024
Сообщений: 13

Сообщение от Aetae Посмотреть сообщение
Проблема описана в тексте предупреждения.

А о взаимодействии компонентов уже 100500 раз написано.
Надо передать что-то из компонента А в компонент Б:
1. Если компонент Б лежит в компоненте А - используйте props.
2. Если компонент Б лежит в одном родителе с компонентом A - родитель слушает событие компонента А, меняет state и передаёт его в props компонента Б.
3. В любых иных случаях используется context. (в особо сложных - сторонний store)
Извините, я видимо что-то не понимаю

Не могли бы на моём примере продемонстрировать?
Ответить с цитированием
  #4 (permalink)  
Старый 17.08.2024, 19:53
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,588

Пункт 3 в упрощённом виде. Как создавать и использовать контекст можете почитать сами.
export default function HomeScreen() {
  const taskListContext = useContext(TaskListContext);
  const [taskList, setTaskList] = useState<Array<Item>>([]);
  const navigation = useNavigation();

  taskListContext.setTaskList = setTaskList;

  const goToMessageScreen = () => {
      navigation.navigate('Settings');
  };
}


const Settings = () => {
    const taskListContext = useContext(TaskListContext);
    const route = useRoute();
    const taskClear = () => {
        taskListContext?.setTaskList("")
    }
    return (
        <View style={styles.container}>
            <Text style={styles.title}>
                <Button title="Submit" onPress={taskClear} color="green"/>
            </Text>
        </View>
    );
};
__________________
29375, 35
Ответить с цитированием
  #5 (permalink)  
Старый 17.08.2024, 21:05
Интересующийся
Отправить личное сообщение для acvafor Посмотреть профиль Найти все сообщения от acvafor
 
Регистрация: 03.08.2024
Сообщений: 13


Я читал про контексты
Но проблема в том что
Home находится в HomeScreen.tsx
А Settings в Settins.tsx

Единственное что их связывает это app.tsx
import { useState } from 'react';
import { NavigationContainer } from '@react-navigation/native';
import { createNativeStackNavigator } from '@react-navigation/native-stack';
import HomeScreen from './tabs/HomeScreen';
import Settings from './tabs/Settings';
import {Button} from "react-native";

const Stack = createNativeStackNavigator();


export default function App() {
  return (
      <NavigationContainer>
        <Stack.Navigator
            screenOptions={{
              headerStyle: {
                backgroundColor: 'gray',
              },
              headerTintColor: '#fff',
            }}>
          <Stack.Screen name="Home" component={HomeScreen} options={{ headerShown: false }} />
          <Stack.Screen name="Settings" component={Settings} options={{ title: "",  }} />
        </Stack.Navigator>
      </NavigationContainer>
  );
}
Ответить с цитированием
  #6 (permalink)  
Старый 17.08.2024, 23:43
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,588

import { useState } from 'react';
import { NavigationContainer } from '@react-navigation/native';
import { createNativeStackNavigator } from '@react-navigation/native-stack';
import HomeScreen from './tabs/HomeScreen';
import Settings from './tabs/Settings';
import {Button} from "react-native";

const Stack = createNativeStackNavigator();
const [taskListContext, setTaskListContext] = useState({setTaskList(){console.warn('setTaskList is not set')}});
taskListContext.set = setTaskListContext; // на случай полного обновления контекста

export default function App() {
  return (
    <TaskListContext.Provider value={taskListContext}>
      <NavigationContainer>
        <Stack.Navigator
            screenOptions={{
              headerStyle: {
                backgroundColor: 'gray',
              },
              headerTintColor: '#fff',
            }}>
          <Stack.Screen name="Home" component={HomeScreen} options={{ headerShown: false }} />
          <Stack.Screen name="Settings" component={Settings} options={{ title: "",  }} />
        </Stack.Navigator>
      </NavigationContainer>
    </TaskListContext.Provider>
  );
}
__________________
29375, 35

Последний раз редактировалось Aetae, 17.08.2024 в 23:46.
Ответить с цитированием
  #7 (permalink)  
Старый 18.08.2024, 11:09
Интересующийся
Отправить личное сообщение для acvafor Посмотреть профиль Найти все сообщения от acvafor
 
Регистрация: 03.08.2024
Сообщений: 13

Сообщение от Aetae Посмотреть сообщение
import { useState } from 'react';
import { NavigationContainer } from '@react-navigation/native';
import { createNativeStackNavigator } from '@react-navigation/native-stack';
import HomeScreen from './tabs/HomeScreen';
import Settings from './tabs/Settings';
import {Button} from "react-native";

const Stack = createNativeStackNavigator();
const [taskListContext, setTaskListContext] = useState({setTaskList(){console.warn('setTaskList is not set')}});
taskListContext.set = setTaskListContext; // на случай полного обновления контекста

export default function App() {
  return (
    <TaskListContext.Provider value={taskListContext}>
      <NavigationContainer>
        <Stack.Navigator
            screenOptions={{
              headerStyle: {
                backgroundColor: 'gray',
              },
              headerTintColor: '#fff',
            }}>
          <Stack.Screen name="Home" component={HomeScreen} options={{ headerShown: false }} />
          <Stack.Screen name="Settings" component={Settings} options={{ title: "",  }} />
        </Stack.Navigator>
      </NavigationContainer>
    </TaskListContext.Provider>
  );
}
Откуда здесь берётся setTaskList и TaskListContext ?
Ответить с цитированием
  #8 (permalink)  
Старый 18.08.2024, 21:08
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,588

acvafor, сорян, перед сном неглядя нафигачил, надо так:
import { useState } from 'react';
import { NavigationContainer } from '@react-navigation/native';
import { createNativeStackNavigator } from '@react-navigation/native-stack';
import HomeScreen from './tabs/HomeScreen';
import Settings from './tabs/Settings';
import {Button} from "react-native";

const Stack = createNativeStackNavigator();
const defaultTaskContext = {setTaskList(){console.warn('setTaskList is not set')}};
const TaskListContext = createContext(defaultTaskContext);

export default function App() {
  const [taskListContext, setTaskListContext] = useState({...defaultTaskContext});
  taskListContext.set = setTaskListContext; // на случай полного обновления контекста

  return (
    <TaskListContext.Provider value={taskListContext}>
      <NavigationContainer>
        <Stack.Navigator
            screenOptions={{
              headerStyle: {
                backgroundColor: 'gray',
              },
              headerTintColor: '#fff',
            }}>
          <Stack.Screen name="Home" component={HomeScreen} options={{ headerShown: false }} />
          <Stack.Screen name="Settings" component={Settings} options={{ title: "",  }} />
        </Stack.Navigator>
      </NavigationContainer>
    </TaskListContext.Provider>
  );
}


А setTaskList будет установлено в HomeScreen - 6 строчка.
__________________
29375, 35

Последний раз редактировалось Aetae, 18.08.2024 в 21:11.
Ответить с цитированием
  #9 (permalink)  
Старый 19.08.2024, 21:22
Интересующийся
Отправить личное сообщение для acvafor Посмотреть профиль Найти все сообщения от acvafor
 
Регистрация: 03.08.2024
Сообщений: 13

Сообщение от Aetae Посмотреть сообщение
acvafor, сорян, перед сном неглядя нафигачил, надо так:
import { useState } from 'react';
import { NavigationContainer } from '@react-navigation/native';
import { createNativeStackNavigator } from '@react-navigation/native-stack';
import HomeScreen from './tabs/HomeScreen';
import Settings from './tabs/Settings';
import {Button} from "react-native";

const Stack = createNativeStackNavigator();
const defaultTaskContext = {setTaskList(){console.warn('setTaskList is not set')}};
const TaskListContext = createContext(defaultTaskContext);

export default function App() {
  const [taskListContext, setTaskListContext] = useState({...defaultTaskContext});
  taskListContext.set = setTaskListContext; // на случай полного обновления контекста

  return (
    <TaskListContext.Provider value={taskListContext}>
      <NavigationContainer>
        <Stack.Navigator
            screenOptions={{
              headerStyle: {
                backgroundColor: 'gray',
              },
              headerTintColor: '#fff',
            }}>
          <Stack.Screen name="Home" component={HomeScreen} options={{ headerShown: false }} />
          <Stack.Screen name="Settings" component={Settings} options={{ title: "",  }} />
        </Stack.Navigator>
      </NavigationContainer>
    </TaskListContext.Provider>
  );
}


А setTaskList будет установлено в HomeScreen - 6 строчка.
Благодарю
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как запустить js/jquery функцию после того, как содержимое страницы обновлено ajax-ом mav1 jQuery 5 26.06.2021 11:13
Как передать переменную в другую функцию adder-vb jQuery 3 31.01.2013 14:29
setInterval как передать переменную в функцию kamushek Общие вопросы Javascript 6 02.09.2011 23:53
Как передать в функцию значение а не ссылку на переменную? Ghaniball Общие вопросы Javascript 4 02.09.2011 18:24
Подскажите пожалуйста как передать массив в функцию serov Элементы интерфейса 3 21.08.2010 19:37