突出显示编辑时的文本框 [英] Highlight textbox on edit

查看:64
本文介绍了突出显示编辑时的文本框的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

接续

In continuation to Question , if I have a row that is currently being edited (via state), how do I keep the input textbox highlighted only if edited and stays highlighted even after clicking on next row?

我的代码如下:

<table className="table-data">
 <tbody>
 <tr>
    <th>Name</th>
    <th>Age</th>
    <th>Class</th>
    <th>Section</th>
 </tr>   

 {  this.state.students.map((item,key) => {

    const editField = (value, index) => {

      // Clone students data before mutation
      const students = this.state.students.map(item => ({ ...item }))

      // Update field by index of current student
      students[key][index] = value

      // Trigger re-render
      this.setState({ students })
    }

   return (
    <tr key={key} className={ item.editing ? 'editing' : '' } onClick={()=> {

      // Clone students data before mutation
      const students = this.state.students.map(i => ({ ...i, editing : item.editing && i===item }))

      // Toggle editing flag of this current student (ie table row)
      students[key].editing = true; 

      // Trigger re-render
      this.setState({
        clientIsEditing:true, // This might not be needed ?
        students
      })
}
    }> 
    <td>{ item.editing ? <input value={item[1]} onChange={ e => editField(e.target.value, 1) } /> : <span>{item[1]}</span> }</td>    
    <td>{ item.editing ? <input value={item[2]} onChange={ e => editField(e.target.value, 2) } /> : <span>{item[2]}</span> }</td>    
    <td>{ item.editing ? <input value={item[3]} onChange={ e => editField(e.target.value, 3) } /> : <span>{item[3]}</span> }</td>  
    <td>{ item.editing ? <input value={item[4]} onChange={ e => editField(e.target.value, 4) } /> : <span>{item[4]}</span> }</td> 
    </tr>  )
  })
  }

  </tbody>
  </table>

推荐答案

有几种方法可以实现此目的-一种方法是跟踪每个学生字段的其他状态以这种方式显示突出显示.一种可能是通过以下方式使用与当前解决方案类似的模式:

There are a few ways you could achieve this - one way is to track additional state per student field to show highlighting in this way. One possiblitiy is to use a similar pattern to your current solution by means of the following:

render() {
    return (<table className="table-data">
 <tbody>
 <tr>
    <th>Name</th>
    <th>Age</th>
    <th>Class</th>
    <th>Section</th>
 </tr>   

 {  this.state.students.map((item,key) => {

    const editField = (value, index) => {

      // Clone students data before mutation
      const students = this.state.students.map(item => ({ ...item }))

      // Update field by index of current student
      students[key][index] = value

      // Extend state for student to tract editing history per field
      students[key].edited = students[key].edited || []
      students[key].edited[index] = true

      // Trigger re-render
      this.setState({ students })
    }

    // Returns true if the field by index has been edited. This is used for styling the td
    const isEdited = (index) => {
        const students = this.state.students.map(item => ({ ...item }))
        return (students[key].edited && students[key].edited[index] === true)
   }

   // Apply 'editing' class to the cell if it has been previously edited
   return (
    <tr key={key} className={ item.editing ? 'editing' : '' } onClick={()=> {

      // Clone students data before mutation
      const students = this.state.students.map(i => ({ ...i, editing : item.editing && i===item }))

      // Toggle editing flag of this current student (ie table row)
      students[key].editing = true; 

      // Trigger re-render
      this.setState({
        clientIsEditing:true, // This might not be needed ?
        students
      })
}
    }> 
    <td className={ isEdited(1) ? 'edited' : '' } >{ item.editing ? <input value={item[1]} onChange={ e => editField(e.target.value, 1) } /> : <span>{item[1]}</span> }</td>    
    <td className={ isEdited(2) ? 'edited' : '' } >{ item.editing ? <input value={item[2]} onChange={ e => editField(e.target.value, 2) } /> : <span>{item[2]}</span> }</td>    
    <td className={ isEdited(3) ? 'edited' : '' } >{ item.editing ? <input value={item[3]} onChange={ e => editField(e.target.value, 3) } /> : <span>{item[3]}</span> }</td>  
    <td className={ isEdited(4) ? 'edited' : '' } >{ item.editing ? <input value={item[4]} onChange={ e => editField(e.target.value, 4) } /> : <span>{item[4]}</span> }</td> 
    </tr>  )
  })
  }

  </tbody>
  </table>)
  }

要完成此操作,您只需要添加一个CSS选择器,如下所示:

To complete this, you would just need to add a CSS selector like this:

https://jsfiddle.net/7uspaot5/

对于有效的演示,请请参阅此jsFiddle -希望对您有所帮助!

For a working demo, please see this jsFiddle - hope this helps!

这篇关于突出显示编辑时的文本框的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆