Получить значения из контекста
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); Как-то это можно сделать? |
Мужик. Это не магия - это обычный 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. Если очень хочется - поведение с отдачей сначала двух первых значений потом двух вторых можно сделать с помощью кастомного хука. Но не нужно. |
с value={(value1,value2,value3,value4)}> я действительно опечатался
Спасибо. |
Часовой пояс GMT +3, время: 23:34. |