Gra*_*tic 4 javascript reactjs
我已经建立了一个React表,像这样:
const Table = ({data}) => {
return (
<table className="table table-bordered">
<thead>
<tr>
<th>Qty</th>
<th>Description</th>
<th>Price (£)</th>
</tr>
</thead>
<tbody>
{data.map((row) => {
return (
<tr>
<td><input type='number' className='form-control' step='1' min="1" value={row[0]}/></td>
<td><input type='text' className='form-control' value={row[1]}/></td>
<td><input type='text' className='form-control' placeholder='6.00' value={row[2]}/></td>
</tr>
);
})}
</tbody>
</table>
);
};
Table.propTypes = {
data: React.PropTypes.array.isRequired
};
export default Table;
Run Code Online (Sandbox Code Playgroud)
在类中,我正在使用此组件,我正在将数据作为参数传递(最初为空):
materials: [[],[],[],[],[],[],[],[],[],[]] //Initialise with 10 empty rows
<Table data={materials} />
Run Code Online (Sandbox Code Playgroud)
这将建立一个包含10个空行的表。现在唯一的问题是,当我在表中输入数据时,映射的数据数组不会随输入的数据更新。
我认为我需要的是一些事件,可以在其中输入已输入内容的快照来更新数据,但是我不确定如何执行此操作。任何帮助将不胜感激。
例如,React不适用于双向数据绑定,例如Angular JS。props是只读的,因此您需要更新它们所属的位置。
例如,在其中<Table />声明的parente组件可能materials处于其状态,并且除了materials作为props 传递外,还可以传递诸如的函数处理函数onCellChange(row, column),因此您可以将其与onChangeinput元素中的事件绑定。
像这样
const Table = ({data, onCellChange}) => {
return (
<table className="table table-bordered">
<thead>
<tr>
<th>Qty</th>
<th>Description</th>
<th>Price (£)</th>
</tr>
</thead>
<tbody>
{data.map((row, index) => {
return (
<tr key={index}>
<td><input type='number' className='form-control' step='1' min="1" value={row[0]} onChange={() => onCellChange(index, 0)}/></td>
<td><input type='text' className='form-control' value={row[1]} onChange={() => onCellChange(index, 1)}/></td>
<td><input type='text' className='form-control' placeholder='6.00' value={row[2]} onChange={() => onCellChange(index, 2)}/></td>
</tr>
);
})}
</tbody>
</table>
);
};
Table.propTypes = {
data: React.PropTypes.array.isRequired
};
Run Code Online (Sandbox Code Playgroud)
因此,在父组件上,您可以像那样声明组件<Table data={this.state.materials} onCellChange={this.onCellChange} />。
它会有这样的方法:
onCellChange: function(row, column) {
//update the cell with this.setState() method
}
Run Code Online (Sandbox Code Playgroud)
您可以通过维护表数据的状态来实现这一点。我在这里做了一个粗略的结构:http : //codepen.io/PiotrBerebecki/pen/QKrqPO
查看显示状态更新的控制台输出。
class Table extends React.Component {
constructor(props) {
super(props);
this.state = {
materials: props.data
};
}
handleChange(index, dataType, value) {
const newState = this.state.materials.map((item, i) => {
if (i == index) {
return {...item, [dataType]: value};
}
return item;
});
this.setState({
materials: newState
});
}
render() {
console.clear();
console.log(JSON.stringify(this.state.materials));
return (
<table className="table table-bordered">
<thead>
<tr>
<th>Qty</th>
<th>Description</th>
<th>Price (£)</th>
</tr>
</thead>
<tbody>
{this.state.materials.map((row, index) => {
return (
<tr>
<td>
<input onChange={(e) => this.handleChange(index, 'qty', e.target.value)}
type='number'
className='form-control'
step='1' min="1"
value={this.state.materials[index].qty}/>
</td>
<td>
<input onChange={(e) => this.handleChange(index, 'desc', e.target.value)}
type='text'
className='form-control'
value={this.state.materials[index].desc}/>
</td>
<td>
<input onChange={(e) => this.handleChange(index, 'price', e.target.value)}
type='text'
className='form-control'
placeholder='6.00'
value={this.state.materials[index].price}/>
</td>
</tr>
);
})}
</tbody>
</table>
);
}
}
const materials = [
{ qty: '', desc: '', price: '' },
{ qty: '', desc: '', price: '' },
{ qty: '', desc: '', price: '' },
{ qty: '', desc: '', price: '' },
{ qty: '', desc: '', price: '' },
{ qty: '', desc: '', price: '' },
{ qty: '', desc: '', price: '' },
{ qty: '', desc: '', price: '' }
]
ReactDOM.render(<Table data={materials} />, document.getElementById('app'));
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
11196 次 |
| 最近记录: |