React-Native 如何实现全局变量(例如存放userToken)



  • 如题,请前辈们不吝赐教


  • administrators

    使用global,其类似web中的window
    例如

    global.userToken = '***';
    
    
    //则在其他地方可以读取
    console.log(userToken);
    

    如果需要持久化的存储,推荐使用 https://github.com/sunnylqm/react-native-storage



  • 感谢,刚才不知道这种写法去stackoverflow找到了另外一种也能实现就是麻烦点,

    // Global.js
    var Global = {};
    module.exports = Global;
    // 调用的页面
    let Global = require('./Global');
    Global.userToken = 'token';

    根据
    http://stackoverflow.com/questions/33117227/setting-environment-variable-in-react-native/33134782#33134782

    另外像global这种全局变量还有哪些?从哪些.js文件中能查到所有的吗?


  • administrators

    @dev_dxy 全局变量只有一个



  • 通过官方的AsyncStorage的本地存储不行么?我觉得挺方便的。



  • @sunnylqm
    刚刚我表达的不对,

    像fetch、JSON这种随处可调用的对象\函数都是从哪引入的呢,文件开头我仅仅require('react-native')



  • @张益达
    AsyncStorage 是持久化,具体的实现还没有看这部分源码,但在Android环境下应该就是调用的Sharepreferences
    这是做持久化用的 可以在一定意义上理解为永久存储,像我的需求里存储用户名密码可以用这个
    存储userToken这种临时数据肯定要用变量的
    用户名和密码在一定意义上理解为常量,userToken有失效期所以是理解成变量



  • @dev_dxy 了解~我理解错意思了。:mask:



  • @dev_dxy fetch、JSON这些都是全局变量,这是为了与浏览器环境兼容。

    然而我们编写的模块,应尽可能遵循CommonJS/ES6 Module规范,避免直接使用全局变量。

    每个代码文件导出的模块,其实都可以视作一个“全局”变量,不论在哪require/import到的都是同一个实例(存在循环引用的情况除外),并且这个对象和模块文件名绑定,相当于拥有了一个命名空间,避免全局污染。

    除此以外,存放userToken这种业务型数据,也可以考虑存放在全局的redux store中(而store本身通常是作为一个模块导出的),这样所有的thunk action都可以通过getState获取到token,并且还可以结合asyncstorage等进行离线存储,就更为方便了。

    另外,考虑浏览器过去的开发习惯和对服务器的兼容,userToken直接存在cookie里,客户端不做任何操作,也不失为一种选择。



  • @tdzl2003
    感谢,稍微理解一些了。看来还是要先去补习一下JS内存结构结构才行



  • @tdzl2003
    “同一个实例”是什么意思呢?我们每次 import xx from “XX”回来的对象都是同一个对象?如在其他地方修改了这个对象,那再次import回来的对象也是修改后的对象?


  • administrators

    @xsgkaka
    Try before you ask



  • @晴明 这个是不是已经失效了.


登录后回复