单击获取编辑的行数据

Get edited row data on click

我是 ReactJS 的新手,在让 ReactTable 工作方面遇到了一些麻烦。

我已将单元格定义为可编辑,如下所示:

const [editing, setEditing] = useState(null);   

const columns = [{
  Header: 'Brand',
  accessor: 'brand',
  Cell: props => editableCell(props)
}]

const editableCell = props => {
 return (editing !== null && editing.index === props.index) ? (<div
  contentEditable="true"
  suppressContentEditableWarning>
   {props.value}
 </div>) : props.value;
}

return (
 <ReactTable
  data={cars} 
  columns={columns} 
  pages={pages}
  loading={loading}
  defaultPageSize={pageSize}
  className="-striped -highlight"/>
);

const edit = row => {
 if(editing !== null && editing.index !== row.index){
  return;
 }
 setEditing(row);
}

const save = () => {
 console.log(editing); // should return edited data, but returns old data, because data doesn't update when user modifies each cell.
}

如何在保存时从已编辑的行中获取新数据?我是否必须创建一个侦听器来在键入时将值更改为状态?我知道为什么它不起作用,但我不知道实现什么或如何实现。

您可以将 onBlur() 事件用于 contentEditable div,并且在 onBlur 事件中您可以使用 e.target.innerHTMLe.target.innerText 获取值。

在这个 editableCell 函数中,您将使用 props.original 获取数据。使用这个 props.original 你可以从状态中找到你的数据,之后如果你想将数据更新到 state 那么你可以很容易地做到。

请检查下面的代码和工作 stackblitz 演示。

editableCell(props) {
    return (
      <div
        className={"edittable"}
        contentEditable
        suppressContentEditableWarning
        onBlur={e => {
          console.log(`original value : ${JSON.stringify(props.original)}`)
          const data = [...this.state.data];
          let row = data.find(o=>o.id == props.original.id);
          row[props.column.id] = e.target.innerHTML;
          console.log(`upated row value : ${JSON.stringify(row)}`)
        }}
        dangerouslySetInnerHTML={{
          __html: this.state.data[props.index][props.column.id]
        }}
      />
    );
}