使用Redux编写简单的TodoList

创建项目

我使用的是create-react-app安装的TodoList项目

安装相关依赖

cnpm i antd redux

创建如图目录

1567515510500-20256c6d-9678-405e-96ad-96dfcfc317c8.png

代码及相关解释

index.js

import React from 'react';
import ReactDOM from 'react-dom';
import TodoList from './TodoList';
ReactDOM.render(<TodoList />, document.getElementById('root'));

TodoList.js

import React, { Component } from 'react'
import 'antd/dist/antd.css'
import { Input, Button, List } from 'antd';
// 引入store,进行redux与react之间的数据信息交互
import store from './store/index.js';
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)
        this.handleItemDelete = this.handleItemDelete.bind(this)
        // subscribe订阅store传来的数据
        store.subscribe(this.handleStoreChange);
    }
    render() {
        return (
            <div>
                <div style={{ marginTop:'10px', marginLeft:'10px', marginBottom:'10px'}}>
                    <Input 
                    placeholder="Todo Info" 
                    value={this.state.inputValue} 
                    style={{width:'300px',marginRight:'10px'}} 
                    onChange={this.handleInputChange}
                    />
                    <Button 
                    type="primary"
                    onClick={this.handleBtnClick}
                    >提交</Button>                    
                </div>
                <div style={{ marginLeft:'10px',width:'300px' }}>
                    <List
                        size="small"
                        bordered
                        dataSource={this.state.list}
                        renderItem={(item,index) => <List.Item onClick={this.handleItemDelete.bind(this,index)}>{item}</List.Item>}
                    />   
                </div>
            </div>
        )
    }
    // 执行input框内容
    handleInputChange(e){
        // 创建一个action用于执行输入框输入这一动作,这个动作包括用户的所要执行的动作信息和传输的数据,type:定义的动作类型,value:传输的数据
        const action = {
            type:'change_input_value',
            value:e.target.value
        }
        // 调用dispath方法将action传递给store
        store.dispatch(action);
    }
    // 数据的同步更新
    handleStoreChange() {
        // 同步更新数据
        this.setState(store.getState())
    }
    // 添加功能
    handleBtnClick() {
        const action = {
            type:'add_todo_item',
        };
        store.dispatch(action);
    }
    // 删除功能,index(上面传过来的)
    handleItemDelete(index) {
        const action = {
            type:'delete_todo_item',
            index
        }
        store.dispatch(action);
    }
}
export default TodoList;

store/index.js

// 引入redux中的createStore方法
import { createStore } from 'redux';
// 将管理员的小本本(reducer)引入过来让其与管理员配对,这个小本本就是属于这个管理员的
import reducer from './reducer'
// 定义一个store去管理这个小本本
const store = createStore(reducer);
export default store;

store/reducer.js

const defaultState = {
    inputValue:'',
    list: []
}
// reducer能够接收state,但是不能够修改state
export default (state = defaultState ,action) => {
    // state:存储数据 
    // action:用户传过来的那句话
    // 这里我们能够获得了TodoList.js传过来的信息,接下来我们拿到这些信息进行处理判断
    if(action.type === 'change_input_value') {
        // 深拷贝,我们想要将接收到的value实时的显示在页面上,我们就必须修改defaultState中的数据,但是reducer又绝不能进行修改state,所以我们进行深拷贝,修改拷贝后的内容。
        const newState = JSON.parse(JSON.stringify(state));
        newState.inputValue = action.value;
        return newState;
    }
    if(action.type === 'add_todo_item') {
        const newState = JSON.parse(JSON.stringify(state));
        newState.list.push(newState.inputValue);
        newState.inputValue = '';
        return newState;
    }
    if(action.type === 'delete_todo_item') {
        const newState = JSON.parse(JSON.stringify(state));
        newState.list.splice(action.index,1);
        return newState;
    }
    return state;
}

使用redux实现简单的todolist功能
1567516151710-cb61a96f-b45b-4cb4-a0bd-16824e608c6e.png

1567516241290-e1fd9c0c-d947-46ca-a958-72fd76d0bd41.png

1567516271021-171441d6-0e51-40b4-8c53-d991c57dd998.png

Last modification:September 6th, 2019 at 01:10 pm
如果觉得我的文章对你有用,请随意赞赏