单身对象反应原生

Rav*_*ran 28 react-native

我是反应原生的新手.我想将多个小的小字符串存储到普通的单例对象类,并希望从单个对象中为所有组件访问它.任何人都可以帮我单身对象实现反应原生.

防爆

组件1 - 登录按钮 - >>成功 - >需要将userID存储到singleton对象中.

组件2 - >从单例对象获取存储的userID.我该如何实现它.

Yes*_*Jay 45

这是一个简单的方法...

export default class CommonDataManager {

    static myInstance = null;

    _userID = "";


    /**
     * @returns {CommonDataManager}
     */
    static getInstance() {
        if (CommonDataManager.myInstance == null) {
            CommonDataManager.myInstance = new CommonDataManager();
        }

        return this.myInstance;
    }

    getUserID() {
        return this._userID;
    }

    setUserID(id) {
        this._userID = id;
    }
}
Run Code Online (Sandbox Code Playgroud)

这是如何使用它...

import CommonDataManager from './CommonDataManager';


// When storing data.
let commonData = CommonDataManager.getInstance();
commonData.setUserID("User1");


// When retrieving stored data.
let commonData = CommonDataManager.getInstance();
let userId = commonData.getUserID();
console.log(userId);
Run Code Online (Sandbox Code Playgroud)

希望这对你有用:)

  • 有一个错字.它应该是`return this.myInstance;` (3认同)

Dan*_*ing 10

我建议创建一个使用AsyncStorage存储数据的静态类.您在评论中提到您已经在使用AsyncStorage,但不喜欢在整个应用程序中传播此功能.(即try-catches所有地方,每个组件都需要检查密钥是否可用等)如果此功能在一个类中,它将清理您的代码很多.

这种方法的另一个好处是你可以很容易地交换实现,例如,你可以选择使用内存中的对象AsyncStorage或者其他什么,你只需要更改这个文件

注意:AsyncStorage存储敏感信息的安全方式.有关安全性和替代方案的更多信息,请参阅此问题AsyncStorage.

也就是说,这就是我想象全局数据持有者类可能看起来的样子:

export default class dataManager {
  static storeKeyValue(key, value) {
    // your choice of implementation:
    // check if key is used
    // wrap in try-catch
    // etc.
  }

  static getValueForKey(key) {
    // get the value out for the given key
  }

  // etc...
}
Run Code Online (Sandbox Code Playgroud)

然后在您的应用中的任何位置使用此类,只需在需要的地方导入,如下所示:

import dataManager from 'path/to/dataManager.js';

// store value
dataManager.storeKeyValue('myKey', 'myValue');

// get value
const storedValue = dataManager.getValueForKey('myKey');
Run Code Online (Sandbox Code Playgroud)

编辑:在大多数情况下,使用Flux, Redux或类似技术可能是首选/建议的方法,但如果你觉得Singleton模式最适合你的应用程序,那么这是一个很好的方法.你可能不需要Redux


Arn*_*nik 4

有一个解决方法,require在编译阶段对所有模块进行反应本机打包以生成捆绑包,并在第一次 require 后为模块生成一个内部 id,从那时起,该 id 将在整个运行时内存中引用,因此,如果我们从文件中导出类的实例,则每次导入该文件时都会引用该对象。

太长了;

解决方案一:

class abc {

}


module.exports = new abc()
Run Code Online (Sandbox Code Playgroud)

解决方案二:我假设您想要获得静态且不会更改的字符串,因此您可以将它们声明为静态并直接使用类名访问它们

仅供参考:这也适用于 webpack。