当前使用 Redux 存在的问题:
- 冗余代码太多, 每次使用都需要在构造函数中获取 Redux 存储的内容
- 每次使用都需要监听和取消监听
- 操作 store 的代码过于分散
如何解决冗余代码太多问题
- 使用 React-Redux
React-Redux 概述
- React-Redux 是 Redux 官方的绑定库, 能够让我们在组件中更好的读取和操作 Redux 中保存的状态
官方文档地址:https://react-redux.js.org/introduction/quick-start
使用 React-Redux
- 安装 React-Redux
npm install react-redux
根据官方文档介绍,我们需要利用一个 Provider 包裹我们的根组件也就是 App.js 只要利用 Provider 将祖先组件包裹起来, 并且通过 Provider 的 store
属性将 Redux 的 store
传递给 Provider
, 那么就可以在所有后代中直接使用 Redux 了。
- 修改 App.js
import ReactDOM from 'react-dom';
import React from 'react';
import App from './App';
import {BrowserRouter} from 'react-router-dom';
import {Provider} from 'react-redux';
import store from "./store/store";
ReactDOM.render(
<Provider store={store}>
<BrowserRouter>
<App/>
</BrowserRouter>
</Provider>,
document.getElementById('root')
);
- 在
mapStateToProps
方法中告诉React-Redux
, 需要将store
中保存的哪些数据映射到当前组件的props
上
const mapStateToProps = (state) => {
return {
count: state.count
}
};
- 在
mapDispatchToProps
方法中告诉React-Redux
, 需要将哪些派发的任务映射到当前组件的props
上
const mapDispatchToProps = (dispatch) => {
return {
increment() {
dispatch(addAction(1));
}
}
};
- 通过 props 来使用 redux 中保存的数据
class Home extends React.PureComponent {
render() {
return (
<div>
<p>{this.props.count}</p>
<button onClick={() => {
this.props.increment()
}}>递增
</button>
</div>
)
}
}
- 最后在导出组件的时候使用
connect
进行关联起来
export default connect(mapStateToProps, mapDispatchToProps)(Home);
- 最终 Home.js 组件代码如下
import React from 'react';
import {connect} from 'react-redux'
import {addAction} from '../store/action';
class Home extends React.PureComponent {
render() {
return (
<div>
<p>{this.props.count}</p>
<button onClick={() => {
this.props.increment()
}}>递增Home
</button>
</div>
)
}
}
const mapStateToProps = (state) => {
return {
count: state.count
}
};
const mapDispatchToProps = (dispatch) => {
return {
increment() {
dispatch(addAction(1));
}
}
};
export default connect(mapStateToProps, mapDispatchToProps)(Home);