# 升级 Redux - React-Redux
React-Redux 主要解决了 Redux 里状态需要通过props
一层一层往下传递的问题, 同时不用手动订阅(绑定 render 函数).
# 基本使用
# 创建 store
// index.js
import { createStore } from "redux";
import { Provider } from "react-redux";
const reducer = (state, action) => {
if (state === undefined) {
return { n: 0 };
} else {
if (action.type === "add") {
return { n: state.n + action.payload };
} else {
return state;
}
}
};
const store = createStore(reducer);
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 创建 Provider
// index.js
ReactDOM.render(
<Provider store={store}>
<App />
</Provider>,
document.getElementById("root")
);
1
2
3
4
5
6
7
2
3
4
5
6
7
我们将store
放在Provider
里. 我们可以在<App />
内部任意组件直接获取state
.
# mapStateToProps
& mapDispatchToProps
接下来, 我们就要在组件里获取state
, 并发起更改请求:
// App.js
import { connect } from "react-redux"; //用于连接state, action 与组件
function mapStateToProps(state) {
return {
n: state.n
};
}
function mapDispatchToProps(dispatch) {
return {
add1: () => dispatch({ type: "add", payload: 1 })
};
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
任何组件想要获取state
和发起dispatch
都要声明这两个函数.
// App.js
class App extends Component {
render() {
return (
<div>
你点击了 <span id="value">{this.props.n}</span> 次
<div>
<button id="add1" onClick={() => this.props.add1()}>
+1
</button>
</div>
</div>
);
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
mapStateToProps
和mapDispatchToProps
函数把store
里的状态和action
映射到当前组件的props
里, 我们就通过props
来操作. 最后调用connect
将组件与 map 函数绑定并导出:
// App.js
export default connect(mapStateToProps, mapDispatchToProps)(App);
1
2
3
2
3
# 总结
状态的初始值都在store
里, store
被放在Provider
里. 各个组件通过 map 函数把状态和 action 映射到组件的 props 上. 最后通过connect
函数将 map 函数与组件绑定在一起.