【发布时间】:2019-08-23 09:27:06
【问题描述】:
我正在寻找一种在刷新浏览器时将state 存储在本地的解决方案。
我们的应用有许多带有语言选择器的翻译,但目前在浏览器刷新时,此状态会重置为默认值。
在应用程序中,根据授权,我们将选择的语言保存到 Firebase,onMount 会显示选择的用户语言,但是,在我们未经身份验证的页面上,例如登录页面和创建页面,这是不可能的。
目前,使用Context as 选择语言并将其存储为状态
import React, { useReducer } from 'react';
// Translations
import EN from '../../../constants/translations/en.json';
import TR from '../../../constants/translations/tr.json';
import ES from '../../../constants/translations/es.json';
interface InterfaceState {
langCode?: string;
translate?: any;
dispatch: any;
}
const translations: any = {
en: EN,
tr: TR,
es: ES
};
const getTranslate = (langCode: string) => (key: string | number) =>
translations[langCode][key] || key;
const initialState = {
langCode: 'en',
translate: getTranslate('en'),
dispatch: ''
};
export const I18nContext = React.createContext<InterfaceState>(initialState);
export const I18nContextProvider = ({ children }: any) => {
const reducer = (state: any, action: { type: any; payload: any }) => {
switch (action.type) {
case 'setLanguage':
return {
langCode: action.payload,
translate: getTranslate(action.payload)
};
default:
return { ...initialState };
}
};
const [state, dispatch] = useReducer(reducer, initialState);
const value = { ...state, dispatch };
return <I18nContext.Provider value={value as any}>{children}</I18nContext.Provider>;
};
语言选择器使用useContext 设置状态,这在用户刷新浏览器并应用默认langCode 之前工作正常。
我尝试过的一个解决方案有效,但需要大量维护,特别是因为它需要我向Link 组件添加额外的步骤,即添加到history.push(pathname) 并使用langCode 添加一个字符串查询一个字符串作为
const onLanguageSelect = (data: any) => {
dispatch({ type: 'setLanguage', payload: data.value });
history.push(location.pathname + `?lang=` + data.value);
};
我的问题,如何将所选状态存储到 session 或 local 存储?这是一个可行且可扩展的解决方案吗,尤其是跨多个域(如 app.example.com 和 example.com)?
【问题讨论】:
-
也许你应该把你的状态放到
localStorage -
我已经调查过了,但没有找到在多个域中使用
localStorage的方法。 -
multiple domains是什么意思? -
app.example.com 和 example.com
-
Cookie 怎么样?
标签: javascript reactjs