redux重构(二)添加任务——绑定事件&发送action-回车键&变更数据-最大值Math.max.apply()-深拷贝JSON.parse(JSON.stringify(obj)) & 清空表单

添加任务——绑定事件 & 发送action-回车键-e.keyCode === 13 & 变更数据-最大值Math.max.apply()-深拷贝JSON.parse(JSON.stringify(obj)) & 清空表单

绑定事件;发送action;变更数据

1、绑定事件

src/views/Header.js

render () {
//定义添加任务
  let { addTask } = this.props
  return (
    <div>
      <header className="header">
        <h1>土豆丝</h1>
        <input ref={this.inputRef} onKeyUp={addTask.bind(this)} className="new-todo" placeholder="你想做什么?" />
      </header>
    </div>
  )
}

创建action

新建src/store/ActionCreator.js

/*
  ActionCreator 本质上是函数,用于创建Action

  Action的本质是一个普通对象
*/

export const addTaskAction = (etitle) => {
  return {
    type: 'todos_add',
    etitle: etitle
  }
}
2、发送action

src/views/Header.js

import * as Actions from '../store/ActionCreator.js'

// 将事件函数提供给组件的props
function mapDispatchToProps (dispatch) {
  return {
      //添加任务
    addTask: function (e) {
      if (e.keyCode === 13) {
        // 按了回车键,添加任务
        // 1、创建添加任务的Action
        let action = Actions.addTaskAction(e.target.value)
        console.log(action)
        // 2、将action分发出去
        dispatch(action)
        // 方法一:通过受控组件处理-添加任务清空表单
        // this.setState({
        //   etitle: ''
        // })
        // 方法二:通过事件对象操作value-添加任务清空表单
        e.target.value = ''
        // 方法三:通过非受控组件处理-添加任务清空表单
        // this.inputRef.current.value = ''
      }
    }
  }
}

// connect参数一用于向组件提供props数据
// connect参数二用于向组件提供事件处理函数
export default connect(null, mapDispatchToProps)(Header)

打印action

在这里插入图片描述

在src/store/Reducer.js查看分发内容

/*
  Reducer:复制数据变更操作
*/

export default (state, action) => {
    console.log(action)
    return state
}

验证action分发

在这里插入图片描述

src/store/Reducer.js查看索引

在这里插入图片描述

任务id

在这里插入图片描述

3、变更数据

src/store/Reducer.js

// 添加任务
let newState = JSON.parse(JSON.stringify(state))
// 获取所有任务的id
let ids = newState.todos.map(item => {
  return item.id
})
// 计算所有任务ID的最大值
let maxId = Math.max.apply(null, ids) + 1
let todo = {
  id: maxId,
  etitle: action.etitle,
  done: false,
  isEdit: false
}
// 添加任务
newState.todos.push(todo)
return newState
4、清空表单
  • 通过事件对象
  • 受控组件
  • 非受控组件
// 方法一:通过受控组件处理
// this.setState({
//   etitle: ''
// })
// 方法二:通过事件对象操作value
e.target.value = ''
// 方法三:通过非受控组件处理
// this.inputRef.current.value = ''
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值