Redux管理状态-todoList实现

1、redux是什么?9

  Redux就是React的状态管理工具

2、安装Redux: 

  cnpm install -S redux

3、创建Store

  我们在src下建一个store文件,里面有index,和reducer

 

下面我们创建store

 

 

//数据(可以是ajax请求的)
const defaultStaet = {
    //input的value
    inputValue: '',
    //未完成的
    listW: [],
    //已完成的
    listY: []
}

//导出
export default (state = defaultStaet, action) => {
   

    return state
}

store文件夹下面的index里引入reducer

import { createStore } from 'redux';
import reducer from './reducer';
export default createStore(reducer)

整体代码

List组件

import React, { Component } from 'react'
//子组件Input
import Input from './Input';
//store
import store from './store/index';

export default class List extends Component {
    constructor() {
        super()
        //获取store里的数据
        this.state = store.getState()
        //监听store,实时改变state数据
        store.subscribe(() => {
            this.setState(store.getState())
        })
    }

    //inputvalue的值
    myInputValue(e) {
        const action = {
            type: 'input-value',
            value: e.target.value
        }
        //每输入传给store
        store.dispatch(action)
    }

    //点击button按钮
    myButtonClick() {
        //获取输入框传给store里inputValue的值
        const action = {
            type: 'button-value',
            value: this.state.inputValue
        }
        //把值传给store
        store.dispatch(action)
    }

    //绑定键盘事件
    myKeyDown(e) {
        //判断是否摁下的是enter
        if (e.keyCode === 13) {
            //调用添加事件
            this.myButtonClick()
        }
    }

    //checkbox点击事件
    myCheckedChange(i, e) {
        if (e.target.checked) {
            //splice切割出来当前点击的
            let arr = this.state.listW.splice(i, 1)[0]
            //checked取反值
            arr.checked = !arr.checked
            const action = {
                type: 'checked-listW',
                value: arr
            }
            //把更改以后的数组传给store
            store.dispatch(action)
        } else {
            //splice切割出来当前点击的
            let arr = this.state.listY.splice(i, 1)[0]
            //checked取反值
            arr.checked = !arr.checked
            const action = {
                type: 'checked-listY',
                value: arr
            }
            //把更改以后的数组传给store
            store.dispatch(action)
        }
    }

    //删除按钮(未完成的)
    myButtonDeleteW(i) {
        //把当前点击的splice切割出来
        this.state.listW.splice(i, 1)
        const action = {
            type: 'listW-delete',
            value: this.state.listW
        }
        //把切割以后的数传给store
        store.dispatch(action)
    }

    //删除按钮(已完成的)
    myButtonDeleteY(i) {
        //把当前点击的splice切割出来
        this.state.listY.splice(i, 1)
        const action = {
            type: 'listY-delete',
            value: this.state.listY
        }
        //把切割以后的数传给store
        store.dispatch(action)
    }

    //点击内容改为可编辑状态
    myItemUpdate(e) {
        e.target.contentEditable = true
    }

    //数去焦点
    myItemBlur(i, e) {
        //把当前修改的数据的内容重新修改
        this.state.listW.splice(i, 1, { 'value': e.target.innerHTML, 'checked': false })
        const action = {
            type: 'item-update',
            value: this.state.listW
        }
        //改为不可编辑状态
        e.target.contentEditable = false
        //把修改后新的数组传给store
        store.dispatch(action)
    }

    render() {
        return (
            <React.Fragment>
                {/* 使用input */}
                {/* 把父组件方法myKeyDown传给子组件 */}
                {/* 把父组件方法myButtonClick传给子组件 */}
                {/* 把父组件里的this.state.inputValue传给子组件 */}
                {/* 把父组件方法myInputValue传给子组件 */}
                <Input myKeyDown={this.myKeyDown.bind(this)} myButtonClick={this.myButtonClick.bind(this)} value={this.state.inputValue} myInputValue={this.myInputValue.bind(this)} />
                {
                    <ul>
                        <h3>正在进行 ({this.state.listW.length})</h3>
                        {/* 遍历正在进行的 */}
                        {this.state.listW.map((item, index) => {
                            return <li key={index}>
                                <input type="checkbox" checked={item.checked ? true : false} onChange={this.myCheckedChange.bind(this, index)} />
                                <span onClick={this.myItemUpdate.bind(this)} onBlur={this.myItemBlur.bind(this, index)}>{item.value}</span>
                                <button onClick={this.myButtonDeleteW.bind(this, index)}>删除</button>
                            </li>
                        })}
                    </ul>
                }
                {
                    <ul>
                        <h3>已完成 ({this.state.listY.length})</h3>
                        {/* 遍历已完成的 */}
                        {this.state.listY.map((item, index) => {
                            return <li key={index}>
                                <input type="checkbox" checked={item.checked ? true : false} onChange={this.myCheckedChange.bind(this, index)} />
                                <span>{item.value}</span>
                                <button onClick={this.myButtonDeleteY.bind(this, index)}>删除</button>
                            </li>
                        })}
                    </ul>
                }
            </React.Fragment>
        )
    }
}

Input组件

import React, { Component } from 'react'

export default class Input extends Component {
    render() {
        return (
            <div>
                {/* value:实时更新value */}
                {/* onKeyDown键盘事件 */}
                {/* onChange实时监听input的value */}
                <input type="text" value={this.props.value} onKeyDown={this.props.myKeyDown} onChange={this.props.myInputValue} />
                {/* 点击添加事件 */}
                <button onClick={this.props.myButtonClick}>添加</button>
            </div>
        )
    }
}

reducer

//数据(可以是ajax请求的)
const defaultStaet = {
    //input的value
    inputValue: '',
    //未完成的
    listW: [],
    //已完成的
    listY: []
}

//导出
export default (state = defaultStaet, action) => {
    //input框输入的值
    if (action.type === 'input-value') {
        const newState = state
        //赋值给newState.inputValue
        newState.inputValue = action.value
        return newState
    }

    //点击button提交的内容
    if (action.type === 'button-value') {
        const newState = state
        //把input框的值以键值对push到,listWli。实现添加
        newState.listW.push({ 'value': action.value, 'checked': false })
        return newState
    }

    //点击checked,
    if (action.type === 'checked-listW') {
        const newState = state
        // 把当前点击的push到listYli,实现未完成的拿出来放到已完成里
        newState.listY.push(action.value)
        return newState
    }

    //点击checked
    if (action.type === 'checked-listY') {
        const newState = state
        // 把当前点击的push到listWli,实现已完成的拿出来放到未完成里
        newState.listW.push(action.value)
        return newState
    }

    //点击删除
    if (action.type === 'listW-delete') {
        const newState = state
        //把删除以后新的数组赋值给listW
        newState.listW = action.value
        return newState
    }

    //点击删除
    if (action.type === 'listY-delete') {
        const newState = state
        //把删除以后新的数组赋值给listY
        newState.listY = action.value
        return newState
    }
    //点击更新内容
    if (action.type === 'item-update') {
        const newState = state
        //把更改以后新的数组赋值给listW
        newState.listW = action.value
        return newState
    }

    return state
}
posted @ 2020-01-06 20:56  林小冉  阅读(241)  评论(1编辑  收藏  举报