Javascript.RU

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

Получить значения из контекста
export default function App() {
    const [taskList, setTaskList] = useState([])
    const changeStatusDone = (id) => {
        setTaskList(taskList => {
            const newList = taskList.slice();
            const index = newList.findIndex(i => i.id === id);

            if (index !== -1) {
                newList[index].done = !newList[index].done;
            }

            return newList;
        });
    }

    const settingsHandler = (id, title, description) => {
        Alert.alert(title, description, [
            {
                text: "Yes", onPress: () => setTaskList((value) => {
                    return value.filter(taskList => taskList.id != id)
                })
            },
            {text: "No"}
        ])
    }

    return (
        <NavigationContainer>
            <taskListContext.Provider value={[taskList, setTaskList]}>
                <changeStatusDoneContext.Provider value={(changeStatusDone)}>
                    <settingsHandlerContext.Provider value={(settingsHandler)}>
                        <Tab.Navigator screenOptions={{headerShown: false}}>
                            <Tab.Screen name="HomeStack" component={HomeStackScreen}/>
                            <Tab.Screen name="SettingsStack" component={SettingsStackScreen}/>
                        </Tab.Navigator>
                    </settingsHandlerContext.Provider>
                </changeStatusDoneContext.Provider>
            </taskListContext.Provider>
        </NavigationContainer>

    );
}

export const taskListContext = createContext([]);
export const changeStatusDoneContext = createContext([]);
export const settingsHandlerContext = createContext([])


Подскажите пожалуйста, возможно ли не создавать 3 контекста, а передать всё в одном?

Я видел что можно передать что-то вроде value={(value1,value2,value3,value4)}>

Но тут проблема в том, что на выходе получается вот так

const [value1,value2,value3,value4] = useContext(taskListContext);

А необходимо

const [value1,value2] = useContext(taskListContext);
const [value3,value4] = useContext(taskListContext);

Как-то это можно сделать?
Ответить с цитированием
  #2 (permalink)  
Старый 25.08.2024, 04:17
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,565

Мужик. Это не магия - это обычный javascript. То что ты кладёшь в Provider value - то ты и забираешь в useContext.
Кладёшь массив - забираешь массив, кладёшь объект - забираешь объект. Два раза забрав одно и то же - ты два раза получишь одно и то же.

Если же ты кладёшь вот так - value={(value1,value2,value3,value4)}>, то на выходе у тебя будет value4, потому что у тебя тут не объект и не массив, а использование оператора запятая в скобочках.

Чем тебе не нравится работа с массивом из четырёх значений и почему тебе прям необходимо творить дичь - непонятно.
Возможно таки подойдёт использование объекта?
value={ {value1,value2,value3,value4} }>

const context = useContext(taskListContext);

context.value1 
context.value2
context.value3
context.value4



P.S. Если очень хочется - поведение с отдачей сначала двух первых значений потом двух вторых можно сделать с помощью кастомного хука. Но не нужно.
__________________
29375, 35

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

с value={(value1,value2,value3,value4)}> я действительно опечатался

Спасибо.

Последний раз редактировалось acvafor, 25.08.2024 в 13:21.
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Получить все значения javascript обьекта! imult87 Общие вопросы Javascript 8 17.03.2017 13:37
Получить значения строки и столбца таблицы по нажатию polin11 Events/DOM/Window 11 30.09.2016 14:38
Как в oninput получить значения select? Jeick9 Events/DOM/Window 9 11.10.2014 20:18
Как получить значения вышестоящих элементов дерева TreeStore ? Allan Stark ExtJS 1 31.07.2012 16:48
Получить значения доп. полей select-option arcanerain Общие вопросы Javascript 11 29.09.2010 03:02