React - 在表格的单元格中切换输入

Posted

技术标签:

【中文标题】React - 在表格的单元格中切换输入【英文标题】:React - toggling input in a cell of a table 【发布时间】:2016-07-10 15:39:40 【问题描述】:

我有一个表格,我希望可以在其中单击一个单元格,然后切换一个允许您更改该单元格中数据的输入。目前我只是直接渲染输入,但理想情况下我不想要这个。我真正想要的是在单元格中显示当前数据,然后当您单击单元格时,它会成为输入并允许您编辑数据。

表格组件:

import React from 'react';
import TableWithDataHeader from './TableWithDataHeader.jsx';
import Row from './Row.jsx';
import createRowHistory from '../../actions/DALIActions';
import TokenStore from '../../stores/TokenStore';
import TableDataStore from '../../stores/TableDataStore';

export default class Table extends React.Component 
    state = data: TableDataStore.getCells().historycells;

    handleSubmitEvent = (e) => 
        e.preventDefault();
        console.log(this.state.data);
        let data = this.state.data;
        let dataEntriesArray = [];
        for (let key in data) 
            if (data.hasOwnProperty(key)) 
                dataEntriesArray.push(contents: data[key]);
            
        
        console.log(dataEntriesArray);

        let access_token = TokenStore.getToken();
        let row_id = TableDataStore.getRowId();

        createRowHistory(access_token, row_id, dataEntriesArray);

    ;

    handleChangeEvent = (value, cell) => 
        let newState = this.state.data.slice(0);
        console.log(newState);
        newState[cell] = value;
        console.log(newState);
        this.setState(data: newState);
        console.log(this.state.data);
    ;

    render() 

        let data = this.state;

        return (
            <div>
                <div className="row">
                    <table className="table table-striped table-bordered">
                        <thead>
                            <TableWithDataHeader />
                        </thead>
                        <tbody>
                            <Row data=this.state.data handleSubmitEvent=this.handleSubmitEvent handleChangeEvent=this.handleChangeEvent />
                        </tbody>
                    </table>
                </div>
            </div>
        );
    

行组件:

import React from 'react';
import TableDataStore from '../../stores/TableDataStore';

export default class Row extends React.Component 

    render() 

        let cells = this.props.data.map((el, i) => 
            return (
                <td key=i>
                    <input type="text" className="form-control" id=el.id defaultValue=el.contents onChange=(e) => 
                        this.props.handleChangeEvent(e.target.value, i)
                     />
                </td>
            );
        );

        cells.push(
            <td className="dtable-button" key=this.props.data.length>
                <button className="btn btn-primary" onClick=this.props.handleSubmitEvent>Submit</button>
            </td>
        );

        return (
            <tr id=TableDataStore.getRowId()>cells</tr>
        );
    

我可以简单地切换一个在默认显示状态(&lt;div&gt;?)和我已有的输入之间切换的状态吗?还是我需要做一些更复杂的事情?

任何帮助将不胜感激!

感谢您的宝贵时间

【问题讨论】:

那是很多代码。您是否考虑过创建minimal reproducible example? 【参考方案1】:

一种方法是创建一个呈现 div 的 Cell 组件,但单击时会呈现一个输入。

import React from 'react';

class Cell extends React.Component 
    constructor(props) 
        super(props);
        this.state =  editing: false ;
    

    render() 
        const  value, onChange  = this.props; 

        return this.state.editing ?
            <input ref='input' value=value onChange=e => onChange(e.target.value) onBlur=() => this.onBlur() /> : 
            <div onClick=() => this.onFocus()>value</div>
    

    onFocus() 
        this.setState( editing: true , () => 
            this.refs.input.focus();
        );
    

    onBlur() 
        this.setState( editing: false );
    

然后您可以像这样创建表格行:

let cells = data.map((el, i) => (
        <td key=i>
            <Cell 
                value=el.contents
                onChange=v =>  this.props.handleChangeEvent(v, i)  
            />
        </td>
    ));

【讨论】:

当我尝试与此类似的操作时,我可以编辑单元格中的数据,但是一旦我单击它,单元格就会变为空白(即不显示编辑的数据)。我不知道是什么原因造成的,有什么想法吗? @BeeNag 如果不查看您的代码,这很难说。看看这个 Fiddle,你可以看到我的 Cell 组件在运行:https://jsfiddle.net/iaretiga/1hptox0m/2/ 你可以在编辑单元格时打开控制台查看组件状态更新。 谢谢您,无法确定是什么原因造成的,但可能是因为我需要添加一个更改侦听器,以便我从中获取数据的商店知道它已更新? !【参考方案2】:

你可以喜欢这些。

let cells = this.props.data.map((el, i) => 
            return (
                <td key=i>
                   
                   (el.editable)?
                    <input type="text" className="form-control" id=el.id defaultValue=el.contents onChange=(e) => 
                        this.props.handleChangeEvent(e.target.value, i)
                     />:
                     <div onClick=onCellClick(i)>el.contents</div>
                   
                </td>
            );
        );

应使用 onCellClick(i) 和 this.props.handleChangeEvent(e.target.value, i) 函数切换可编辑标志。你应该根据你在这里的索引更新适当的状态

【讨论】:

我可以,但我得到的数据没有可编辑的标志。我可以只创建一个我切换的吗?但如果我这样做,我如何区分细胞呢?

以上是关于React - 在表格的单元格中切换输入的主要内容,如果未能解决你的问题,请参考以下文章

访问嵌入在单元格中的 textField

删除表头时,表格单元格中的中心输入字段

如何在表格的一个列单元格中输入字母,而在另一列单元格中只输入数字?

可重复使用的表格视图单元格中的 UIButton 图像切换问题

excel表格怎么提取单元格中的部分内容

根据在单元格中的文本字段中输入的值动态增加表格视图单元格