首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >使用在_app.js中实现的React.createContext()

使用在_app.js中实现的React.createContext()
EN

Stack Overflow用户
提问于 2020-11-05 22:42:50
回答 1查看 72关注 0票数 0

我想从我的上下文从另一个组件访问emailLogin

userContext.js

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import React, { useEffect, useState } from 'react';
import cookie from 'js-cookie';
import {firebase} from './firebase-client';

export const UserContext = React.createContext();
const tokenName = 'firebaseToken';

const UserProvider = ({ children }) => {
  const emailLogin = async (email, password, redirectPath) => {
    await firebase
      .auth()
      .signInWithEmailAndPassword(email, password)
      .then(() => {
        console.log('User logged in.');
      })
      .catch((err) => {
        console.log(err);
      });
  };

  const onAuthStateChange = () => {
    return firebase.auth().onAuthStateChanged(async (user) => {
      if (user) {
        const token = await user.getIdToken();
        cookie.set(tokenName, token, { expires: 14 });
      } else {
        cookie.remove(tokenName);
      }
    });
  };

  useEffect(() => {
    const unsubscribe = onAuthStateChange();
    return () => {
      unsubscribe();
    };
  }, []);
    
      return <UserContext.Provider value={{ emailLogin }}>{children}</UserContext.Provider>;
    };
    
    export default UserProvider;

_app.js

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import React from 'react';
import Head from 'next/head';
import App from 'next/app'
import cookies from 'next-cookies'
import UserProvider from '../lib/userContext'
import { ThemeProvider } from '@material-ui/core/styles';
import CssBaseline from '@material-ui/core/CssBaseline';
import theme from '../theme';

export default function MyApp(props) {
  const { Component, pageProps, user } = props;

  React.useEffect(() => {
    const jssStyles = document.querySelector('#jss-server-side');
    if (jssStyles) {
      jssStyles.parentElement.removeChild(jssStyles);
    }
  }, []);

  return (
    <React.Fragment>
      <Head>
        <title>My app</title>
        <meta name="viewport" content="minimum-scale=1, initial-scale=1, width=device-width" />
      </Head>
      <ThemeProvider theme={theme}>
        <CssBaseline />
        <UserProvider>
          <Component {...{...pageProps, ...user}} />
        </UserProvider>
      </ThemeProvider>
    </React.Fragment>
  );
}
MyApp.getInitialProps = async (userContext) => {
  const { ctx } = userContext;
  let error;
  const appProps = await App.getInitialProps(userContext);
  const { firebaseToken } = cookies(ctx);
  if (firebaseToken) {
    try {
      const headers = {
        'Context-Type': 'application/json',
        Authorization: JSON.stringify({ token: firebaseToken }),
      };
      const dev = process.env.NODE_ENV === 'development';
      const server = dev ? 'http://localhost:3000' : 'https://firebase-app-taupe.vercel.app/';
      const result = await fetch(`${server}/api/validate`, { headers }).then((res) => res.json());
      return { ...result, ...appProps };
    } catch (e) {
      console.log(e);
    }
  }
  return { ...appProps };
};

auth.js

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import { useContext } from 'react'
import Button from '@material-ui/core/Button'
import {Grid, TextField} from '@material-ui/core'
import UserContext from '../lib/userContext'


const auth = () => {
    const { emailLogin } = useContext(UserContext);
  return (
    <Grid container spacing={0} direction="column" alignItems="center" justify="center" style={{ minHeight: '100vh' }}>
      <Grid item>
        <div>
          <TextField value="diegopitt@gmail.com" label="email" /><br /><br />
          <TextField value="12345678" label="password" type="password" /><br /><br />
          <Button variant="contained" color="primary"  onClick={() => login('diegopitt@gmail.com', '12345678')}>Sign In</Button>
        </div>
      </Grid>   
    </Grid> 
  )
}

export default auth

如何从认证组件访问函数emailLogin?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-11-05 23:01:17

当您传递一个对象作为您的上下文值时,每当您想要使用rmail字段时,您可以这样做:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const ctx = useContext(UserContext);
ctx.emailLogin(...)

以便访问emailLogin字段。或者更简单:const { emailLogin } = useContext(UserContext);

别忘了先导入UserContext

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64706379

复制
相关文章
Jenkins配置邮箱接收构建通知
Jenkins配置邮箱接收构建通知 1、开启163邮箱的POP3/SMTP服务 2、配置Jenkins Location 3、配置Extended E-mail Notification 4、配置邮件通知选项 5、任务中配置 6、任务构建测试 7、怎么同时给多人发邮件 1、开启163邮箱的POP3/SMTP服务   这里我们用163邮箱当作发件方,qq邮箱当作接收方   找到设置-POP/SMTP/IMAP服务   点击开启按钮(我这个已经是开启过的)   开通的时候会让你
别团等shy哥发育
2023/02/25
6850
Jenkins配置邮箱接收构建通知
Jenkins配置邮箱接收构建通知
1、开启163邮箱的POP3/SMTP服务  这里我们用163邮箱当作发件方,qq邮箱当作接收方  找到设置-POP/SMTP/IMAP服务 图片  点击开启按钮(我这个已经是开启过的) 图片  开通的时候会让你发送一个验证短信,然后会显示给你一个授权码,这个授权码只显示一次,保存好,等会需要在Jenkins中配置。 2、配置Jenkins Location  点击Maven Plugins->Configure System 图片  找到Jenkins Location配置。 图片  下面中系统管理员邮件
别团等shy哥发育
2023/03/01
9510
Jenkins配置邮箱接收构建通知
关于本专栏停止维护的通知
为规范管理,即日起,本专栏停止维护。更多流计算 Oceanus 相关资讯动态,学习交流以及知识问答,请前往官方专栏查看。
腾讯云大数据
2021/09/16
3670
firebase怎么用_firebase是什么
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/168361.html原文链接:https://javaforall.cn
全栈程序员站长
2022/09/20
4.2K0
firebase怎么用_firebase是什么
nodejs接收微信支付通知结果
在统一下单中讲到了微信支付的统一下单,统一下单完成后就是客户端的事情了,根据返回的信息来调起微信支付,完成付款。当付款完成后,微信服务器会post支付结果通知我们,此接口需要单独来写,并且需要按照微信文档的要求来返回数据。
OECOM
2020/07/01
1.6K0
C#问题——记一次线程运行突然停止
  定义一个子线线程,里面无限循环跑while,但突然跑不起来,设断点看里面的属性如下图:
vv彭
2022/09/23
9930
微信支付-支付结果通知接收「建议收藏」
最近在做微信支付功能在微信成功后,微信通过异步方式返回支付结果是遇到了问题:参数接收不到。后来通过查阅资料才将问题解决,现在将解决方法分享一下。
全栈程序员站长
2022/09/03
1.7K0
微信支付-支付结果通知接收「建议收藏」
关注「腾讯云助手」公众号,接收重要通知
公众号现已支持通知主要包括:工单、备案、余额预警、安全事件、域名相关、监控告警相关通知,其他通知正在陆续上线中。
腾讯云助手团队
2018/05/24
9.5K9
关注「腾讯云助手」公众号,接收重要通知
[Microsoft Teams]使用连接器接收Azure Devops的通知
连接器(connector)是Teams中频道的一个接受消息的功能,官方的解释如下:
dino.c
2020/03/24
1.7K0
[Microsoft Teams]使用连接器接收Azure Devops的通知
在任意电脑安装Dell Mobile Connect接收手机通知
<span data-mce-type="bookmark" style="display: inline-block; width: 0px; overflow: hidden; line-height: 0;" class="mce_SELRES_start"></span>
reizhi
2022/09/26
1.2K0
在任意电脑安装Dell Mobile Connect接收手机通知
nodejs开发微信支付之接收退款申请通知
nodejs申请退款之后,微信服务器会将退款结果通知服务器,我们需要接收处理一下。特别说明:退款结果对重要的数据进行了加密,商户需要用商户秘钥进行解密后才能获得结果通知的内容。我不知道微信为什么单独要在这里进行加密处理,使得这个接口很麻烦,另外他给的解密步骤也很模糊:
OECOM
2020/07/01
1.4K0
Firebase 如何创建登录 Token
Firebase 的 token 可以使用 firebase 命令行工具来进行创建。
HoneyMoose
2021/04/02
2.5K0
Firebase 如何创建登录 Token
Linux的异步通知接收中要注意使能顺序
异步通知是一种通知,相当于用于应用程序的中断。可用于驱动通知进程,也可以进程通知进程。
用户9736681
2023/02/20
1.1K0
Linux的异步通知接收中要注意使能顺序
GitHub回应突然断供:身在美国不由己,无权提前通知预警
这是GitHub CEO Nat Friedman对GitHub限制伊朗等地账户给出的回应。
Python数据科学
2019/08/01
3210
GitHub回应突然断供:身在美国不由己,无权提前通知预警
GitHub回应突然断供:身在美国不由己,无权提前通知预警
这是 GitHub CEO Nat Friedman对 GitHub 限制伊朗等地账户给出的回应。
用户1737318
2019/08/09
5720
GitHub回应突然断供:身在美国不由己,无权提前通知预警
GitHub回应突然断供:身在美国不由己,无权提前通知预警
这是GitHub CEO Nat Friedman对GitHub限制伊朗等地账户给出的回应。
量子位
2019/08/01
3990
GitHub回应突然断供:身在美国不由己,无权提前通知预警
Android Firebase 服务简介
Firebase初步了解 什么事Firebase? Firebase成立于2011年,在被Google收购之前,Firebase是一个协助开发者快速构建App,能够提供行动应用专用开发平台及SDK的一款产品,简单的说大概就是一套集成后台服务工具。早在2014年,谷歌收购了Firebase,这主要是一种面向应用程序开发人员的数据库。Firebase基本上向广大的应用程序开发人员提供不同的服务,比如存储、消息传递、通知和身份验证等服务。 在今年的I/O大会上,谷歌发表了新版的Firebase,新的Firebas
xiangzhihong
2018/02/05
22.8K0
Android  Firebase 服务简介
Google 的 Firebase 如何删除项目
https://www.ossez.com/t/google-firebase/13792
HoneyMoose
2021/11/02
3.2K0
Google 的 Firebase 如何删除项目
与 FireBase 亲密接触
正常的 App 都是属于网络应用,数据都是从服务器上获取的。这就需要有专业的后台开发人员开发后台业务服务器,然后为我们 App 提供数据。自从云出现之后,各大云主机厂商提供了一个云服务 PAAS(Platform-as-a-Service的缩写),意思是平台即服务。PaaS是一个执行代码以及管理应用运行环境的开发平台,用户通过SVN或者Git之类的代码版本管理工具与平台交互。但这也是开发人员具备后台开发的能力。因此,
猴哥yuri
2018/08/16
16K0
点击加载更多

相似问题

突然停止接收推流通知

13

突然停止接收消息

21

Firebase (FCM) -用户停止接收订阅主题的通知

20

udpclient.receive()突然停止接收

20

带电安装突然停止接收参数

12
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文