#react-native #expo #provider #use-context
Вопрос:
В основном я завернул Боковое меню в поставщика и дал ему меню функции. Внутри бокового меню я завернул навигацию по стеку, поэтому все мои навигационные экраны имеют доступ к useContext.state. Но в меню моего сайдмена() есть проблема с доступом к useContext.state.
Мне нужно, чтобы мой сайдмен мог получить доступ к состоянию и отобразить длину useContext.state.
Вот мой App.js
import React from 'react';
import { createAppContainer} from 'react-navigation';
import { createStackNavigator } from 'react-navigation-stack';
import menu from './src/components/menu';
import SideMenu from 'react-native-side-menu-updated'
import IndexScreen from './src/screens/IndexScreen';
import { Provider } from './src/context/BlogContext';
import ShowScreen from './src/screens/ShowScreen';
import CreateScreen from './src/screens/CreateScreen';
import EditScreen from './src/screens/EditScreen';
const navigator = createStackNavigator({
Index: IndexScreen,
Show: ShowScreen,
Create: CreateScreen,
Edit: EditScreen,
}, {
initialRouteName: 'Index',
defaultNavigationOptions: {
title: 'Blogs',
headerStyle: {
backgroundColor: '#9AC4F8',
},
headerTintColor: "white",
},
});
const App = createAppContainer(navigator);
export default () => {
return (
<Provider>
<SideMenu menu={menu()} >
<App />
</SideMenu>
</Provider>
);
}
и это мое menu.js
import React, {useContext} from 'react';
import { Context } from '../context/BlogContext';
import { View, Text } from 'react-native';
import { State } from 'react-native-gesture-handler';
const menu = () =>{
const { state } = useContext(Context);
console.log(state);
return (
<View>
<Text>{State.length}</Text>
</View>
)
}
export default menu;
Это ошибка, которую он написал
Можете ли вы помочь мне понять, как получить доступ к состоянию в этой функции меню?
Here is my Reducer:
import createDataContext from './createDataContext';
const blogReducer = (state, action) => {
switch (action.type) {
case 'edit_blogpost':
return state.map((blogPost) => {
return blogPost.id === action.payload.id ? action.payload : blogPost;
});
case 'delete_blogpost':
return state.filter((blogPost) => blogPost.id !== action.payload);
case 'add_blogpost':
return [
...state,
{
id: Math.floor(Math.random() * 99999),
title: action.payload.title,
content: action.payload.content
}
];
default:
return state;
}
};
const addBlogPost = (dispatch) => {
return (title, content, callback) => {
dispatch({type: 'add_blogpost', payload: {title: title, content: content}});
if(callback){
callback();
}
};
};
const deleteBlogPost = dispatch => {
return (id) => {
dispatch({ type: 'delete_blogpost', payload: id })
};
}
const editBlogPost = dispatch => {
return(id, title, content, callback) => {
dispatch({
type: 'edit_blogpost',
payload: { id:id, title:title, content:content}
});
if(callback){
callback();
}
};
};
export const {Context, Provider} = createDataContext(
blogReducer,
{addBlogPost, deleteBlogPost, editBlogPost},
[]
);
и Контекст:
import React, { useReducer } from 'react';
export default (reducer, actions, initialState) => {
const Context = React.createContext();
const Provider = ({ children }) => {
const [state, dispatch] = useReducer(reducer, initialState);
//actions === { addBlogPost: (dispatch) => {return () => {} } }
const boundActions = {};
for(let key in actions) {
boundActions[key] = actions[key](dispatch);
}
return <Context.Provider value={{ state: state, ...boundActions}}>
{children}
</Context.Provider>
}
return { Context, Provider };
};
Комментарии:
1. Попробуйте сделать
console.log(useContext(Context))
, если possbile добавит демо-версию закусок. snack.expo.io2. Можете ли вы опубликовать свой контекст?
3.
State.length
имеет заглавную букву S. измените ее наstate.length
. Также опубликуйте свой контекстный код.4. выполнение console.log(useContext(Контекст)) дало мне неопределенное
5. Вот моя демо-ссылка на закуску snack.expo.io/XJe1_P52r