在 React Native 中使用 useContext 的 Context API 显示 TypeError

2023-11-26

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

类型错误:类型错误:未定义不是对象(正在评估 '上下文._context')

我的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:

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 }
)

包.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:

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

当我尝试通过导入使用时Context并使用useContext hook:

const {
    state,
    authModal
} = useContext(Context)

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


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

从 '...' 导入 {Context}

代替

从“..”导入上下文

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 React Native 中使用 useContext 的 Context API 显示 TypeError 的相关文章

  • React 路由器路由加载器不适用于嵌套组件

    我正在使用 React Router v6 我想在组件加载之前使用新的加载器来加载数据 所以我有以下内容 在我的index js中 const router createBrowserRouter createRoutesFromEleme
  • ReactJS setState 仅在嵌套在 setState 中时才有效

    问题 当我使用 this setState 并在回调中输出状态时 它根本不会改变 但是当我将 setstate 嵌套在 setstate 中时 它将正常工作 例子 这不行 this setState data newData 这确实有效 t
  • 从外部material-ui组件访问主题

    我有一个使用标准深色主题的主题提供商 我希望能够从我自己的自定义组件访问该主题的详细信息 但我不知道如何做到这一点 在下面的例子中 this props theme未定义 ReactDOM render
  • 让Webpack不捆绑文件

    所以现在我正在使用一个原型 我们使用 webpack 用于构建 tsx 文件和复制 html 文件 和 webpack dev server 之间的组合来提供开发服务 正如您可以假设的那样 我们也使用 React 和 ReactDOM 作为
  • 从反应本机SectionList中的节项访问节数据

    我需要访问有关反应本机SectionList 中的renderItem 内的部分 索引 值 的信息 根据http docs w3cub com react native sectionlist renderitem http docs w3
  • 单击 btn 而不触发 div 单击未按预期工作

    代码沙盒 https codesandbox io s currying breeze depdc9 file package json https codesandbox io s currying breeze depdc9 file
  • 鼠标输入时反应显示按钮

    我有一个反应组件 它包含如下方法 mouseEnter console log this is mouse enter render var album list const albums this props if albums user
  • 如何使用 React 制作垂直选项卡

    有人可以为我提供一种使用 React 创建垂直选项卡的方法吗 我尝试了各种npm包 如react web tabs reactstrap和react bootstrap 最后两个只有水平选项卡的示例 React web tabs在其文档中有
  • 在react-navigation中动态更改DrawerNavigator的drawerPosition配置

    我的主要路线有一个 DrawerNavigator 配置 const App DrawerNavigator DrawerRoutes initialRouteName Main contentComponent navigation gt
  • Firebase setDoc() 不创建文档

    我正在使用 auth 创建一个新用户 该用户正在工作 然后使用新创建的 uid 创建一个具有相同内容的新文档 const currentUser await auth createUserWithEmailAndPassword email
  • FlatList 和 VirtualizedList 的区别

    我是 React Native 的新手 对两者之间的区别感到困惑FlatList and VirtualizedList So 两者有什么区别FlatList and VirtualizedList 我应该什么时候使用每个 The
  • 调用axios成功后如何更新页面?反应

    所以我正在做一个使用的项目Axios with Json server 但我有一个问题 每次我做Patch 我必须在主页上按 F5 才能更新 我想知道如何才能做到这一点 这样它就不会自动发生 My Patch onSubmitDate ev
  • 具有值的 TextInput 不会更改值

    在我的react native应用程序中 我有一个API 我从中检索数据 并且我在输入值中设置数据 用户应该能够编辑这些输入并更新 但是当我尝试输入输入时它不会输入任何内容并且值保持原样 这是 TextInput 代码
  • Material UI 组件中的媒体查询

    我在 React js 项目中使用 Material UI 组件 出于某种原因 我需要对某些组件进行自定义 以使其根据屏幕宽度进行响应 我已经添加了media query并将其作为组件中的样式属性传递 但不起作用 知道吗 我正在使用这样的代
  • 监听 redux 动作

    我想创建一个可重用的 redux 表模块 它将存储和更新页码 显示的总页数等 我可以在所有页面之间共享这些模块 但是 我需要更新操作来触发刷新数据操作 该操作将根据页面到达不同的端点 因此 可能类似于页面特定的监听 RefreshData
  • 尝试注册 RCTBridgeModule 类 RCTFileReaderModule

    尝试为名称 FileReaderModule 注册 RCTBridgeModule 类 RCTFileReaderModule 但该名称已由类 FileReaderModule 注册 尝试使用命令react native run ios在i
  • 在电子生成器反应电子应用程序后,在 Windows 中出现空白屏幕

    在电子生成器反应电子应用程序后 Windows 中出现空白屏幕 这是package json 在电子生成器反应电子应用程序后 Windows 中出现空白屏幕 name SmallBusinessManagement version 0 1
  • 如何使用 jest 通过 Promise.all 设置多次提取测试

    我在测试中使用 jest 我正在使用 React 和 Redux 并且执行以下操作 function getData id notify return dispatch gt dispatch anotherFunction Promise
  • 移动浏览器中的 React 性能

    我有一个组件 表 其中包含许多行 其中包含数据编辑 其掩码形式为contenteditable 可以选择所有字段并同时更改所有行 在桌面上它运行得相当快 但在 iPhone 6 上我有不真实的滞后 Safari 每次操作都会挂起 20 秒
  • 在React组件中使用的字符串变量中插入html

    我正在为我的投资组合网站构建一个反应应用程序 目前我已经用 JSX 编写了应用程序 因此我可以添加以下内容 class Project extends React Component render return div h1 this pr

随机推荐

  • 保存事件后触发 MS Word 宏

    我的 MS Word 2007 模板有一个页脚 其中包含文件名 用户将打开模板并执行 另存为 来制作文档 我希望页脚中显示的文件名立即更新为新文件名 有没有一个AfterSaveEvent或者我可以用作钩子来启动执行更新的 VBA 脚本的东
  • 使用迭代器时可以速记“begin..end”吗?

    怎样才能避免写作smth begin smth end 一直在使用迭代器 例如 如果您必须使用std reverse 它看起来像这样 std reverse mystr begin mystr end 但我想我在某个地方看到人们在做同样的事
  • 如何在 onStartup 和 onInstalled 上添加 Chrome 扩展侦听器?

    The chrome runtime API有一些事件可以用来将侦听器添加到上下文菜单 目前我正在使用chrome runtime onStartup像这样 chrome runtime onStartup addListener func
  • Spring Cloud Vault 和带有 Vault 后端的 Spring Cloud Config 之间的区别

    以下内容有什么区别 春云金库 http cloud spring io spring cloud vault 带有 Vault 后端的 Spring Cloud 配置服务器 http cloud spring io spring cloud
  • Raspberry Pi 自组织网络

    我想尝试使用 Raspberry Pi 进行一些网络项目 并且我只需要在一对 pi 之间发送数据包 作为第一步 我很高兴能够在临时模式下 ping 到 Raspberry Pi 尽管在网上查看了一些教程和示例 但我还没有成功地做到这一点 我
  • 回形针在开发中工作但在生产中不起作用?

    我对 Rails 还很陌生 似乎对回形针宝石有疑问 我安装了 gem 它在开发中运行良好 localhost 3000 但是当我在heroku 服务器上运行它时 由于某种原因它不想附加文件 并且应用程序中断 错误 500 页面 这是我运行的
  • 如何在Android上正确使用setZOrderMediaOverlay?

    与许多其他人一样 我尝试在相机预览 使用 SurfaceView 上绘制 3D 对象 使用 GLSurfaceView 以及放置在顶部的一些按钮 我实际上得到了一个可以工作的原型 但是我无法让 onResume 正常工作 恢复后 GLSur
  • 为什么 scanf 的转换说明符中可以嵌入空字符?

    也许我误解了我的结果 但是 include
  • IIS Express 似乎没有接受对 applicationhost.config 的更改

    我遵循了接受的答案这个问题通过在我的计算机上运行的 IIS Express 服务器进行本地调试时 尝试让我的 Net Web 应用程序在一组特定的凭据下运行 但是 我似乎无法获取更改 诚然 我不知道如何验证实际发生的情况 但我所看到的行为让
  • 类库的 app.config

    我看不到 VS2008 向导为类库生成的 app config 文件 在我的研究中 我发现应用程序中只存在一个 app config 手动将 app config 添加到类库中是一件坏事吗 还是有其他方法可以实现类库中 app config
  • Adobe .jsx 脚本可以包含其他脚本文件吗?

    我们正在编写一堆 jsx 脚本 在每个脚本中我都必须模拟一些函数 以便我可以使用 Array map 和 String trim 之类的东西 但我不想包含该代码在每个脚本的顶部 有没有办法在 jsx 脚本文件中 包含 其他 jsx 脚本 或
  • React Native无法使用Android模拟器连接到react-devtools

    我执行该项目react native run android在另一个终端中 我这样做 npm run react devtools 它打开了电子的新窗口 上面写着 React Native 应用程序将在几秒钟内打开 但什么也没发生 I pu
  • C/C++ 中的 bool 是什么?关键字还是宏?

    我提到这个问题 其中一些答案表明bool是整型 IDE 也将其视为关键字 然而 没有一个答案表明中提供的信息cplusplus 这说明了bool是一个宏 通过添加
  • 是否有可供使用的浏览器条件列表(包括样式表)?

    我见过人们在 HTML 中做这样的事情 这是否适用于所有现代浏览器 是否有适用于此类 if 语句的浏览器类型列表 Edit Thanks Ross 有趣的是要了解gt lt gte 和 lte 这适用于所有浏览器 因为除了 IE 之外的任何
  • Android 如何获取Edittext中选定的单词?

    我正在开发一个像记事本这样的应用程序 我想在其中动态更改所选文本格式 颜色 更改字体样式 粗体 斜体 下划线等 如何格式化特定单词 您可以使用以下方式获取所选单词getSelectionStart and getSelectionEnd 方
  • Filezilla 删除 php 文件上的换行符 [重复]

    这个问题在这里已经有答案了 可能的重复 如何阻止 Filezilla 更改我的换行符 由于某种原因 Filezilla 有时会删除我的 php 文件上的换行符 使代码显示在一行上 当我上传项目时 会出现一堆错误 我环顾四周并将传输类型更改为
  • Chrome 扩展程序 - 消息传递

    我正在尝试获取选项页面上设置的信息以更改扩展程序的行为 基本上 如果 OptionsPage 上的复选框设置为 true 则扩展将运行 否则不会运行 为了测试目的 我在 background html 上返回 true 但它仍然不起作用 你
  • 基于命令行参数的多个 Spring boot CommandLineRunner

    我已经使用 Spring Cloud 任务创建了 Spring Boot 应用程序 它应该执行一些命令 任务 每个任务 命令都是短期任务 所有任务都是从命令行启动 做一些简短的 ETL 作业并完成执行 有一个 spring boot jar
  • SimpleHttpConnectionManager 被错误使用

    SimpleHttpConnectionManager 使用不正确 确保始终调用 HttpMethod releaseConnection 并且一次只有一个线程和 或方法正在使用此连接管理器 有谁知道为什么会出现此错误 并导致我想要下载的文
  • 在 React Native 中使用 useContext 的 Context API 显示 TypeError

    我尝试在 React Native 中使用现代 Context API 但出现以下错误 类型错误 类型错误 未定义不是对象 正在评估 上下文 context 我的createDataContext js import React useRe