Одноэлементный объект в реале
Я новичок в реагировании 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.