在 React Native 中使用 useContext 的上下文 API 显示 TypeError [英] Context API using useContext in React Native is showing a TypeError

查看:16
本文介绍了在 React Native 中使用 useContext 的上下文 API 显示 TypeError的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试在 React-Native 中使用现代 Context API,但出现以下错误:

I'm attempting to use the modern Context API within React-Native, but I'm getting the following error:

TypeError: TypeError: undefined is not an object (评估'上下文._上下文')

TypeError: TypeError: undefined is not an object (evaluating 'Context._context')

我的 createDataContext.js:

my createDataContext.js:

import React, { useReducer } from 'react'

export default (reducer, actions, defaultValue) => {
    const Context = React.createContext()

    const Provider = ({ children }) => {
        const [state, dispatch] = useReducer(reducer, defaultValue)

        const boundActions = {}
        for (let key in actions) {
            boundActions[key] = actions[key](dispatch)
        }

        return (
            <Context.Provider value={{ state, ...boundActions }}>
                {children}
            </Context.Provider>
        )
    }

    return { Context, Provider }
}

我的 context.js:

My context.js:

import { AsyncStorage } from 'react-native'
import createDataContext from './createDataContext'

import { 
    LOGIN_FIRST_STEP, 
    LOGIN_SECOND_STEP,
    AUTH_MODAL, 
    SIGNIN_MODAL,
    SIGNUP_MODAL,
} from '../constants'

const INITIAL_STATE = {
    email: '',
    firstName: '',
    lastName: '',
    password: '',
    cardNumber: '',
    expiration: '', 
    CVV: '',
    billingAddress: '',
    authOpen: false,
    signupOpen: false,
    signinOpen: false,
}

const reducer = (state = INITIAL_STATE, { type, payload }) => {
    switch (type) {
        case LOGIN_FIRST_STEP: 
            const { email, firstName, lastName, password } = payload
            return {
                ...state,
                email,
                firstName,
                lastName,
                password,
            }
        case LOGIN_SECOND_STEP: 
            const { cardNumber, expiration, CVV, billingAddress } = payload
            return {
                ...state,
                email,
                cardNumber,
                expiration,
                CVV,
                billingAddress,
            }
        case AUTH_MODAL:
            return {
                ...state,
                authOpen: true,
                signupOpen: false,
                signinOpen: false,
            }
        case SIGNUP_MODAL:
            return {
                ...state,
                authOpen: false,
                signupOpen: true,
                signinOpen: false,
            }
        case SIGNIN_MODAL:
            return {
                ...state,
                authOpen: false,
                signupOpen: false,
                signinOpen: true,
            }
        default:
            return state
    }
}

const login = dispatch => values => {
    dispatch({ type: LOGIN_FIRST_STEP, payload: values })
}

const login2 = dispatch => values => {
    dispatch({ type: LOGIN_SECOND_STEP, payload: values })
}

const auth = disaptch => () => {
    dipatch({ type: AUTH_MODAL })
}

const signin = disaptch => () => {
    dipatch({ type: SIGNIN_MODAL })
}

const signup = disaptch => () => {
    dipatch({ type: SIGNUP_MODAL })
}

export const { Provider, Context } = createDataContext(
    reducer,
    { login, login2, auth, signin, signup },
    { authOpen: false , signinOpen: false, signupOpen: false }
)

package.json:

package.json:

{
  "main": "node_modules/expo/AppEntry.js",
  "scripts": {
    "start": "expo start",
    "android": "expo start --android",
    "ios": "expo start --ios",
    "web": "expo start --web",
    "eject": "expo eject"
  },
  "dependencies": {
    "@apollo/react-hooks": "^3.1.1",
    "apollo-cache-inmemory": "^1.6.3",
    "apollo-client": "^2.6.4",
    "apollo-link": "^1.2.13",
    "apollo-link-error": "^1.1.12",
    "apollo-link-http": "^1.5.16",
    "apollo-link-state": "^0.4.2",
    "apollo-link-ws": "^1.0.19",
    "apollo-utilities": "^1.3.2",
    "expo": "^34.0.1",
    "formik": "^1.5.8",
    "graphql": "^14.5.6",
    "graphql-tag": "^2.10.1",
    "react": "16.8.3",
    "react-apollo": "^3.1.1",
    "react-dom": "^16.9.0",
    "react-native": "https://github.com/expo/react-native/archive/sdk-34.0.0.tar.gz",
    "react-native-gesture-handler": "~1.3.0",
    "react-native-maps": "~0.24.0",
    "react-native-reanimated": "~1.1.0",
    "react-native-web": "^0.11.4",
    "react-navigation": "^4.0.6",
    "react-navigation-stack": "^1.8.0",
    "react-navigation-tabs": "^2.5.4",
    "subscriptions-transport-ws": "^0.9.16",
    "yup": "^0.27.0"
  },
  "devDependencies": {
    "babel-preset-expo": "^6.0.0"
  },
  "private": true
}

最后是 app.js:

And finally app.js:

export default App = () => {
  return (
      <ApolloProvider client={client}>
          <ApolloHooksProvider client={client}>
            <ContextProvider>
              <Root />
            </ContextProvider>
          </ApolloHooksProvider> 
      </ApolloProvider>
  )
}

当我尝试通过导入 Context 并使用 useContext 挂钩来使用时:

When I attempt to use by importing Context and using the useContext hook:

const {
    state,
    authModal
} = useContext(Context)

上述错误显示.我尝试删除 react-native 包并使用最新版本重新安装它.我试过删除节点模块,清除缓存,然后重新安装它们,但似乎没有一个能解决问题.

the aforementioned error shows. I've tried removing the react-native package and re-installing it with the latest version. I've tried deleting the node modules, clearing the cache, and re-installing them, but none seem to solve the issue.

推荐答案

我遇到了同样的错误,因为我是这样导入上下文的:

I had the same error and it's because I was importing Context like this:

从..."导入 {Context}

import {Context} from '...'

代替

从'..'导入上下文

这篇关于在 React Native 中使用 useContext 的上下文 API 显示 TypeError的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆