如果我们想使用redux,第一步需要通过
yarn add redux
来安装redux
安装成功后就需要去创建一个store,怎么创建呢,非常的简单,在src下面创建一个文件夹,这个文件夹名字就叫做store,里面有个index.js,reducer.js
 
index.js
import { createStore } from 'redux';
// 创建store的时候需要把笔记本传递给store
import reducer from './reducer';
/**
* window.__REDUX_DEVTOOLS_EXTENSION__ && window.__REDUX_DEVTOOLS_EXTENSION__()
* 这句话的意思是如果页面上安装了redux devtools这个扩展,那么就在页面上使用这个工具
* 有了这个工具之后,再去做redux的调试就非常方便了
*/
const store = createStore(reducer, window.__REDUX_DEVTOOLS_EXTENSION__ && window.__REDUX_DEVTOOLS_EXTENSION__()); export default store;

reducer.js

// 创建笔记本,笔记本里面放了很多图书馆的操作,存储数据情况
/**
* state里面放的就是整个图书馆里面的图书信息,对于redux就是整个存储的数据
* action
* todolist里面创建了action这句话,到那时store并不知到怎么去改变,需要把数据传给笔记本,让笔记本告诉我怎么处理,
* 很好的一件事情,store会自动的去传递这件事情
* 那么这个时候就知道reducer里面这个state是什么,上一次存储的state,action是什么,传递过来的那句鹄
*/
const defaultState = {
inputValue: '',
list: [,]
}; /**
* reducer 可以接收state,但是绝不能修改state,所以返回给store,store去自动替换
* store发生改变,但页面并没有改变,需要在页面上去接收,怎么接收
* 通过 store.subscribe 接收
*/ export default (state = defaultState, action)=> {
if( action.type === 'change_input_value') {
const newState = JSON.parse(JSON.stringify(state));
newState.inputValue = action.value;
return newState; // return给了store
}
if (action.type === 'add_todo_item') {
const newState = JSON.parse(JSON.stringify(state));
newState.list.push(newState.inputValue);
newState.inputValue = '';
return newState;
} console.log(state, action)
return state;
}

todolist

import React, {Component} from 'react';
import { Input, Button, List } from 'antd';
import 'antd/dist/antd.css';
import store from './store/index' class TodoList extends Component{
constructor(props){
super(props);
this.state = store.getState();
this.handleInputChange = this.handleInputChange.bind(this);
this.handleStoreChange = this.handleStoreChange.bind(this);
this.handleBtnClick = this.handleBtnClick.bind(this);
store.subscribe(this.handleStoreChange);
}
render() {
return (
<div style={{margin:'10px'}}>
<Input
placeholder="todo info"
value={this.state.inputValue}
onChange = {this.handleInputChange}
style={{width:'300px', marginRight:'10px'}}
/>
<Button type="primary" onClick={this.handleBtnClick}>提交</Button>
<List
style={{width:'300px', marginTop:'10px'}}
size="small"
bordered
dataSource={this.state.list}
renderItem={item => (<List.Item>{item}</List.Item>)}
/>
</div> )
}
handleInputChange(e){
// 去改变store里面的内容,首先要创建一句话,告诉store
const action = {
type: 'change_input_value',
value: e.target.value
}
// 那么怎么把这句话传给store呢,store里面有个方法叫做dispatch,这个方法就可以把这句话传给store
store.dispatch(action);
}
handleStoreChange() {
/**
* 当我感知到数据发生变化的时候,我去调用store.getState()从store里面重新去取数据
* 然后调用setState替换掉当前组件里面的数据
*/
this.setState(store.getState())
}
handleBtnClick() {
// 首先数据改变了,要去修改store里面的内容,首先要创建一个action
const action = {
type: 'add_todo_item'
}
// action创建好了,要传递过去,store会自动转发给reducer
store.dispatch(action);
}
} export default TodoList;

最新文章

  1. javase--&gt;基础知识(二)
  2. ko trick
  3. 转: Rest简介及Spring实现
  4. WCF第二天
  5. 学习配置vsftp 进行ftp文件的传输
  6. 【经验】Angularjs 中使用 layDate 日期控件
  7. [POJ3279]Fliptile(开关问题,枚举)
  8. android NDK 开发步骤
  9. Linux系统下快速删除某个目录下大量文件
  10. [转]在 Mac OS X上编译 libimobiledevice 的方法
  11. RobHess的SIFT源码分析:综述
  12. vue2 3d 切换器
  13. msf向存在漏洞的apk注入payload
  14. ZooKeeper leader election
  15. linux安装jdk1.8(rpm方式)
  16. 从xtrabackup备份恢复单表
  17. Yarn Node Labels
  18. 1333:【例2-2】Blah数集
  19. 【Java】-NO.16.EBook.4.Java.1.005-【疯狂Java讲义第3版 李刚】- 枚举
  20. asp.net上传文件夹

热门文章

  1. centos 安装xrdp远程连接桌面
  2. Caused by java.lang.IllegalStateException Not allowed to start service Intent { cmp=com.x.x.x/.x.x.xService }: app is in background uid UidRecord(一)
  3. like模糊查询%注入问题
  4. centOS7关闭防火墙的命令
  5. 如何运营亿级QPS的Redis系统
  6. C# 深入理解String
  7. C# url获取图片流转字符串
  8. 多结果集IMultipleResult接口
  9. css控制文本单行或者多行溢出显示为省略号...
  10. Javascript 自定义输出