2015-02-10 48 views
1

我尝试动态地建立一个表reactJS但有我不能解决两个问题:如何建立一个表动态

  1. 在GridList组件我此行<GridRow data={data1} key={i} />我真的不希望获取“全局”变量,而是使用发送到该方法的数据?我该怎么做呢?
  2. 在GridRow我需要太多循环的列(如我现在做的),但我需要得到正确的单元格的值和右边不,我只是得到这个异常:Error while rendering "GridBox" to "react1": Unable to get property 'data' of undefined or null reference

代码

var data1 = {"Columns":[{"Title":"Title1","HTMLClass":"g1_Title"},{"Title":"Title2","HTMLClass":"g2_Title"},{"Title":"Title3","HTMLClass":"g3_Title"}],"Rows":[{"Cells":["Cell0","Cell1","Cell2"]},{"Cells":["Cell0","Cell1","Cell2"]},{"Cells":["Cell0","Cell1","Cell2"]},{"Cells":["Cell0","Cell1","Cell2"]},{"Cells":["Cell0","Cell1","Cell2"]},{"Cells":["Cell0","Cell1","Cell2"]},{"Cells":["Cell0","Cell1","Cell2"]},{"Cells":["Cell0","Cell1","Cell2"]},{"Cells":["Cell0","Cell1","Cell2"]},{"Cells":["Cell0","Cell1","Cell2"]},{"Cells":["Cell0","Cell1","Cell2"]},{"Cells":["Cell0","Cell1","Cell2"]},{"Cells":["Cell0","Cell1","Cell2"]},{"Cells":["Cell0","Cell1","Cell2"]},{"Cells":["Cell0","Cell1","Cell2"]},{"Cells":["Cell0","Cell1","Cell2"]},{"Cells":["Cell0","Cell1","Cell2"]},{"Cells":["Cell0","Cell1","Cell2"]},{"Cells":["Cell0","Cell1","Cell2"]},{"Cells":["Cell0","Cell1","Cell2"]}]}; 



var GridRow = React.createClass({ 
    render: function() { 
     if(this.props.data){ 
      var Cell = this.props.data.Columns.map(function (column, i) { 
       return (
        <div className={column.HTMLClass}>{this.props.data.Cells[i]}</div> 
       ); 
      }) 
     } 
     return (
      <li>{Cell}</li> 
     ); 
    } 
}); 
var GridHead = React.createClass({ 
    render: function() { 
     if(this.props.data){ 
      var Cell = this.props.data.Title; 
      var HtmlClass = this.props.data.HTMLClass; 
     } 
     return (
      <div className={HtmlClass}>{Cell}</div> 
     ); 
    } 
}); 
var GridList = React.createClass({ 
    render: function() { 
     if(this.props.data){ 
      var Header = this.props.data.Columns.map(function (columns) { 
       return (
        <GridHead data={columns} /> 
       ); 
      }); 
      var Row = this.props.data.Rows.map(function (data, i) { 
       return (
        <GridRow data={data1} key={i} /> 
       ); 
      }); 
     } 
     return (
      <ul> 
       <li>{Header}</li> 
       {Row} 
      </ul> 
     ); 
    } 
}); 


var GridBox = React.createClass({ 
    render: function(){ 
     return (
      <GridList data={data1} /> 
     ); 
    } 
}); 

回答

2

除非您使用bind来维护实例this,否则您只能引用传入map中的函数的内容,以便在map中使用的组件和函数内的内容相同。这将允许您在映射功能中使用this.props

由于header正在使用直接传递到函数map中的函数,因此不一定需要绑定。在row中,为了访问this.props,必须绑定该函数。例如,如果你有somedata你想内this.props访问:

var header = this.props.data.Columns.map(function (columns) { 
    return (
     <GridHead data={columns} /> 
    ); 
}); 
var Row = this.props.data.Rows.map(function (data, i) { 
    return (
     <GridRow data={this.props.somedata} key={i} /> 
    ); 
}.bind(this)); 

注意,在JSX常规变量名称应该以小写字母(如上头)开始,而组件名称应以大写字母开头。

+0

感谢您的命名抬头。但绑定?这个怎么用?它不是真的GridHead我有问题,但GridRow。 – Banshee 2015-02-10 19:11:04

+0

我扩大了解决您评论的答案。另请注意,在为行设置键时,最好将其设置为可用作该行唯一标识符的数据属性。这样,如果您添加/删除/重新排序行,他们将不必重新渲染。 – Mark 2015-02-10 20:33:40

+0

谢谢,你能解释更多关于独特吗?你是否认为我手工添加了id到HTML元素,并删除我这样做也手动用JavaScript而不是强迫重投?我认为,具有回归的贤惠是反应的全部意义? – Banshee 2015-02-11 07:27:00