javascript - 在react JS中渲染具有N个固定列的布局

标签 javascript reactjs

我正在尝试呈现一个包含固定数量列的表格。我在css中设置了宽度,在js代码中设置了固定的列数。应该呈现表格。我正在处理的问题如下: - 在表中渲染 N 个固定列的代码是如此丑陋,我认为应该有一种方法可以用干净的代码来做到这一点 - 我找不到将组件动态附加到元素子元素的函数。

_renderProducts(): ReactElement {
  var cols_no = 4;
  var cols = [];
  for (var col = row_index; col < 0 && col < this.state.products.length; col+=1) {
    cols.push(
      <LayoutColumn className={cx('XElement/column')} />
    );
  }
  for (var row_index = 0; row_index < this.state.products.length;row_index+=cols_no) {
    for (var col = 0; col < cols.length && col < this.state.products.length; col+=1) {
      cols[col].appendchild(  // THIS DOESN"T EXISTS
          <XCard
            product={this.state.products[col]} />
      )
    }
  }
  return (
    <Layout>
      {cols}
    </Layout>
);

}

我花了几个小时试图找到一种正确的方法来做到这一点,但没有成功。

最佳答案

在react中操作dom并不是一个好主意。

为了映射子组件,一般来说,您需要创建子组件,每个组件都呈现应用程序的一部分。这里经常使用映射函数来渲染当前组件的子组件。

您可以在这里找到更多示例:https://facebook.github.io/react/docs/tutorial.html

我认为你可以用类似的方式改变你的逻辑:

_renderProducts(): ReactElement {
    return <Layout>{ this.state.products.map(function(product, idx) {
        <LayoutColumn className={cx('XElement/column')} key={idx}>
            <XCard product={product} />
        </LayoutColumn>
    }) }</Layout>;
);

如果您想要一个如何拆分所有元素和拆分组件的示例,您可以检查此代码段

.col0, .col1, .col2, .col3, .col4, .col5 {
    width: 120px;
    text-align: left;
}
<script type='text/javascript' src="https://cdnjs.cloudflare.com/ajax/libs/babel-core/5.8.24/browser.js"></script>
<script type='text/javascript' src="https://fb.me/react-with-addons-0.14.0.js"></script>
<script type='text/javascript' src="https://fb.me/react-dom-0.14.0.js"></script>
<script type="application/javascript;version=1.7" language="JavaScript 1.7">
  //<![CDATA[
var Header = React.createClass({
	propTypes: {
    	title: React.PropTypes.string,
        className: React.PropTypes.string
    },
    render: function() {
    	var { title, className } = this.props;
    	return <th className={className}>{title}</th>;
    }
});

var ElementRow = React.createClass({
	propTypes: {
    	values: React.PropTypes.arrayOf(React.PropTypes.any)
    },
    render: function() {
    	var { values } = this.props;
        if (!values) {
        	return null;
        }
        return <tr>{ values.map(function(i, k) {
        	return <Element className={'col' + i} value={i} key={k} />;
        }) }</tr>;
    }
});

var Element = React.createClass({
	propTypes: {
    	value: React.PropTypes.any,
        className: React.PropTypes.string
    },
    render: function() {
    	var { value, className } = this.props || '';
        return <td className={className}>{value}</td>
    }
});

var Example = React.createClass({
	propTypes: {
    	columns: React.PropTypes.array,
        rows: React.PropTypes.arrayOf(React.PropTypes.array)
    },
    renderHeaders: function(columns) {
        if (!columns) {
	        return null;
        }
        return columns.map(function(i, k) {
            return <Header title={i} key={k} className={'col' + k} />;
        });
    },
    renderBody: function(rows) {
    	if (!rows) {
        	return null;
        }
        return <tbody>{ rows.map(function(i, k) {
        		return <ElementRow values={i} key={k} />;
        	}) }</tbody>;
    },
    render: function() {
    	var { columns, rows } = this.props;
        if (!columns) {
        	return null;
        }
        return <table><thead>
        	<tr>{this.renderHeaders(columns)}</tr>
            </thead>
            {this.renderBody(rows)}
        </table>;
    }
});

var table = {
	columns: ['column1', 'column2', 'column3', 'column4', 'column5'],
    rows: [
    	['row1 - 1', 'row1 - 2', 'row1 - 3', 'row1 - 4', 'row1 - 5'],
    	['row2 - 1', 'row2 - 2', 'row2 - 3', 'row2 - 4', 'row2 - 5'],
    	['row3 - 1', 'row3 - 2', 'row3 - 3', 'row3 - 4', 'row3 - 5']
    ]
};
 
ReactDOM.render(
	<Example {...table} />,
    document.getElementById('container')
);

//]] >
</script>
<script src="https://facebook.github.io/react/js/jsfiddle-integration-babel.js"></script>

<div id="container">
  <!-- This element's contents will be replaced with your component. -->
</div>

关于javascript - 在react JS中渲染具有N个固定列的布局,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33988390/

相关文章:

javascript - 何时使用 function() 、 function 或 () => function(callback)

javascript - 如何显示 React JavaScript 文件中的内容,或者更确切地说是要由 React 解释的文件

javascript - 获取 React 路由器以导致重新渲染

javascript - Casperjs 捕获 console.log 和 console.error

javascript - 通过 C++ 向 Internet Explorer 添加脚本标签

javascript - 奇怪的 Javascript 数字行为 - 无法区分 1 和 10 之间的区别

javascript - 如何在 JavaScript 中使用带有 RegEx 的变量来使用 "^"和 "$"进行精确匹配?

reactjs - 如何设置react-data-grid的动态高度

javascript - 如何将参数传递给 react 中的事件监听器

javascript - FB.login() 响应不一致