gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 13:33:22 25 4
gpt4 key购买 nike

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

我尝试使用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/IndexedDB )
  • 和/或在服务器端重新加载。

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

关于reactjs - 如何在浏览器刷新后保持 React 组件状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37175727/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com