为什么要用 Redux
在平时开发中,使用Redux
最多的场景应该是进行React
开发的时候了。而 React
只是用于构建用户界面的 JS 库,如果涉及到复杂的组件通信仅仅使用React
的话代码将变得非常冗余且难以维护;
而Redux
则是帮助组件通信的一个库,因此适当地使用 Redux
会使得有复杂组件通信逻辑的项目更加轻盈、易读。
Redux 原理
我们先从组件开始分析,当组件要想更改仓库的数据时,它必须通过 Action Creators
向仓库发出一个 action
;
当仓库接收到一个 action
时,仓库本身是不知道如何处理的,它只能将这个 action
和当前状态交给 Reducers
处理;
当 Reducers
处理完毕以后将会返回一个新状态给仓库;
但注意此时仓库的状态是更新了,但是组件并没有接受到仓库更新的消息,如果要在相应信息更新后组件也跟着更新,则组件要订阅一下仓库,这个就像订报纸、关注某个人一样的,你只有订了报纸或者点了关注,那么当天的动态你才能接收到,否则别人发生了什么事你都不会知道;
TodoList 案例
接下来本文将会使用一个 TodoList案例 来演示 redux 的运用
src 目录结构
|-- app.css
|-- App.js
|-- index.js
|-- store
|-- actionCreators.js
|-- index.js
|-- reducer.js
App.js
import React, {
Component } from 'react';
import './app.css'
import {
Input, Button, List } from "antd";
import store from "./store";
import {
submit, deleteItem, inputAction} from "./store/actionCreators";
class App extends Component{
constructor(props) {
super(props);
this.handleInput = this.handleInput.bind(this);
this.subscribe = this.subscribe.bind(this);
this.handleSubmit = this.handleSubmit.bind(this);
this.state = store.getState();
store.subscribe(this.subscribe);
}
render() {
const {
list, inputValue } = this.state;
return(
<div className="App">
<div className="input-field">
<Input
placeholder={
'todo info'}
style={
{
width: '270px', marginRight: '10px'}}
value={
inputValue}
onChange={
this.handleInput}
/>
<Button
type={
'primary'}
children={
'提交'}
onClick={
this.handleSubmit}
/>
</div>
<List
bordered
dataSource={
list}
style={
{
width: '270px'}