Redux实现一个小todoList

今天刚刚学习了redux,趁热赶紧记录一下,话不多说上代码
最后效果图
image.png

1:安装redux

cnpm  install redux --save

2:安装antd,为了样式好看一点点

cnpm  install antd --save

3:新建一个Todo.js存放页面

import 'antd/dist/antd.css';
import { Input,Button,List } from 'antd';
	render(){
		return(
			<div>
				<div>
					<Input placeholder={this.state.inputValue} style={{'width':250}}
					 onChange={this.changeInputValue} value={this.state.inputValue}
					 />
					<Button type="primary"  onClick={this.addTodo} >增加</Button>
				</div>
				<div>
					<List
					      bordered
					      dataSource={this.state.list}
					      renderItem={(item,index) => (
					        <List.Item onClick={this.deleteItem.bind(this,index)}>
					          {item}
					        </List.Item>
					      )}
					    />
				</div>
			</div>
		)
	}

ps:这里用input来实现具体的功能
4:开始新建一个store文件夹,再新建index.js,图书库

//建立一个仓库
import {createStore} from 'redux';
//引入reducer管理员
import reducer from './reducer.js';
const  store  = createStore(
	reducer,
	window.__REDUX_DEVTOOLS_EXTENSION__ && window.__REDUX_DEVTOOLS_EXTENSION__());

export default store;

这里安装了一个google的redux调试工具,安装步骤很简单,就是去下载一个扩展程序,搜索redux devtools 就可以了
image.png

安装好点开浏览器里面会加一行配置就可以使用了····
5:再次新建一个reducer.js,类似图书管理员

const defaultState={
	inputValue:"我是默认值",
	list:['好好学习react','每天听歌跑跑步','和儿子康康乐乐一起玩耍']
	
};
export default (state=defaultState,action)=>{
	//state是以前的默认值,action是我们输入的新值 
	console.log(state,action);
	//reducer只能接受state,不能改变state
	if(action.type==='changeInput'){
		//深度拷贝
		let  newState = JSON.parse(JSON.stringify(state));
		newState.inputValue = action.value;
		return newState;
	};
	if(action.type==='addItem'){
		let  newState = JSON.parse(JSON.stringify(state));
		newState.list.push(newState.inputValue);
		newState.inputValue='';
		return newState;
	};
	
	if(action.type==='deleteItem'){
		let  newState = JSON.parse(JSON.stringify(state));
		newState.list.splice(action.index,1);
		return newState;
	};
	return state;
}

ps:这里可以定义一个默认的参数defaultState,然后提交改变后,判断type值,改变state后,返回新值newState,他会自动返回store中
6:在Todo.js中的构造器中就可以获取store.getState();

constructor(props) {
	    super(props);
		//获取仓库的默认state参数
		console.log(store.getState());
		//设置放入state
		this.state= store.getState();
		//发布订阅   新版本不需要  但是如果input加上了value 就必须要 否则可以不需要
		store.subscribe(this.storeChange)
	};

效果图
image.png

7:获取值后放入state中就可以了。

                //设置放入state
		this.state= store.getState();

8:来实现input改变后的实践吧

	changeInputValue=(e)=>{
		let value = e.target.value;
		const action={
			type:'changeInput',
			value
		};
		store.dispatch(action);
	};

可以看到分发了一个action,给这个action取名为changeInput,是为了后面的判断具体使用
image.png

9:当store仓库值改变的时候,我们要记得回setState填一下,这样才可以填加数据到state里面

	storeChange=()=>{
		this.setState(store.getState());
	};

10:这个时候基本就可以了,随着input的值改变,都会记录新值和旧值,但是如果input加上value就不行了,就会报错,那么就需要继续监听

 //发布订阅   新版本不需要  但是如果input加上了value 就必须要 否则可以不需要
		store.subscribe(this.storeChange)

image.png

11:好了这个时候就入门了,来做添加和删除吧~~~~
添加事件

	addTodo=()=>{
		let  action={type:'addItem'};
		store.dispatch(action);
	};

所有提交都是定义一个对象,取名type,名字随便‘addItem’,然后分发出去
12:reducer中监听,然后克隆一个新对象,再push进去我们添加的内容,清空输入框,返回这个对象,就大功告成啦

	if(action.type==='addItem'){
		let  newState = JSON.parse(JSON.stringify(state));
		newState.list.push(newState.inputValue);
		newState.inputValue='';
		return newState;
	};

image.png

13:删除同理

	deleteItem(index){
		const  action={index,type:'deleteItem'};
		store.dispatch(action);
	};

传递一个index过去,方便删除
14:reducer.js接受判断

	if(action.type==='deleteItem'){
		let  newState = JSON.parse(JSON.stringify(state));
		newState.list.splice(action.index,1);
		return newState;
	};

image.png
完成OK,最后一步吧action的type提取出去,方便报错找出来了
A:新建一个actionType.js

export const CHANGEINPUT= 'changeInput';

export const  ADDITEM= 'addItem';

export const DELETEITEM = 'deleteItem';

B:修改引入

import {CHANGEINPUT,ADDITEM,DELETEITEM} from './store/actionTypes.js';

一定要注意路径哦!!!!!!
image.png

image.png

完成OK·····················

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值