开发者问题收集

reactjs universal-cookie 包调用 get() 时出错

2020-08-25
10029

我有以下两个组件。它们位于单独的 .js 文件中。

import Cookie from 'universal-cookie'
class Comp1{

   someFunction(){
      // Call google Oauth
      // get userinfo from Oauth response and set the token below
      var cookie = New Cookie();
      cookies.set('user', user, { path: '/' })
      this.props.history.push('/Comp2')
      window.location.reload()
   }

}

---------------------------------------------------------

import cookie from 'universal-cookie'
class Comp2{

   anotherFunction(){
       var user = cookie.get('user');
   }

}

第二个组件抛出以下错误:

TypeError: universal_cookie__WEBPACK_IMPORTED_MODULE_4__.default.get is not a function

我该如何解决?

更新:google oauth 流程

3个回答

首先, var cookie = New Cookie(); 会导致语法错误。

使用 var cookie = new Cookie(); 作为 JavaScript 关键字,作为键敏感的关键字。

其次,您的导入再次与大小写不一致:

import Cookie from 'universal-cookie'

import cookie from 'universal-cookie'

这些会引起混淆。您将需要重构它以在组件之间进行标准化。例如,只需选择大写字母“C”:

import Cookie from 'universal-cookie'

最后,考虑到我提到的大小写敏感性&正如其他人提到的,您需要将 Cookie 实例化为 它是一个类 。您的组件应如下所示:

import Cookie from 'universal-cookie';

class Comp extends React.Component {
  ...
  someFunction() {
    var cookie = new Cookie();
    cookie.set('user', "somecookie", { path: '/' })
  }
  ...
}

import Cookie from 'universal-cookie'

class Comp extends React.Component {
    ...
    someFunction() {
        var cookie = new Cookie();
        console.log(cookie.get('user'));
    }
    ...
}

CodeSandBox: https://codesandbox.io/s/universal-cookie-react-components-8lc3m

另外,仅供参考,请勿使用隐身模式测试我的沙盒

在此处输入图片说明

95faf8e76605e973
2020-08-28

我认为问题在于您没有在第二个代码块中调用 new Cookie(); ,因此 get 和 set 等方法未初始化。

您可以尝试这种方法,每次想要访问 cookie 时都调用 new。

import Cookie from 'universal-cookie'
class Comp2 {
   anotherFunction(){
       var cookie = New Cookie();
       var user = cookie.get('user');
   }
}

或者您可以创建一个可以从任何地方访问的“全局”变量。 由于您正在单独的文件中访问 globalCookie ,因此您必须将初始化代码放在一个文件中,该文件在包含使用 globalCookie 变量的代码的文件之前被调用/导入。 但是使用全局变量时请务必小心,因为它们很容易在代码中引入难以发现的 bug。

import Cookie from 'universal-cookie';
var globalCookie = New Cookie();

class Comp1{
   someFunction(){
      globalCookie.set('user', user, { path: '/' })
   }
}
class Comp2{
   anotherFunction(){
       var user = globalCookie.get('user');
   }
}

请参阅 github repo 中的文档: https://github.com/reactivestack/cookies/tree/master/packages/universal-cookie

Daniel Dyrnes
2020-08-28

您的 Comp2 中有 import cookie from 'universal-cookie' 。 将其替换为 import Cookie from 'universal-cookie'

ttannerma
2020-08-28