如何在浏览器刷新后保持 React 组件状态

2024-02-21

感谢您阅读我的第一个问题。

我尝试使用react、react-router 和 firebase 来使用共享根进行身份验证。 所以,我想保留App.js的用户状态。但是当我尝试刷新浏览器时,找不到用户状态。

我尝试保存到本地存储。但是有没有办法在浏览器刷新后保持组件的状态而不需要localStorage?


App.js

import React, { Component, PropTypes } from 'react'
import Rebase from 're-base'

import auth from './config/auth'

const base = Rebase.createClass('https://myapp.firebaseio.com')

export default class App extends Component {
  constructor (props) {
    super(props)
    this.state = {
      loggedIn: auth.loggedIn(),
      user: {}
    }
  }

  _updateAuth (loggedIn, user) {
    this.setState({
      loggedIn: !!loggedIn,
      user: user
    })
  }

   componentWillMount () {
     auth.onChange = this._updateAuth.bind(this)
     auth.login() // save localStorage
   }

  render () {
    return (
      <div>
        { this.props.children &&
          React.cloneElement(this.props.children, {
            user: this.state.user
          })
        }
      </div>
    )
  }
}
App.propTypes = {
  children: PropTypes.any
}

auth.js

import Rebase from 're-base'
const base = Rebase.createClass('https://myapp.firebaseio.com')

export default {
  loggedIn () {
    return !!base.getAuth()
  },

  login (providers, cb) {
    if (Boolean(base.getAuth())) {
      this.onChange(true, this.getUser())
      return
    }

    // I think this is weird...
    if (!providers) {
      return
    }

    base.authWithOAuthPopup(providers, (err, authData) => {
      if (err) {
        console.log('Login Failed!', err)
      } else {
        console.log('Authenticated successfully with payload: ', authData)
        localStorage.setItem('user', JSON.stringify({
          name: base.getAuth()[providers].displayName,
          icon: base.getAuth()[providers].profileImageURL
        }))
        this.onChange(true, this.getUser())
        if (cb) { cb() }
      }
    })
  },
  logout (cb) {
    base.unauth()
    localStorage.clear()
    this.onChange(false, null)
    if (cb) { cb() }
  },
  onChange () {},
  getUser: function () { return JSON.parse(localStorage.getItem('user')) }
}

Login.js

import React, { Component } from 'react'
import auth from './config/auth.js'

export default class Login extends Component {
  constructor (props, context) {
    super(props)
  }

  _login (authType) {
    auth.login(authType, data => {
      this.context.router.replace('/authenticated')
    })
  }
  render () {
    return (
      <div className='login'>
        <button onClick={this._login.bind(this, 'twitter')}>Login with Twitter account</button>
        <button onClick={this._login.bind(this, 'facebook')}>Login with Facebook account</button>
      </div>
    )
  }
}
Login.contextTypes = {
  router: React.PropTypes.object.isRequired
}

如果您通过浏览器刷新重新加载页面,您的组件树和状态将重置为初始状态。

要在浏览器中重新加载页面后恢复以前的状态,您必须

  • 本地保存状态(localstorage/索引数据库 https://developer.mozilla.org/en-US/docs/Web/API/IndexedDB_API)
  • 和/或在服务器端重新加载。

并以这样的方式构建页面,即在初始化时,检查以前保存的本地状态和/或服务器状态,如果找到,将恢复以前的状态。

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

如何在浏览器刷新后保持 React 组件状态 的相关文章

随机推荐

  • 如何在 ICEfaces 中覆盖默认文件上传 h:message

    我正在使用 ace fileEntry 组件上传文件 成功上传后我收到消息 File Entry uploaded successfully filename 我想覆盖此消息并显示其他消息 某种用于解析上传文件的摘要 有什么想法吗 这是我的
  • 如何编写 fql 查询来列出特定位置的好友

    我无法在任何地方找到 fql 查询来根据我指定的位置列出我的 facebook 好友 我正在尝试在 android 中实现此 fql 查询 请有人帮助我 您正在寻找的 FQL 将是 select name current location
  • 预先填充的数据库。现在我想添加更多数据而不弄乱预先存在的数据

    我已经设置了一个应用程序 它预先填充了数据 将数据库复制到项目的存储中 使用 CoreDataBooks 示例 方法 有什么方法可以预填充核心数据吗 https stackoverflow com questions 2230354 any
  • 红宝石中的反射?

    我很好奇这是如何运作的 例如 如果我创建一个基于工厂模式的类 您可以在其中 注册 类以供以后使用 然后执行类似的操作 FactoryClass register YourClassName param param FactoryClass
  • 使用管道进行 awk 打印在 Jupyter Notebook 中无法使用 iPython

    因此 下面的命令不会在带有 iPython 的 Jupyter Notebook 中提供任何输出 IP 62 172 72 131 cat hits csv grep IP awk print 1 我尝试过双 符号和单 符号 但都不起作用
  • Twitter Bootstrap 按钮在 Firefox 和 Chrome 中奇怪地改变渲染

    我有一个问题 我试图用我自己的颜色覆盖 twitter bootstrap v 2 0 3 主按钮 并且它在 IE 中工作正常 但在 FireFox 或 Chrome 中不起作用 因此 在我的页面上 我首先链接到 bootstrap css
  • 如何将字节数组转换为字符串[重复]

    这个问题在这里已经有答案了 我创建了一个包含两个字符串的字节数组 如何将字节数组转换为字符串 var binWriter new BinaryWriter new MemoryStream binWriter Write value1 bi
  • 快速展开的解决方法

    那么针对这个问题的回答是 Xcode 6 Storyboard Unwind Segue 与 Swift 未连接退出 https stackoverflow com questions 24029586 xcode 6 storyboard
  • 查找 3D 坐标是否已被使用的最快方法

    使用 C 和 Qt 我需要处理大量 3D 坐标 具体来说 当我收到 3D 坐标 由 3 个双精度数组成 时 我需要检查列表是否已处理该坐标 如果没有 那么我处理它并将其添加到列表 或容器 中 坐标量可能会变得非常大 因此我需要将处理后的坐标
  • 在路由定义中间使用贪婪路由参数

    我正在尝试创建遵循树导航系统结构的路线 即我想将树中的整个路径包含在我的路线中 所以如果我有一棵像这样的树 Computers Software 发展 Graphics Hardware CPU 显卡 然后我希望能够有这样的路线 site
  • 在 Spring MVC 控制器中注入 Jaxb2Marshaller

    我正在尝试将静态 xml 转换为控制器类中的 POJO 解组 我正在使用 Jaxb2Marshaller 并在我的中按以下方式进行配置根上下文
  • FactoryGirl 覆盖关联对象的属性

    这可能很简单 但我在任何地方都找不到例子 我有两个工厂 FactoryGirl define do factory profile do user title director bio I am very good at things li
  • 可以覆盖位于 jar 依赖项中的 persistence.xml 中的属性

    我有一个 java ee Web 应用程序 它使用打包为 jar 依赖项 实体类 EJB 存储库 persistence xml 的持久性单元 为了让 Web 应用程序运行一些验收测试 我需要覆盖打包的 persistence xml 中的
  • 如何将 3 位毫秒的因子转换为 R 中的日期时间?

    我这样对 t 对象进行计时 t lt c 2016 10 19 00 00 00 000 我需要转换为 POSIXct 如下所示 as POSIXct t format Y m d H M OS 2016 10 19 EDT 我失去了小时
  • 使用字典查找更新 pandas 列

    有一个数据框 df import pandas as pd import numpy as np i dog cat rabbit elephant 3 df pd DataFrame np random randn 12 2 index
  • 如何在 SQL Server 中导入 DBF 文件

    如何在 SQL Server 中导入 FoxPro DBF 文件 使用链接服务器或使用 openrowset 例如 SELECT into SomeTable FROM OPENROWSET MSDASQL Driver Microsoft
  • 协程和 while 循环

    我一直在研究沿着从 Navmesh Unity3d 获得的路径的对象移动 我正在使用协程 其中我用 while 循环控制它 正如我所展示的 public void DrawPath NavMeshPath pathParameter Gam
  • Stripe - 定期付款中包含的附加发票项目

    我在订阅中添加发票项目时遇到问题 目前我的头撞在墙上 我已经在 stripe 上创建了一个发票项目 并且我希望将发票项目包含在定期付款中 这是我的代码 它在第一张发票上添加发票项目 但不在下一张发票上添加发票项目 new customer
  • 如何自定义表单身份验证 cookie 名称?

    我有 2 个网站在不同端口的本地主机上运行 由于浏览器在发送 cookie 时不区分端口号 因此我的表单身份验证票证从一个站点发送到另一个站点 我该如何解决这个问题 我认为一个好的解决方案是更改表单身份验证票或其中一个网站 但我不知道如何执
  • 如何在浏览器刷新后保持 React 组件状态

    感谢您阅读我的第一个问题 我尝试使用react react router 和 firebase 来使用共享根进行身份验证 所以 我想保留App js的用户状态 但是当我尝试刷新浏览器时 找不到用户状态 我尝试保存到本地存储 但是有没有办法在