【问题标题】:How to write localStorage in a Redux app using middleware?如何使用中间件在 Redux 应用程序中编写 localStorage?
【发布时间】:2018-10-30 13:26:29
【问题描述】:

我正在创建一个应用程序,它使用 openweather API 获取用户输入的城市列表及其各自的天气。因此,我希望在刷新页面后保留这些城市。我知道如何使用浏览器 localStorage API 持久化数据。但我不知道如何通过中间件将其持久化并将其传递给提供者。

以下是我的主要 Index.js 文件-:

import React from 'react';
import ReactDOM from 'react-dom';
import { Provider } from 'react-redux';
import { createStore, applyMiddleware } from 'redux';
import ReduxPromise from 'redux-promise';

import App from './components/app';
import reducers from './reducers';
import {loadState,saveState} from './localStorage';

const persistedState=loadState();
const store=createStore(persistedState);

store.subscribe(()=>{
store.getState()
});

const createStoreWithMiddleware =
     applyMiddleware(ReduxPromise)(createStore);

ReactDOM.render(
<Provider store={createStoreWithMiddleware(reducers)}>
<App />
</Provider>
, document.querySelector('.container-fluid'));

这是localStorage.js文件-:

export const loadState=()=>{
try{
    const serializedState=localStorage.getItem('state');
    if(serializedState===null){
        return undefined;
    }
    return JSON.parse(serializedState);
}catch(err){
    return undefined;
}
};

export const saveState=(state)=>{
try {
    const serializedState=JSON.stringify(state);
    localStorage.setItem('state',serializedState);
}catch(err){
    console.log(err);
}};

我已经在 reducers 文件夹的不同文件中编写了 reducer。

reducers/index.js -:

import { combineReducers } from 'redux';
import WeatherReducer from './reducer_weather';

const rootReducer = combineReducers({
weather:WeatherReducer
});

export default rootReducer;

还有另一个减速器 reducers/reducer_weather.js -:

import {FETCH_WEATHER} from '../actions/index';
import {DELETECITY} from '../actions/deleterow';
export default function(state=[],action){

switch(action.type){
    case FETCH_WEATHER:
        console.log([action.payload.data, ...state]);
        return [action.payload.data, ...state];
    case DELETECITY:
        console.log([...state].filter((weather)=>{
            return weather.city.id!==action.payload
        }));
        return [...state].filter((weather)=>{
            return weather.city.id!==action.payload
        });
    default:
        return state;

    }; 
}

在使用 localStorage 持久化应用程序状态之前,我的代码运行良好。但现在它向我显示了一个错误。我遇到了关于const createStoreWithMiddleware = applyMiddleware(ReduxPromise)(createStore);的问题

如何通过这个中间件使用 store 以及如何传入&lt;Provider&gt; 标签的 store 属性?

【问题讨论】:

    标签: javascript reactjs redux middleware


    【解决方案1】:

    我建议你使用redux-persist

    坚持并补充一个 redux 存储

    使用此中间件,您在 Redux Store 中的所有数据将自动持久化到 localStorage(也可以使用不同类型的存储)。因此,当您刷新页面时,先前请求中已持久化的数据将自动重新水化(推送)回 Store。


    示例,取自文档:

    配置

    // configureStore.js
    
    import { createStore } from 'redux'
    import { persistStore, persistReducer } from 'redux-persist'
    import storage from 'redux-persist/lib/storage' // defaults to localStorage for web and AsyncStorage for react-native
    
    import rootReducer from './reducers'
    
    const persistConfig = {
      key: 'root',
      storage,
    }
    
    const persistedReducer = persistReducer(persistConfig, rootReducer)
    
    export default () => {
      let store = createStore(persistedReducer)
      let persistor = persistStore(store)
      return { store, persistor }
    }
    

    用法

    import { PersistGate } from 'redux-persist/integration/react'
    
    // ... normal setup, create store and persistor, import components etc.
    
    const App = () => {
      return (
        <Provider store={store}>
          <PersistGate loading={null} persistor={persistor}>
            <RootComponent />
          </PersistGate>
        </Provider>
      );
    };
    

    【讨论】:

    • 感谢您的回答。但是在我的主 index.js 文件中,我应该在哪里使用createStoreWithMiddleware(reducers)
    • 我想在 Provider 标签的 store 属性中提供结果。 @JordanEnev
    • 首先,您没有将正确的参数传递给createStore 函数。您应该将减速器作为第一个参数传递,而不是传递预加载状态。预加载状态 (persistedState) 应作为第二个参数传递。另外我建议您查看applyMiddleware 文档以及如何使用它。
    • 但是,我建议您使用redux-persist。它易于配置,并且与您想要的功能完全相同。只需将其配置到您的项目中,您就可以即时获得 localStorage 持久性。为什么不试试呢?
    猜你喜欢
    • 2016-05-20
    • 2020-05-17
    • 2019-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-08
    • 1970-01-01
    • 2016-10-25
    相关资源
    最近更新 更多