React.js 创建一个 table 具有动态行数和 editable 列
React.js creating a table with a dynamic amount of rows with an editable column
我正在尝试创建一个与传单地图同步的 react.js table。我有这些数据并且我能够正确获取数据,但我无法正确创建 table。我能够看到 headers 因为它们是硬编码的,但我看不到行。我还有一张图片来解释代码中 console.log() 点的数据。这是代码:
/* Table React Component */
var TABLE_CONFIG = {
sort: { column: "Zone", order: "desc" },
columns: {
col1: { name: "Zone", filterText: "", defaultSortOrder: "desc" },
col2: { name: "Population", filterText: "", defaultSortOrder: "desc" }
}
};
var Table = React.createClass({
getInitialState: function() {
var tabledata = [];
var length = _.size(testJSON.zones);
for(i = 0; i < length; i++) {
var name = _.keys(testJSON.zones)[i];
var population = testJSON.zones[name].population.value;
if(name == "default") {
population = testJSON.zones[name].population.default.value;
}
tabledata[i] = {name, population};
}
console.log(tabledata);
return {zones: tabledata};
},
render: function() {
var rows = [];
this.state.zones.forEach(function(zone) {
rows.push(<tr Population={zone.population} Zone={zone.name} />);
}.bind(this));
console.log(rows);
return (
<table>
<thead>
<tr>
<th>Zone</th>
<th>Population</th>
</tr>
</thead>
<tbody>{rows}</tbody>
</table>
);
}
});
在这里您可以看到完整的 console.log(tabledata)
行以及 console.log(rows)
中的第一个 object
我想看下图这样的东西。请注意,我希望 Zone 列不是 editable 输入,而是 editable:
<tr Population={zone.population} Zone={zone.name} />
对我来说似乎不是一个有效的 React 组件。小写的 <tr>
表示这不是一个自定义组件,而是代表一个标准的 HTML table 行。 <tr>
个元素需要在其中包含 <td>
或 <th>
个元素,例如:
var rows = [];
this.state.zones.forEach(function(zone) {
rows.push(
<tr />
<td><SomePopulationComponent /></td>
<td><SomeZoneComponent /></td>
</tr>
);
}.bind(this));
您可以将其提取到自定义元素中:
var CustomRow = React.createClass({
render: function() {
return (
<tr>
<td>{this.props.Population}</td>
<td>{this.props.Zone}</td>
</tr>
);
}
});
// ...
var rows = [];
this.state.zones.forEach(function(zone) {
rows.push(<CustomRow Population={zone.population} Zone={zone.name} />);
}.bind(this));
此外,不要忘记为从 map
/foreach
函数内部生成的元素提供 key
属性。
我用动态行和列编辑了这个动态数据tabletable
class App extends React.Component {
constructor(props){
super(props);
this.state = {
data: [
{'id':1,1:'',2:'Class1',3:'Class2',4:'Class3',5:'Class4',6:'Class5',7:'Class6'},
{'id':2,1:'MONDAY',2:'1',3:'2',4:'3',5:'4',6:'5',7:'6'},
{'id':3,1:'TUESDAY',2:'1',3:'2',4:'3',5:'4',6:'5',7:'6'},
{'id':4,1:'WEDNESDAY',2:'1',3:'2',4:'3',5:'4',6:'5',7:'6'},
{'id':5,1:'THURSDAY',2:'1',3:'2',4:'3',5:'4',6:'5',7:'6'},
{'id':6,1:'FRIDAY',2:'1',3:'2',4:'3',5:'4',6:'5',7:'6'}
],
errorInput:''
};
this.submitStepSignupForm = this.submitStepSignupForm.bind(this);
this.appendColumn = this.appendColumn.bind(this);
// this.editColumn = this.editColumn.bind(this);
}
render(){
let tableStyle = {
align:"center"
};
let list = this.state.data.map(p =>{
return (
<tr className="grey2" key={p.id}>
{Object.keys(p).filter(k => k !== 'id').map(k => {
return (
<td className="grey1" key={p.id + '' + k}>
<div suppressContentEditableWarning="true" contentEditable="true" value={k} onInput={this.editColumn.bind(this,{p},{k})}>
{p[k]}
</div>
</td>
);
})}
</tr>
);
});
return (
<fieldset className="step-4">
<div className="heading">
<h3>Tell us about your schedule</h3>
<p>Dynamic Data Table by Rohan Arihant</p>
</div>
<div className="schedule padd-lr">
<table cellSpacing="3" id="mytable" style={tableStyle}>
<tbody>{list}</tbody>
</table>
</div>
</fieldset>
);
}
}
我正在尝试创建一个与传单地图同步的 react.js table。我有这些数据并且我能够正确获取数据,但我无法正确创建 table。我能够看到 headers 因为它们是硬编码的,但我看不到行。我还有一张图片来解释代码中 console.log() 点的数据。这是代码:
/* Table React Component */
var TABLE_CONFIG = {
sort: { column: "Zone", order: "desc" },
columns: {
col1: { name: "Zone", filterText: "", defaultSortOrder: "desc" },
col2: { name: "Population", filterText: "", defaultSortOrder: "desc" }
}
};
var Table = React.createClass({
getInitialState: function() {
var tabledata = [];
var length = _.size(testJSON.zones);
for(i = 0; i < length; i++) {
var name = _.keys(testJSON.zones)[i];
var population = testJSON.zones[name].population.value;
if(name == "default") {
population = testJSON.zones[name].population.default.value;
}
tabledata[i] = {name, population};
}
console.log(tabledata);
return {zones: tabledata};
},
render: function() {
var rows = [];
this.state.zones.forEach(function(zone) {
rows.push(<tr Population={zone.population} Zone={zone.name} />);
}.bind(this));
console.log(rows);
return (
<table>
<thead>
<tr>
<th>Zone</th>
<th>Population</th>
</tr>
</thead>
<tbody>{rows}</tbody>
</table>
);
}
});
在这里您可以看到完整的 console.log(tabledata)
行以及 console.log(rows)
我想看下图这样的东西。请注意,我希望 Zone 列不是 editable 输入,而是 editable:
<tr Population={zone.population} Zone={zone.name} />
对我来说似乎不是一个有效的 React 组件。小写的 <tr>
表示这不是一个自定义组件,而是代表一个标准的 HTML table 行。 <tr>
个元素需要在其中包含 <td>
或 <th>
个元素,例如:
var rows = [];
this.state.zones.forEach(function(zone) {
rows.push(
<tr />
<td><SomePopulationComponent /></td>
<td><SomeZoneComponent /></td>
</tr>
);
}.bind(this));
您可以将其提取到自定义元素中:
var CustomRow = React.createClass({
render: function() {
return (
<tr>
<td>{this.props.Population}</td>
<td>{this.props.Zone}</td>
</tr>
);
}
});
// ...
var rows = [];
this.state.zones.forEach(function(zone) {
rows.push(<CustomRow Population={zone.population} Zone={zone.name} />);
}.bind(this));
此外,不要忘记为从 map
/foreach
函数内部生成的元素提供 key
属性。
我用动态行和列编辑了这个动态数据tabletable
class App extends React.Component {
constructor(props){
super(props);
this.state = {
data: [
{'id':1,1:'',2:'Class1',3:'Class2',4:'Class3',5:'Class4',6:'Class5',7:'Class6'},
{'id':2,1:'MONDAY',2:'1',3:'2',4:'3',5:'4',6:'5',7:'6'},
{'id':3,1:'TUESDAY',2:'1',3:'2',4:'3',5:'4',6:'5',7:'6'},
{'id':4,1:'WEDNESDAY',2:'1',3:'2',4:'3',5:'4',6:'5',7:'6'},
{'id':5,1:'THURSDAY',2:'1',3:'2',4:'3',5:'4',6:'5',7:'6'},
{'id':6,1:'FRIDAY',2:'1',3:'2',4:'3',5:'4',6:'5',7:'6'}
],
errorInput:''
};
this.submitStepSignupForm = this.submitStepSignupForm.bind(this);
this.appendColumn = this.appendColumn.bind(this);
// this.editColumn = this.editColumn.bind(this);
}
render(){
let tableStyle = {
align:"center"
};
let list = this.state.data.map(p =>{
return (
<tr className="grey2" key={p.id}>
{Object.keys(p).filter(k => k !== 'id').map(k => {
return (
<td className="grey1" key={p.id + '' + k}>
<div suppressContentEditableWarning="true" contentEditable="true" value={k} onInput={this.editColumn.bind(this,{p},{k})}>
{p[k]}
</div>
</td>
);
})}
</tr>
);
});
return (
<fieldset className="step-4">
<div className="heading">
<h3>Tell us about your schedule</h3>
<p>Dynamic Data Table by Rohan Arihant</p>
</div>
<div className="schedule padd-lr">
<table cellSpacing="3" id="mytable" style={tableStyle}>
<tbody>{list}</tbody>
</table>
</div>
</fieldset>
);
}
}