Одноэлементный объект в реале

Я новичок в реагировании native.I хочу хранить несколько небольших небольших строк для общего класса объектов Singleton и хочу получить к нему доступ из одного объекта для всех компонентов. Может ли кто-нибудь помочь мне реализовать реализацию однопользовательского объекта для реакции native.

Ex

Компонент 1 - кнопка входа → > успех → необходимо сохранить идентификатор пользователя в одноэлементном объекте.

Компонент 2 → получить сохраненный идентификатор пользователя из одноэлементного объекта. Как я могу реализовать его.

Ответы

Ответ 1

Я предлагаю создать статический класс, который хранит данные, используя AsyncStorage.  Вы упомянули в комментарии, что вы уже используете AsyncStorage, но не любите распространять эту функцию во всем приложении. (т.е. try-catches по всему месту, каждый компонент должен проверить, доступен ли ключ и т.д.). Если эта функциональность была в одном классе, это сильно очистило бы ваш код.

Другим преимуществом этого подхода является то, что вы могли бы легко заменить реализацию, например, вы могли бы использовать объект in-memory или 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...
}

Затем, чтобы использовать этот класс в любом месте вашего приложения, просто импортируйте его там, где это необходимо:

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

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

// get value
const storedValue = dataManager.getValueForKey('myKey');

EDIT: Использование Flux, Redux, или подобная технология, вероятно, является предпочтительным/предлагаемым способом сделать это в большинстве случаев, но если вы чувствуете, что шаблон Singleton работает лучше всего для вашего приложения, тогда это хороший способ. См. Вам не понадобится Redux

Ответ 2

Вот простой способ сделать это...

export default class CommonDataManager {

    static myInstance = null;

    _userID = "";


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

        return myInstance;
    }

    getUserID() {
        return this._userID;
    }

    setUserID(id) {
        this._userID = id;
    }
}

И вот как его использовать...

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);

Надеюсь, это сработает для вас:)

Ответ 3

Существует обходной путь для этого, отредактируйте собственный упаковщик require все модули на этапе компиляции для генерации пакета, и после того, как сначала потребуется, он генерирует внутренний идентификатор для модуля, который с этого момента ссылается на целая память во время выполнения, поэтому, если мы экспортируем экземпляр класса из файла, этот объект будет ссылаться каждый раз, когда этот файл будет импортирован.

TL;DR;

Решение I:

class abc {

}


module.exports = new abc()

Решение II: Я предполагаю, что вы хотите получить свои строки, которые являются статическими и не изменятся, поэтому вы можете объявить их как статические и напрямую обращаться к ним с именем класса

FYI: это также работает с webpack.