【发布时间】:2017-10-04 03:35:47
【问题描述】:
假设我有一个 Home 组件,它只是执行 api 调用以从服务器获取所有作业:
import React, { Component } from 'react';
import { fetchHomeWorks } from '../actions';
import HomeWorkRow from '../component/HomeWorkRow';
class Home extends Component {
componentDidMount() {
this.props.fetchHomeWorks()
}
renderHomeWorks() {
const { home_works, error, loading } = this.props;
if(!error) {
if(!loading){
if(home_works.length >=1) {
return home_works.map(home_work => {
return <HomeworkRow key={uuid()} home_work={home_work} />
})
}
else
return <p className="pt-card col-xs-12 col-xs-offset-1 content"> No Task Yet :)</p>
}
else
return <p>Loading...</p>
}
}
render() {
return (
<Layout>
{ this.props.renderHomeworks() }
</Layout>
);
}
}
const mapStateToProps = ({ home_work, persist }) => {
return {
home_works: home_work.home_works,
persist:
};
};
export default connect(mapStateToProps, { fetchHomeWorks })(Home);
在页面刷新时,由于 componentDidMount() 生命周期,它当然会执行 api 调用。现在,我想更改它并使用 redux-persist 使用 persisted 数据,这样它就可以避免每次页面调用 api刷新了……
我正在使用redux-persist 库..
这是我使用 redux persist() 的应用程序组件:
import React, { Component } from 'react';
import { Provider } from 'react-redux';
import {
BrowserRouter as Router,
Route,
} from 'react-router-dom';
import { compose, createStore, applyMiddleware } from 'redux';
import {persistStore, autoRehydrate} from 'redux-persist';
import thunk from 'redux-thunk';
import logger from 'redux-logger';
import rootReducer from './reducers/';
class App extends Component {
render() {
const store = createStore(rootReducer, {}, compose(applyMiddleware(thunk, logger), autoRehydrate()));
persistStore(store);
return (
<Provider store={store}>
<Router>
<div>
<Route exact path="/" component={LoginForm} />
// ... some routes which doesnt matter
</div>
</Router>
</Provider>
);
}
}
export default App;
由于 redux 记录器,我知道 resux persist 正在工作
现在,我如何获得持久状态的值?我尝试制作另一个减速器:
persistReducer
从'../actions/types'导入{ PERSIST };
export default (state = [], action) => {
switch(action.type) {
case PERSIST:
return { ...state, persistState: action.payload }
default:
return state;
}
};
并将其添加到rootReducer:
import { reducer as formReducer } from 'redux-form'
import { combineReducers } from 'redux';
import homeWorkReducer from './userReducer';
import persistReducer from './persistReducer';
export default combineReducers({
home_works: homeWorkReducer,
form: formReducer,
persist: persistReducer
});
在我的Home 组件中,我使用
componentWillReceiveProps(nextProps) {
if(nextProps.persist.persistState) {
console.log(nextProps.persist.persistState.home_works.home_works)
}
}
那么如何正确做呢?
【问题讨论】:
-
对不起,我正在尝试分析它。考虑到您当前的设置,这实际上是一个非常好的问题。您显然已经安装了 redux-persist,可能完全正确。我看到你的 mapStateToProps 里面有一个冒号。这绝对是您的代码中的错误,不确定当前是否在您的项目中。在我看来,您的商店应该以
this.props.persist的形式保存在组件中,这是一个包含通常在reducer 内state上的属性的对象。感觉离工作很近。看起来只是使用持久存储的问题。 -
其他人分析,你需要检查github.com/rt2zz/redux-persist
-
您知道吗,看起来它应该在您的组件中以
this.props.persist.persistState的形式出现。你可以在你的渲染方法中 console.log 看看它是否显示数据吗?或 nextProps,大声笑,我已经筋疲力尽了。看起来它应该可以工作了。
标签: javascript reactjs redux persist