node.js - 在 React 中呈现的 Blaze LoginButtons 模板 - 登录仅适用于主页

标签 node.js meteor reactjs authentication meteor-blaze

所以我使用 Meteor/React,但为了方便我使用了 Blaze 的登录模板。它在主页上运行得很好,但是当我尝试从网站上的任何其他页面登录时,页面会重新加载,并且登录似乎不成功。

这是我的实现。

AccountsUI.jsx

import React, {Component} from 'react';
import ReactDOM from 'react-dom';

export class AccountsUI extends React.Component {

    componentDidMount(){
        this.view = Blaze.render(Template.loginButtons, this.refs.loginContainer);

    }

    componentWillUnmount(){
        Blaze.remove(this.view);
    }

    render(){
        return(

            <span ref="loginContainer" />

        )
    }

}

mainLayout.jsx

  <div className="container-fluid">
                <a className="navbar-btn pull-left panel-body"><b>FAQ</b></a>

                <a className="navbar-btn pull-right panel-body"><b>Category</b></a>
                <a className="navbar-btn pull-right panel-body"><b>Notifications</b></a>
                <a className="navbar-btn pull-right panel-body"><b><AccountsUI /></b></a>

            </div>
        </div>

为什么这只适用于某些页面?

最佳答案

火焰

您的代码看起来不错,您是否正确导入了所有组件?

尝试:https://atmospherejs.com/gadicc/blaze-react-component

然后做:

import Blaze from 'meteor/gadicc:blaze-react-component';

....

<a className="navbar-btn pull-right panel-body"><b><Blaze template="loginButtons" /></b></a>

....

在没有尝试过多改变你对工具的选择的情况下,我已经探索了 React、Meteor 和 Authentication 一段时间,经常陷入状态管理和其他黑洞。以下是一些选项的概述:

React Accounts-UI 包

就我个人而言,作为一个快速工具,我是 React Accounts-UI 包的忠实粉丝 https://atmospherejs.com/std/accounts-ui

它很容易实现,并且有许多 React 特定的配置选项。

查看“创建您自己的样式版本”以在导航栏中实现:https://github.com/studiointeract/accounts-ui/blob/master/README.md

<小时/>

使用 Kadira FlowRouter 和 ReactLayout 进行 react

对于导航栏中的某些内容,这里有一个流路由器的刺探。

来自 Meteor Guide 用户/身份验证部分:

While a router is optional and the basic functionality will work without it, it’s also a good idea to pick a router integration:

用于导航栏登录(不是 React Accounts-UI)。

您需要FlowrouterReactlayout

路线

我们创建 2 条路线 groups这使我们能够轻松地将身份验证逻辑构建到 Flow 路由器中:

const publicRoutes = FlowRouter.group( { name: 'public' } );
  publicRoutes.route( '/login', { 
    name: 'login', 
    action() { 
      ReactLayout.render( App, { 
        yield: <Login /> }
       ); 
     } 
   }
 );

const authenticatedRoutes = FlowRouter.group( { name: 'authenticated' } );
  authenticatedRoutes.route( '/hidden', { 
    name: 'hidden', 
    action() { 
      ReactLayout.render( App, { 
        yield: <Hidden /> }
        ); 
      }
    }
 );

应用程序:

您可以修改它以适合您自己的设置。这里的方法是获取 reactmeteordata mix 允许我们测试用户是否已登录或正在登录。 isPublic 函数允许我们测试是否应允许用户使用当前路由。其余的应该是不言自明的。

App = React.createClass({ 
  mixins: [ ReactMeteorData ],
  getMeteorData() { 
    return { 
      loggingIn: Meteor.loggingIn(), 
      hasUser: !!Meteor.user(),
      isPublic( route ) {
        let publicRoutes = [ 
          'login' 
        ];

        return publicRoutes.indexOf( route ) > -1; 
      }, 
      canView() { 
        return this.isPublic( FlowRouter.current().route.name ) || !!Meteor.user(); 
      } 
    }; 
  }, 
  loading() { 
    return <div className="loading"></div>; 
  }, 
  getView() { 
    return this.data.canView() ? this.props.yield : <Login />;
  },
  render() { 
   return <div className="app-root">
     <AppHeader hasUser={this.data.hasUser} />
       <div className="container">
         {this.data.loggingIn ? this.loading() : this.getView()} 
       </div> 
      </div>; 
    } 
  }
);

标题:

没什么大不了的,我们根据用户状态更改品牌链接。然后我们检查 hasUser (作为 App 组件的 prop 传递)以更改要显示的导航组件。

AppHeader = React.createClass({ 
  mixins: [ ReactMeteorData ],
  getMeteorData() { 
    return { brandLink: !!Meteor.user() ? '/hidden' : '/login' }; }, 

    render() { 
      return ( <nav className="navbar navbar-default" role="navigation">
       <div className="container"> 
         <div className="navbar-header">
           <button type="button" className="navbar-toggle collapsed" data-toggle="collapse" data-target="#navbar-collapse"><span className="sr-only">Toggle navigation</span><span className="icon-bar"></span> <span className="icon-bar"></span><span className="icon-bar"></span>
           </button>
           <a className="navbar-brand" href={this.data.brandLink}>AuthExample</a>
         </div> 
         {this.props.hasUser ? <AuthenticatedNavigation /> : <PublicNavigation />} 
       </div> 
     </nav> ); 
    } 
  });

AuthenticatedNavigation 组件:

AuthenticatedNavigation = React.createClass({ 
  currentUserEmail() { 
    return Meteor.user().emails[0].address; 
  },

  logout( event ) { 
    event.preventDefault(); 

    return Meteor.logout( () =>
       FlowRouter.go( '/login' ) ); 
  },
  render() { 
    return <div id="navbar-collapse" className="collapse navbar-collapse"> 
      <ul className="nav navbar-nav">
        <li className={FlowHelpers.currentRoute( 'hidden' )}><a href="/hidden">Hidden</a>
        </li> 
      </ul> 
      <ul className="nav navbar-nav navbar-right"> 
        <li className="dropdown">
          <a href="#" className="user-profile-toggle dropdown-toggle clearfix" data-toggle="dropdown">{this.currentUserEmail()} <span className="caret"></span> 
          </a> 
          <ul className="dropdown-menu" role="menu"> 
            <li><a href="/preferences">Account Preferences</a></li> 
             <li className="logout" onClick={this.logout}><a href="#">Logout</a></li> 
          </ul> 
        </li> 
      </ul> 
    </div>;
    } 
 });

公共(public)导航组件:

PublicNavigation = React.createClass({ 
  render() { 
     return ( 
       <div id="navbar-collapse" className="collapse navbar-collapse"> 
        <ul className="nav navbar-nav navbar-right"> 
          <li className={FlowHelpers.currentRoute( 'login' )}> 
           <a href={FlowHelpers.pathFor( 'login' )}>Login</a> 
         </li> 
       </ul>
     </div> ); 
    } 
  }
);

查看https://themeteorchef.com/snippets/authentication-with-react-and-flow-router/了解更多详情。

关于node.js - 在 React 中呈现的 Blaze LoginButtons 模板 - 登录仅适用于主页,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37993244/

相关文章:

javascript - 无法让子钩子(Hook)接收状态

javascript - 如何调试不会从 MongoDB 检索数据的 JavaScript?

Linux - 使用平移和缩放创建动画 gif

Node.js - 如何使用访问/身份验证 token ?

javascript - 如何在 meteor 模板上使用 if 条件?

mongodb - meteor Mocha 测试订阅

reactjs - 入口点未定义 = ./index.html

Node.js 连接到 Squelize

javascript - 使用coffeescript时定义Meteor集合; ReferenceError 说集合未定义

reactjs - 如何将reactJS应用程序部署到Heroku