Todos案例(二)04-修改任务——显示焦点-e.persist() 异步访问事件属性(如在setTimeout内) & 输入框内容根据id同步进行更新变化显示

修改任务——显示焦点-e.persist() 异步访问事件属性(如在setTimeout内) & 输入框内容根据id同步进行更新变化显示

  • 进入编辑状态和离开编辑状态
<div className="view" onDoubleClick={this.handleDoubleClick.bind(this, item.id)}>
  • 离开编辑状态
<input onBlur={this.handleDoubleClick.bind(this, item.id)} className="edit" />

离开逻辑

  // handleBlue = (id) => {
  //   // 编辑状态失去焦点触发
  //   let todos = [...this.state.todos]
  //   todos.some(item => {
  //     if (item.id === id) {
  //       // 找到后把对应done状态取反
  //       item.isEdit = !item.isEdit
  //       // 终止继续遍历
  //       return true
  //     }
  //     return false
  //   })
  //   this.setState({
  //     todos: todos
  //   })
  // }
  • 进入和离开编辑状态-共用逻辑
handleDoubleClick = (id) => {
  // 获取label元素的父元素的下一个兄弟元素 input
  let input = e.target.parentNode.nextSibling
    // e.persist()  异步访问事件属性(如在setTimeout内)
  setTimeout(() => {
    // 页面已经显示input元素之后才控制获取焦点
// let input = e.target.parentNode.nextSibling    // 配合e.persist()使用 
    input&&input.focus()
  }, 0)
  // 双击进入编辑状态;或者失去焦点是,取消编辑状态
  let todos = [...this.state.todos]
  todos.some(item => {
    if (item.id === id) {
      // 找到后把对应isEdit状态取反
      item.isEdit = !item.isEdit
      // 终止继续遍历
      return true
    }
    return false
  })
  this.setState({
    todos: todos
  })
}

双击进入编辑状态-效果

在这里插入图片描述

  • 编辑提交动作
    • 输入框内容发生变化时直接根据id更新todos数组中的相应问题内容
<input value={item.etitle} onChange={this.handleEditEtile.bind(this, item.id)} onBlur={this.handleDoubleClick.bind(this,item.id)} className="edit" />
handleEditEtile = (id, e) => {
  // 控制数组中对应标题的变化
  let todos = [...this.state.todos]
  todos.some(item => {
    if (item.id === id) {
      // 把最新的输入内容进行更新
      item.etitle = e.target.value
    }
  })
  this.setState({
    todos: todos
  })
}

内容同步更新变化-效果

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值