javascript - 如何使用中间件在 Redux 应用程序中编写 localStorage?

标签 javascript reactjs redux middleware

我正在创建一个应用程序,它使用 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);
}};

我已将reducer写入reducers文件夹中的不同文件中。

reducers/index.js -:

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

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

export default rootReducer;

还有另一个 reducer reducer /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以及如何传入<Provider>标签的存储属性?

最佳答案

我建议您使用redux-persist .

Persist and rehydrate a redux store

使用此中间件,您在 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>
  );
};

关于javascript - 如何使用中间件在 Redux 应用程序中编写 localStorage?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53065359/

相关文章:

javascript - 如何从 ExtJS 存储中过滤精确匹配的值

javascript - 在 Mongoose 中使用 "Ref"获取 mongo 数据时出现问题

reactjs - 在 react-router V4 中,我如何以编程方式设置查询字符串参数?

reactjs - iframe src 属性在我的 React 应用程序中更改为 data-src

reactjs - 如何避免在 redux thunk 中使用单独的 _PENDING _FULFILLED 和 _REJECTED 操作?

javascript - 如何隐藏基于复选框的值,包括选中时必需的值(包括下拉框版本)

javascript - Angular 2 + 如何使用相同的选择器选择和循环多个元素(elementRef.nativeElement)

reactjs - jsonserver 不使用重写器重定向

javascript - 导入 redux 表单后未拾取操作

javascript - 如何在 React/Redux 中打印标准化数据