P09:用Redux实现ToDoList的删除功能

Posted wgchen~

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了P09:用Redux实现ToDoList的删除功能相关的知识,希望对你有一定的参考价值。

阐述

本文我们用Redux来制作一下删除功能,即在点击 ToDoList中 的列表子项时,删除对应的子项。当然如果你觉的对Redux的流程已经掌握,可以自己先尝试着作一遍,然后再来进行对比。

绑定子项响应事件

打开 src 目录下的 TodoList.js 文件,然后找到 List 组件的 renderItem 属性,
编写代码如下:

<div style=margin:'10px',width:'300px'>
    <List
        bordered
        dataSource=this.state.list
        renderItem=(item,index)=>(<List.Item onClick=this.deleteItem.bind(this,index)>item</List.Item>)
    />    
</div>

然后编写这个 deleteItem() 方法,记得它需要接收一个 index 参数。

deleteItem(index)
    console.log(index)

这时候我们到浏览器预览一下,按 F12 打开控制台,可以看到点击按钮时可以看到控制台输出了对应的数组下标。

在方法里编写Redux的Action

写完绑定方法就可以写action了,在编写时,我们要传递 index 过去,代码如下:

deleteItem(index)
    const action = 
        type:'deleteItem',
        index
    
    store.dispatch(action)

reducer业务逻辑的实现

编写和传递完 action 就可以到 reducer.js 来编写相关的业务逻辑了。

其实要作的就是删除数组下标的对应值。

if(action.type === 'deleteItem' ) 
    let newState = JSON.parse(JSON.stringify(state)) 
    newState.list.splice(action.index,1)  //删除数组中对应的值
    return newState

这时候就做完了这个TodoList组件的基本功能,打开控制台看一下


当然,这个案例还是有很多不足的,我们需要学习更多的知识来完善它,不要走开,下篇文章我们会继续学习。

demo

demo01\\src\\TodoList.js

import React,  Component  from 'react';
import 'antd/dist/antd.css'
import  Input , Button , List  from 'antd'
import store from './store'

class TodoList extends Component 

    constructor(props)
        super(props)
        // 引入store,使用store.getState()方法,获取state
        this.state=store.getState();

        this.changeInputValue= this.changeInputValue.bind(this)
        
        //转变this指向
        this.storeChange = this.storeChange.bind(this)

        //关键代码------------start----------
        this.clickBtn = this.clickBtn.bind(this)
        //关键代码------------end----------
        store.subscribe(this.storeChange) //订阅Redux的状态
    

    render()  
        return ( 
            <div style=margin:'10px'>
                <div>
                    <Input 
                        placeholder=this.state.inputValue 
                        style= width:'250px', marginRight:'10px'
                        onChange=this.changeInputValue
                    />
                    <Button 
                        type="primary"
                        onClick=this.clickBtn
                    >增加</Button>
                </div>
                
                <div style=margin:'10px',width:'300px'>
                    <List
                        bordered
                        dataSource=this.state.list
                        renderItem=(item,index)=>(<List.Item onClick=this.deleteItem.bind(this,index)>item</List.Item>)
                    />    
                </div>

            </div>
         );
    

    deleteItem(index)
        const action = 
            type:'deleteItem',
            index
        
        store.dispatch(action)
    

    changeInputValue(e)
        const action =
            type:'change_input_value',
            value:e.target.value
        
        store.dispatch(action)
    

    storeChange()
        this.setState(store.getState())
    

    clickBtn()
        const action = type:'addItem'
        store.dispatch(action)
     


export default TodoList;

demo01\\src\\store\\reducer.js

const defaultState = 
    inputValue : 'Write Something',
    list:[
        '早上4点起床,锻炼身体',
        '中午下班游泳一小时'
    ]


/*
JSON.parse() 方法将数据转换为 javascript 对象。
JSON.stringify() 方法用于将 JavaScript 值转换为 JSON 字符串。
*/

export default (state = defaultState,action)=>
    // console.log(action.type);
    if(action.type === 'change_input_value')
        let newState = JSON.parse(JSON.stringify(state)) //深度拷贝state
        newState.inputValue = action.value
        return newState
    

    //关键代码------------------start----------
    //state值只能传递,不能使用
    if(action.type === 'addItem') 
        //根据type值,编写业务逻辑
        let newState = JSON.parse(JSON.stringify(state)) 
        
        newState.list.push(newState.inputValue)  //push新的内容到列表中去
        newState.inputValue = ''
        return newState
    
     //关键代码------------------end----------

    if(action.type === 'deleteItem' ) 
        let newState = JSON.parse(JSON.stringify(state)) 
        newState.list.splice(action.index,1)  //删除数组中对应的值
        return newState
    

    return state

以上是关于P09:用Redux实现ToDoList的删除功能的主要内容,如果未能解决你的问题,请参考以下文章

初探react,用react实现一个todoList功能

React+Redux实现简单的待办事项列表ToDoList

初探immutable Redux+immutable实现todolist

初探immutable Redux+immutable实现todolist

Vue实例 实现todolist的添加删除功能

jQuery模仿ToDoList实现简单的待办事项列表