我有一个< Navbar />我的< App />中渲染顶部的组件组件,在Navbar中有一个指向某个登录页面的链接,这由路由器处理.如果我无法传递它,那么我怎样才能将状态从Login.js中所做的更改中提升为传统方式,例如< Login loginHandler = {this.loginHandler} /> ?
有人告诉我,我应该将函数抽象为一个单独的模块,并在两个组件之间共享它,但是我太多的反应初学者,我需要一些例子.
谢谢
这是回购:https://github.com/charlesdarkwind/vitae-eternam
添加组件:
基本上登录方法是authHandler和authenticate,现在它只是设置用户ID(uid)的状态我希望是全局的
App.js:
import React from 'react'; import NavbarTop from './NavbarTop'; class App extends React.Component { constructor() { super(); this.authenticate = this.authenticate.bind(this); this.authHandler = this.authHandler.bind(this); } state = { items: {},order: {},uid: null }; render() { return ( <div> <NavbarTop /> </div> ); } } export default App;
Login.js:
import React from 'react'; import { Button } from 'react-bootstrap'; import base from '../base'; import NavbarTop from './NavbarTop'; class Login extends React.Component { componentDidMount() { base.onAuth((user) => { if(user) { this.authHandler(null,{ user }); } }); } authenticate(provider) { console.log(`Tentative de connexion avec ${provider}`); base.authWithOAuthPopup(provider,this.authHandler); } authHandler(err,authData) { console.log(err,authData); if(err) { console.error(err); return; } // grab the cart/order info const orderRef = base.database().ref(this.props.uid); //NEED SOME ID REFERING TO CURRENT ORDER CART // query the firebase ref once for the cart data and set the state orderRef.once('value',(snapshot) => { const data = snapshot.val() || {}; this.setState({ uid: authData.user.uid }); }); } render() { return ( <div> <NavbarTop /> <div className="loginWrap"> <nav className="login"> <p>Connexion</p> <Button bsstyle="primary" className="facebook" onClick={() => this.props.authenticate('facebook')}>Connexion avec FaceBook</Button> <Button bsstyle="danger" className="google" onClick={() => this.props.authenticate('google')}>Connexion avec Google</Button> </nav> </div> </div> ) } } export default Login;
解决方法
如果您在没有任何状态管理库的情况下使用react,那么props是传递数据的唯一方法.实际上要更准确,这是传递数据的唯一正确方法,从技术上讲,你可以通过将数据附加到窗口对象以使其全局或使用
localStorage来解决这个问题.我会远离窗口对象,但localStorage是可行的选项.
话虽这么说,你应该开始研究像redux和MobX这样的状态管理库.它们被用于这个原因,让你的应用程序成为跨组件实现持久数据和数据可访问性的更好方法.
如果您只需要跟踪用户是否已登录,那么您可以使用localStorage,但是如果您开始遇到与应用程序其他部分相同的问题并且需要使越来越多的数据持久/全局,那么你应该使用一个状态管理库.