用redux写个todolist的小demo(增删改)

如何用redux写一个todolist呢?实现的功能有增删改

components

input.js

import React, { Component } from 'react'
import store from "../store"
export default class Input extends Component {
    constructor(){
        super()
        this.state = store.getState()
        store.subscribe(this.handleUpdate.bind(this))
        this.status = true
    }
    render() {
        let {inputVal} = this.state
        return (
            <div>
                <input type="text" value={inputVal} onChange={this.handleChange.bind(this)}/>
                <button onClick={this.handleAdd.bind(this)}>添加</button>
            </div>
        )
    }
    handleUpdate(){
        if(this.status){
            this.setState(store.getState())
        } 
    }
    componentWillUnmount(){
        this.status = false
    }
    handleChange(e){
        let value = e.target.value;
        let action = {
            type:"CHANGE_VALUE",
            value
        }
        store.dispatch(action)
    }
    handleAdd(){
        let action = {
            type:"ADD_LIST"
        }
        store.dispatch(action)
    }
}

 

list.js

import React, { Component } from 'react'
import store from "../store"
export default class List extends Component {
    constructor() {
        super()
        this.state = store.getState()
        store.subscribe(this.handleUpdate.bind(this))
    }
    render() {
        let { list } = this.state
        return (
            <div>
                {
                    list.map((item, index) => (
                        <li key={index}>{item}
                        <button onClick={this.handleDel.bind(this,index)}>删除</button>
                        <button onClick={this.handleModify.bind(this,index)}>修改</button>
                        </li>
                    ))
                }
            </div>
        )
    }
    handleUpdate() {
        this.setState(store.getState())
    }
    handleDel(index){
        let action = {
            type:"DEL_LIST",
            value:index
        }
        store.dispatch(action)
    }
    handleModify(index){
        let action = {
            type:"MODIFY_LIST",
            value:index
        }
        store.dispatch(action)
    }
}

modify.js

import React, { Component } from 'react'
import store from "../store"
export default class Input extends Component {
    constructor(){
        super()
        this.state = store.getState()
        store.subscribe(this.handleUpdate.bind(this))
        
        this.status = true
    }
    render() {
        let {inputVal} = this.state
        return (
            <div>
                <input type="text" value={inputVal} onChange={this.handleChange.bind(this)}/>
                <button onClick={this.handleModify.bind(this)}>修改</button>
            </div>
        )
    }
    handleUpdate(){
        if(this.status){
            this.setState(store.getState())
        } 
    }
    componentWillUnmount(){
        this.status = false
    }
    handleChange(e){
        let value = e.target.value;
        let action = {
            type:"CHANGE_VALUE",
            value
        }
        store.dispatch(action)
    }
    handleModify(){
        let action = {
            type:"UPDATE_LIST",
        }
        store.dispatch(action)
    }
}

 

store

index.js

import {createStore} from "redux"
import reducer from "./reducers"

const store = createStore(reducer)

export default store;

reducers.js

/*
    1、必须创建一个初始的state
    2、必须要返回一个纯函数
    3、纯函数中的state只允许读不允许修改   //会导致页面不更新
    4、纯函数必须要返回一个新的state

*/

const defaultState = {
    inputVal: "",
    list: [],
    flag: true,
    indexTO: ""
}
export default (state = defaultState, action) => {
    switch (action.type) {
        case "CHANGE_VALUE":
            state.inputVal = action.value
            let inputValState = Object.assign({}, state)
            return inputValState
        case "ADD_LIST":
            let addState = Object.assign({}, state)
            addState.list.push(addState.inputVal)
            addState.inputVal = ""
            return addState
        case "DEL_LIST":
            let delState = Object.assign({}, state)
            delState.list.splice(action.value, 1)
            return delState
        case "MODIFY_LIST":
            let modifyState = Object.assign({}, state)
            modifyState.flag = !modifyState.flag
            modifyState.inputVal = modifyState.list[action.value]
            modifyState.indexTO = action.value
            return modifyState
        case "UPDATE_LIST":
            let updateState = Object.assign({}, state)
            updateState.list.splice(updateState.indexTO, 1, updateState.inputVal)
            updateState.inputVal = ""
            updateState.flag = !updateState.flag
            return updateState

        default:
            return state
    }

}

 

app.js

import React, { Component } from 'react'
import Input from "./components/input"
import List from "./components/list"
import Modify from "./components/modify"
import store from "./store"
export default class App extends Component {
    constructor() {
        super()
        this.state = store.getState()
        store.subscribe(this.handleUpdate.bind(this))

    }
    render() {
        let { flag } = this.state
        return (
            <div>
                {flag ? <Input /> : <Modify />}
                <List />
            </div>
        )
    }
    handleUpdate() {
        this.setState(store.getState())
    }

}

posted @ 2019-08-20 20:39  SHY13  阅读(488)  评论(0编辑  收藏  举报