前言

index.js

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

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;
}

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中的函数就会改变
        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;

Last modification:October 19th, 2019 at 04:36 pm
如果觉得我的文章对你有用,请随意赞赏