Как предоставить функции доступ к useContext (React native)

#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.io

2. Можете ли вы опубликовать свой контекст?

3. State.length имеет заглавную букву S. измените ее на state.length . Также опубликуйте свой контекстный код.

4. выполнение console.log(useContext(Контекст)) дало мне неопределенное

5. Вот моя демо-ссылка на закуску snack.expo.io/XJe1_P52r