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·····················

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容