redux-persist 黑名单不起作用

Wel*_*elp 6 javascript reactjs redux react-redux redux-persist

我想将我的一些减速器列入黑名单,因为我的状态树越来越大,我收到了这个错误:

无法将调试会话写入 localStorage: DOMException: Failed to execute 'setItem' on 'Storage': 设置 'redux-persist' 的值超出配额。(...)"

我找到的解决方案是将一些不需要持久化的减速器列入黑名单。所以我在我的App.js

import React, { Component } from 'react';
import { Provider } from 'react-redux';
import { BrowserRouter as Router, Route, Switch } from 'react-router-dom';
import { persistStore } from 'redux-persist'
import { Initializer } from './components';
import store from './store';

class App extends Component {
  constructor() {
    super()
    this.state = { rehydrated: false }
  }

  componentWillMount(){
    persistStore(store, { blacklist: ['project', 'comment', 'project', 'jobOrder']}, () => {
      this.setState({ rehydrated: true })
    }) 
  }

render() {
    if(!this.state.rehydrated)
      return <Initializer />;

    return (
      <Provider store={store}>
        <Router>
          <div>
            <Switch>
              ... some Routes
            </Switch>
          </div>
        </Router>
      </Provider>
    );
  }
}

export default App; 
Run Code Online (Sandbox Code Playgroud)

我有这个rootReducer

import { reducer as formReducer } from 'redux-form'

import { combineReducers } from 'redux';
import userAuthReducer from './userAuthReducer';
import jobOrderReducer from './jobOrderReducer';
import clientReducer from './clientReducer';
import userReducer from './userReducer';
import persistReducer from './persistReducer';
import commentReducer from './commentReducer';
import projectReducer from './projectReducer';
import teamReducer from './teamReducer';

export default combineReducers({
    userAuth: userAuthReducer,
    jobOrder: jobOrderReducer,
    job_order: jobOrderReducer,
    client: clientReducer,
    user: userReducer,
    form: formReducer,
    persist: persistReducer,
    comment: commentReducer,
    project: projectReducer,
    team: teamReducer
});
Run Code Online (Sandbox Code Playgroud)

我的 persistReducer.js

import { PERSIST } from '../actions/types';

export default (state = [], action) => {
    switch(action.type) {
        case PERSIST:
            return { ...state, ...action.payload }
        default:
            return state;   
    }
};
Run Code Online (Sandbox Code Playgroud)

和我的 store.js

import { compose, createStore, applyMiddleware } from 'redux';
import { autoRehydrate } from 'redux-persist';
import thunk from 'redux-thunk';
//import logger from 'redux-logger';

import rootReducer from './reducers';

const store = createStore(
    rootReducer, 
    {}, 
    compose(
        applyMiddleware(thunk, /*logger*/), 
        autoRehydrate())
    );

//persistStore(store);
export default store;
Run Code Online (Sandbox Code Playgroud)

但是运行该应用程序,我仍然得到列入黑名单的持久状态,如您在此处所见:

持久化状态日志

我尝试将黑名单键更改为:

persistStore(store, { blacklist: ['reduxPersist:project', 'reduxPersist:comment', 'reduxPersist:project', 'reduxPersist:jobOrder']}, () => {
      this.setState({ rehydrated: true })
    }) 
Run Code Online (Sandbox Code Playgroud)

但关键仍然存在......如何正确地做到这一点?

小智 1

我在这里阅读了这篇文章,作者提出了一个很好的观点,黑名单并不是在你的 redux 存储中寻找属性的名称,而是在你的状态中寻找属性的名称。我也有同样的困惑。

在开发工具中仔细检查本地存储中实际保存的内容。确保您将正确的姓名列入黑名单。