【问题标题】:Safari reporting "Unexpected token 'const' " when I open my React App当我打开我的 React 应用程序时,Safari 报告“Unexpected token 'const'”
【发布时间】:2020-06-03 07:25:48
【问题描述】:

我的 React App 在 Safari 中打开时遇到问题,尤其是我的私人路由。错误:

SyntaxError: Unexpected token 'const'

我有普通的root功能:

function App() {
  return (
    <Router history={history}>
      <Switch>
        <Route path="/" exact component={Home} />
        <Route path="/login" component={Login} />
        <PrivateRoute path="/dash" component={Dashboard} />
        <PrivateRoute path="/filters" component={Filters} />
        <PrivateRoute path="/profile" component={Profile} />
        <PrivateRoute path="/map" component={Map} />
        <PrivateRoute path="/bookmarks" component={Bookmarks} />
        <PrivateRoute path="/client/:planID/:isLarge" component={Client} />
        <PrivateRoute
          path="/analyses/:planID/:isLarge"
          component={Analyses}
        />
      </Switch>
    </Router>
  );
}

问题出在这个 PrivateRoute 上,因为当我删除导入和标签时,它没有显示错误。这是我的私人路线文件:

import React from "react";
import { Route, Redirect } from "react-router-dom";

const PrivateRoute = ({ component: Component, ...rest }) => {
  return (
    <Route
      {...rest}
      render={props =>
        sessionStorage.getItem("Token") ? (
          <Component {...props} />
        ) : (
          <Redirect to="/login" />
        )
      }
    />
  );
};
export default PrivateRoute;

我怀疑返回中的某些内容不适合 Safari,但我不知道是什么。这也在 Chrome、Mozilla、IE 和 Edge 上以这种方式工作。只有 Safari 有问题。

更新:

这是 Safari 中的问题截图:

【问题讨论】:

  • 在return语句前试试这个; const token = sessionStorage.getItem("Token")。然后在返回语句中,使用“令牌”进行登录检查。
  • @MwamiTovi 同样的问题
  • 哦,真的!认为这会工作

标签: javascript ios reactjs safari


【解决方案1】:

修好了!问题是箭头函数声明。 Safari 5.1 真的很糟糕,为了更好地适应所有浏览器,最好避免使用 ES6 语法箭头函数。从此:

const PrivateRoute = ({ component: Component, ...rest }) => {
  return (
    <Route
      {...rest}
      render={props =>
        sessionStorage.getItem("Token") ? (
          <Component {...props} />
        ) : (
          <Redirect to="/login" />
        )
      }
    />
  );

我将代码转换为:

function PrivateRoute({ component: Component, ...rest }) {
  return (
    <Route
      {...rest}
      render={function(props) {
        return sessionStorage.getItem("Token") ? (
          <Component {...props} />
        ) : (
          <Redirect to="/login" />
        );
      }}
    />
  );

【讨论】:

  • 很高兴你能解决这个问题。为了实现浏览器的兼容性,我们最好避免使用箭头函数,对吧?
  • @MwamiTovi 是的,似乎最好的做法是避免使用 ES6 功能,因为并非所有浏览器都理解 ES6。
  • 注意点。我非常喜欢箭头功能。但现在我明白了为什么即使在官方的 React 文档中“大部分”都使用普通函数。可能是为了提醒我们谨慎使用箭头函数:(
  • 这就是为什么您使用像 Babel 这样的转译器,这样您就可以在 es6 中编写代码并将其转换为 es5 以供生产。
猜你喜欢
  • 2018-02-03
  • 2017-03-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-03
  • 2018-01-04
  • 1970-01-01
  • 2013-07-08
相关资源
最近更新 更多