首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使用ReactJs获取当前用户

如何使用ReactJs获取当前用户
EN

Stack Overflow用户
提问于 2020-12-25 11:33:10
回答 3查看 2K关注 0票数 2

我正试图实现一种调用当前用户登录信息的方法,因为我将在AppJs中创建和if和else语句,查看他是否是一个成员,如果不是,他可以看到用户页面,如果不能,也可以重定向到主页如何存储数据:

代码语言:javascript
运行
复制
  import React, { Component } from 'react';
import { Link } from 'react-router-dom';
import PropTypes from 'prop-types';
import { connect } from 'react-redux';
import { loginUser } from '../../actions/authActions';
import classnames from 'classnames';
import { Button, Col, Form } from 'react-bootstrap';

class Login extends Component {
  constructor() {
    super();
    this.state = {
      storeUrl: '',
      errors: {},
    };
  }
  componentDidMount() {
    if (this.props.auth.isAuthenticated) {
      this.props.history.push('/backoffice');
    }
  }

  componentWillReceiveProps(nextProps) {
    if (nextProps.auth.isAuthenticated) {
      this.props.history.push('/backoffice');
    }

    if (nextProps.errors) {
      this.setState({
        errors: nextProps.errors,
      });
    }
  }

  onChange = (e) => {
    this.setState({ [e.target.id]: e.target.value });
  };

  onSubmit = (e) => {
    e.preventDefault();

    const userData = {
      storeUrl: this.state.storeUrl,
    };
    this.props.loginUser(userData);
  };
  render() {
    const { storeUrl, errors } = this.state;
    return (
      <>
        <div className='container-fluid'>
          <div className='row no-gutter'>
            <div className='d-none d-md-flex align-items-center col-md-4 col-lg-6 bg-image'>
              <div className='vd-hero vd-hero--transparent'>
                <img
                  src={require('../../img/logo.svg')}
                  alt=''
                  className='logo mx-auto'
                />
                <h1 className='vd-hero-headline'>
                  Join 25,000+ retailers already growing their business with
                  PosHub
                </h1>
              </div>
              <img
                src={require('../../img/signup-bag.svg')}
                srcSet={require('../../img/signup-bag.svg')}
                sizes='(max-width: 1400px) 1000px,
                    2000px'
                className='signup-bag'
                alt=''
              />
              <div className='curve'></div>
            </div>
            <div className='col-md-8 col-lg-6'>
              <div className='d-flex justify-content-between'>
                <div className='backHome'>
                  <i className='primaryBlue fa fa-arrow-circle-left'></i>{' '}
                  <Link to='/' className='underline'>
                    Back to Home
                  </Link>
                </div>
                <div className='sign-in'>
                  Not registered?{' '}
                  <Link to='/register' className='underline'>
                    Sign up now
                  </Link>
                </div>
              </div>
              <div className='login d-flex align-items-center pb-5'>
                <div className='container'>
                  <div className='row'>
                    <div className='col-10 mx-auto'>
                      <div className='vd-hero vd-hero--transparent'>
                        <h1 className='vd-hero-headline h1-customize'>
                          Log in to your account
                        </h1>
                      </div>
                      <Form onSubmit={this.onSubmit}>
                        <Form.Row>
                          <Form.Group as={Col}>
                            <Form.Label>Store URL</Form.Label>
                            <div className='suffix'>
                              <Form.Control
                                type='url'
                                id='storeUrl'
                                placeholder='Enter storeUrl'
                                value={storeUrl}
                                error={errors.storeUrl}
                                autoComplete='something-unsupported'
                                onChange={this.onChange}
                                className={classnames('form-control', {
                                  invalid: errors.storeUrl,
                                })}
                              />
                              <span className='red-text'>
                                {errors.storeUrl}
                                {errors.storeUrlnotfound}
                              </span>
                            </div>
                          </Form.Group>
                        </Form.Row>
                        <Button
                          className='btn btn-primary btn-block btn-lg'
                          variant='primary'
                          type='submit'
                        >
                          Log In
                        </Button>
                      </Form>
                    </div>
                  </div>
                </div>
              </div>
            </div>
          </div>
        </div>
      </>
    );
  }
}

Login.propTypes = {
  loginUser: PropTypes.func.isRequired,
  auth: PropTypes.object.isRequired,
  errors: PropTypes.object.isRequired,
};

const mapStateToProps = (state) => ({
  auth: state.auth,
  errors: state.errors,
});

export default connect(mapStateToProps, { loginUser })(Login);

App.js

代码语言:javascript
运行
复制
import React from 'react';
import Home from './components/layout/Home';
import {
  BrowserRouter as Router,
  Switch,
  Route,
  Redirect,
} from 'react-router-dom';
import User from './components/layout/users/User';
import AddUser from './components/layout/users/AddUser';
import EditUser from './components/layout/users/EditUser';
import { Provider } from 'react-redux';
import store from './store';
import jwt_decode from 'jwt-decode';
import setAuthToken from './util/setAuthToken';
import { setCurrentUser, logoutUser } from './actions/authActions';

if (localStorage.jwtToken) {
  const token = localStorage.jwtToken;
  setAuthToken(token);
  const decoded = jwt_decode(token);
  store.dispatch(setCurrentUser(decoded));
  const currentTime = Date.now() / 1000;
  if (decoded.exp < currentTime) {
    store.dispatch(logoutUser());
    window.location.href = './login';
  }
}
 const {user } = this.users


function App() {

  return (

    <Provider store={store}>
      <Router>
        <div className='App'>
          {/* <NavBar /> */}
          <Route path='/forget/password' component={ForgotPassword} exact />

          <Switch>
            <Route path='/' component={HomePage} exact />
            <Route path='/register' component={Register} exact />
            <Route path='/login' component={Login} exact />
            <Route path='/backoffice' component={Home} exact />
            {/* Transaction */}
            <PrivateRoute path='/transactions' component={Transactions} exact />
            <PrivateRoute
              path='/transactions/new'
              component={AddTransactions}
              exact
            />
            <PrivateRoute
              path='/transactions/edit/:id'
              component={EditTransactions}
              exact
            />
            <PrivateRoute
              path='/transactions/returns'
              component={Returns}
              exact
            />
            <PrivateRoute
              path='/transactions/returns/new'
              component={AddReturns}
              exact
            />
            <PrivateRoute
              path='/transactions/returns/edit/:id'
              component={EditReturns}
              exact
            />
            <PrivateRoute
              path='/transactions/preorders'
              component={PreOrders}
              exact
            />
            <PrivateRoute
              path='/transactions/preorders/new'
              component={AddPreOrders}
              exact
            />
            <PrivateRoute
              path='/transactions/preorders/edit/:id'
              component={EditPreOrders}
              exact
            />

            {/* Loyalty */}
            <PrivateRoute
              path='/loyalty/cashbackQuota'
              component={CashBack}
              exact
            />
            <PrivateRoute
              path='/loyalty/settings'
              component={LSettings}
              exact
            />

            {/* Projects */}
            <PrivateRoute path='/products' component={Products} exact />
            <PrivateRoute path='/products/new' component={AddProducts} exact />
            <PrivateRoute
              path='/products/edit/:id'
              component={EditProducts}
              exact
            />
            <PrivateRoute
              path='/products/pricebooks'
              component={PriceBooks}
              exact
            />
            <PrivateRoute
              path='/products/pricebooks/new'
              component={AddPriceBooks}
              exact
            />
            <PrivateRoute
              path='/products/pricebooks/edit/:id'
              component={EditPriceBooks}
              exact
            />
            {/* onlinonlineStore */}
            <PrivateRoute
              path='/onlineStore/gettingStarted'
              component={GettingStarted}
              exact
            />
            <PrivateRoute
              path='/onlineStore/orders'
              component={OnlineOrders}
              exact
            />
            <PrivateRoute
              path='/onlineStore/orders/new'
              component={AddOrders}
              exact
            />
            <PrivateRoute
              path='/onlineStore/orders/edit/:id'
              component={EditOrders}
              exact
            />
            <PrivateRoute
              path='/onlineStore/appearance'
              component={Appearance}
              exact
            />
            <PrivateRoute
              path='/onlineStore/setup'
              component={OnlineStoreSetup}
              exact
            />
            <PrivateRoute
              path='/onlineStore/marketing'
              component={OnlineMarketing}
              exact
            />

            <PrivateRoute
              path='/onlineStore/payouts'
              component={OnlinePayouts}
              exact
            />
            <PrivateRoute path='/qrordering' component={QROrder} exact />
            {/* Send SMS */}
            <PrivateRoute
              path='/products/suppliers'
              component={Suppliers}
              exact
            />
            <PrivateRoute
              path='/products/suppliers/new'
              component={AddSupplier}
              exact
            />
            <PrivateRoute
              path='/products/suppliers/edit/:id'
              component={EditSupplier}
              exact
            />
            {/* Stocks */}
            <PrivateRoute
              path='/stocks/supplyNeeds'
              component={SupplyNeeds}
              exact
            />
            <PrivateRoute
              path='/stocks/supplyNeeds/new'
              component={AddSupplyNeeds}
              exact
            />
            <PrivateRoute
              path='/stocks/supplyNeeds/edit/:id'
              component={EditSupplyNeeds}
              exact
            />
            <PrivateRoute
              path='/stocks/purchaseOrders'
              component={PurchaseOrders}
              exact
            />
            <PrivateRoute
              path='/stocks/purchaseOrders/new'
              component={AddPurchaseOrders}
              exact
            />
            <PrivateRoute
              path='/stocks/purchaseOrders/edit/:id'
              component={EditPurchaseOrders}
              exact
            />
            <PrivateRoute
              path='/stocks/stockReturn'
              component={StockReturn}
              exact
            />
            <PrivateRoute
              path='/stocks/stockReturn/new'
              component={AddStockReturn}
              exact
            />
            <PrivateRoute
              path='/stocks/stockReturn/edit/:id'
              component={EditStockReturn}
              exact
            />
            <PrivateRoute
              path='/stocks/stocktakes'
              component={StockTakes}
              exact
            />
            <PrivateRoute
              path='/stocks/stockTransfers'
              component={StockTransfers}
              exact
            />
            <PrivateRoute
              path='/stocks/stockTransfers/new'
              component={AddStockTransfer}
              exact
            />
            <PrivateRoute
              path='/stocks/stockTransfers/edit/:id'
              component={EditStockTransfer}
              exact
            />
            <PrivateRoute
              path='/stocks/auditTrail'
              component={AuditTrail}
              exact
            />
            <PrivateRoute path='/promotions' component={Promotions} exact />
            <PrivateRoute
              path='/promotions/new'
              component={AddPromotions}
              exact
            />
            <PrivateRoute
              path='/promotions/edit/:id'
              component={EditPromotions}
              exact
            />
            <PrivateRoute path='/promotions/cfds' component={Cfds} exact />
            <PrivateRoute path='/customers' component={Customers} exact />
            <PrivateRoute
              path='/customers/new'
              component={AddCustomers}
              exact
            />
            <PrivateRoute
              path='/customers/edit/:id'
              component={EditCustomers}
              exact
            />
            {/* Report */}
            <PrivateRoute
              path='/reports/sales/over-time'
              component={OverTime}
              exact
            />
            <PrivateRoute
              path='/reports/sales/product'
              component={ProductSales}
              exact
            />
            <PrivateRoute
              path='/reports/sales/category'
              component={Category}
              exact
            />
            <PrivateRoute
              path='/reports/sales/variant'
              component={Variant}
              exact
            />
            <PrivateRoute path='/reports/sales/sku' component={Sku} exact />
            {/* Profile */}
            {/* <PrivateRoute
              path='/reports/sales/employee'
              component={Profile}
              exact
            /> */}
            <PrivateRoute
              path='/reports/sales/employee'
              component={SaleEmployee}
              exact
            />
            <PrivateRoute
              path='/reports/sales/transaction-channel'
              component={TransactionC}
              exact
            />
            <PrivateRoute
              path='/reports/sales/payment-method'
              component={PaymentMethod}
              exact
            />
            <PrivateRoute
              path='/reports/sales/shifts'
              component={Shifts}
              exact
            />
            <PrivateRoute
              path='/reports/loyalty'
              component={ReportLoyal}
              exact
            />
            <PrivateRoute
              path='/reports/products/stockValue'
              component={StockValue}
              exact
            />
            <PrivateRoute
              path='/reports/products/pre-order'
              component={PreOrdersReport}
              exact
            />
            <PrivateRoute
              path='/reports/promotions'
              component={ReportPromotions}
              exact
            />
            <PrivateRoute path='/reports/bir/pos' component={POSReport} exact />
            <PrivateRoute
              path='/reports/bir/zreadings'
              component={ZReadReport}
              exact
            />
            <PrivateRoute path='/employees' component={Employees} exact />
            <PrivateRoute path='/employees/new' component={AddEmployee} exact />
            <PrivateRoute
              path='/employees/edit/:id'
              component={EditEmployee}
              exact
            />

            <PrivateRoute
              path='/employees/timesheets'
              component={Timesheets}
              exact
            />
            <PrivateRoute
              path='/employees/performance'
              component={EmployeePerformance}
              exact
            />
            <PrivateRoute
              path='/employees/activityLog'
              component={ActivityLog}
              exact
            />
            <PrivateRoute path='/settings/account' component={Accounts} exact />
            <PrivateRoute path='/settings/tax' component={Tax} exact />
            <PrivateRoute
              path='/settings/paymentOptions'
              component={PaymentOptions}
              exact
            />
            <PrivateRoute
              path='/settings/billing/plans'
              component={BillingPlans}
              exact
            />
            <PrivateRoute
              path='/settings/billing/sms'
              component={SmsPOS}
              exact
            />
            <PrivateRoute
              path='/settings/stores'
              component={SettingsStore}
              exact
            />
            <PrivateRoute
              path='/settings/stores/new'
              component={AddSettingsStore}
              exact
            />
            <PrivateRoute
              path='/settings/stores/edit/:id'
              component={EditSettingsStore}
              exact
            />
            <PrivateRoute
              path='/settings/bank-accounts'
              component={BankAccounts}
              exact
            />
            <PrivateRoute
              path='/settings/bank-accounts/new'
              component={AddBankAccounts}
              exact
            />
            <PrivateRoute
              path='/settings/bank-accounts/edit/:id'
              component={EditBankAccounts}
              exact
            />
            <PrivateRoute
              path='/settings/receipts'
              component={Receipts}
              exact
            />
            <PrivateRoute
              path='/settings/receipts/new'
              component={AddReceipts}
              exact
            />
            <PrivateRoute
              path='/settings/receipts/edit/:id'
              component={EditReceipts}
              exact
            />
            <PrivateRoute
              path='/settings/registers'
              component={Registers}
              exact
            />
            <PrivateRoute
              path='/settings/ipad-layouts'
              component={IpadLayouts}
              exact
            />
            <PrivateRoute path='/settings/addOns' component={AddOns} exact />
            <PrivateRoute path='/support/help' component={Help} exact />
            <PrivateRoute
              path='/support/featureRequest'
              component={FeatureRequest}
              exact
            />

{user.status === 'Member' ? (
    <>
      <PrivateRoute path="/admin/users" component={User} exact />
      <PrivateRoute path="/admin/users/create" component={AddUser} exact />
      <PrivateRoute path="/admin/users/edit/:id" component={EditUser} exact />
    </>
  ) : (
    <Redirect to="/backoffice" />
  )}
        

            {/* HomePage */}
            <Route path='/pricing' component={PricingPlans} exact />
            <Route path='/multi-store' component={MultiStore} exact />
            <Route path='/why-choose-poshub' component={WhyPosHub} exact />
            {/* Navbar Right */}
            <Route path='/contact-sales' component={ContactSales} exact />
            <Route path='/get-selling' component={GetSelling} exact />
            <Route path='/examples' component={BusinessTypes} exact />
            <Route
              path='/examples/sports-and-outdoors-pos'
              component={SportsOutdoors}
              exact
            />
            <Route
              path='/examples/homeware-and-gift-shop-pos'
              component={HomewareStores}
              exact
            />
            <Route
              path='/examples/fashion-boutique-pos'
              component={FashionBoutique}
              exact
            />
            <Route path='/grow-more' component={GrowMore} exact />
            <Route path='/add-the-smarts' component={AddSmarts} exact />
            <Route path='/tour' component={FeatureOverview} exact />
            <Route path='/tour/point-of-sale' component={PointOfSale} exact />
            <Route path='/enterprise' component={Enterprise} exact />
            <Route path='/get-started' component={GetStarted} exact />
            <Route path='/retail-resource-hub' component={AllResources} exact />
            <Route
              path='/tour/pos-reporting'
              component={ReportingInsights}
              exact
            />
            <Route path='/tour/hardware-solutions' component={Hardware} exact />
            <Route
              path='/tour/inventory-management-software'
              component={InventoryManagement}
              exact
            />
            <Route
              path='/tour/customer-management-software'
              component={CustomerManagement}
              exact
            />
            <Route path='/tour/pos-support' component={AwardSupport} exact />
            <Route
              path='/tour/ecommerce-solutions'
              component={EcommerceSolutions}
              exact
            />
            <Route
              path='/customers-case-studies'
              component={CaseStudies}
              exact
            />
            <Route
              path='/tour/accept-payments'
              component={AcceptPayments}
              exact
            />
            <Route path='/security' component={Security} exact />
            <Route
              path='/tour/pos-integrations-add-ons'
              component={HomeAddOns}
              exact
            />
            <Route path='/scanner' component={HomeScanner} exact />

          </Switch>

        </div>
      </Router>
    </Provider>
  );
}



export default App;

但问题是,它说用户没有定义,所以如何制作一个const并调用它。谢谢你的帮忙

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2020-12-25 14:42:34

创建自定义路由器

代码语言:javascript
运行
复制
const UserMemberRoute = ({ component: Component, ...rest }) => (
  <Route
    {...rest}
    render={props => ((user || {}).status === 'Member' ? (
      <Component {...props} />
    ) : (
      <Redirect to={{
        pathname: '/backoffice',
        state: {
          from: props.location
        }
      }}
      />
    )
    )}
  />
);

在任何你需要的地方使用这条路线

代码语言:javascript
运行
复制
<UserMemberRoute path="/admin/users" component={User} exact />
<UserMemberRoute path="/admin/users/create" component={AddUser} exact />
<UserMemberRoute path="/admin/users/edit/:id" component={EditUser} exact />

这是实现自定义路线的有效方法。

票数 0
EN

Stack Overflow用户

发布于 2020-12-25 11:43:50

user对象在开始时可能没有定义。

您应该在尝试访问.status之前添加初始检查。

代码语言:javascript
运行
复制
if(!user) {
  return null
};

return {
  user.status === 'Member' ? (
    <>
      <PrivateRoute path="/admin/users" component={User} exact />
      <PrivateRoute path="/admin/users/create" component={AddUser} exact />
      <PrivateRoute path="/admin/users/edit/:id" component={EditUser} exact />
    </>
  ) : (
    <Redirect to="/backoffice" />
  )
}
票数 1
EN

Stack Overflow用户

发布于 2020-12-25 12:17:25

路由器中有可能传递道具--可以这样做:

代码语言:javascript
运行
复制
<Route path={routes.myProfile} component={() => <MyProfile user ={user}/>} />

接下来,在MyProfile组件中,您可以使用currentUser access,比如props

另外,考虑到currentUser信息在不同组件中使用了很多次,因此可以将其存储在全局访问中,例如:

storage

  • context

  • redux

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

https://stackoverflow.com/questions/65447682

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档