加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

reactjs – 使用React.js在JSX中使用for循环创建HTML

发布时间:2020-12-15 05:06:47 所属栏目:百科 来源:网络整理
导读:我想在JSX中为for循环创建 HTML.这是我的尝试看起来像 function renderTemplates(templates){ var html = []; var templateDiv = []; var count = 0; for(var identifier in templates){ if(templates.hasOwnProperty(identifier)){ var templateDetails = t
我想在JSX中为for循环创建 HTML.这是我的尝试看起来像
function renderTemplates(templates){
           var html = [];
           var templateDiv = [];
           var count  = 0;
           for(var identifier in templates){  
             if(templates.hasOwnProperty(identifier)){
               var templateDetails = templates[identifier];
               if(count == 0){
                  html.push(<Row>);
               }
               cols = <Col md={6}>ff
                          </Col>;
               html.push(cols);
               if(count == 0){
                      html.push(</Row>);
               }
               count = (count === 1)?0:1;
             }
        } 
        return html;
     }

我知道这是错误的语法,但无法弄清楚如何做到这一点.基本上我有一些数据,并希望创建时尚的html,2 divs在1行中.

当我查看你的代码时,有两件事情发生在我身上.

第一个是你从renderTemplates函数返回一个React组件数组.这可能没问题,具体取决于您如何使用输出.要记住的关键是组件的render函数的返回值必须是单个React组件(例如,如果将此结果包装在另一个JSX标记中,那么你没问题.)

其次,您似乎没有让数据从顶层组件流下来;特别是,您不使用Row组件将数据传递给Column组件.这使得编写循环变得如此困难.您只需将单行所需的数据传递给Row组件,而不是尝试管理行和列.然后,Row组件将每个数据传递给Column组件.这消除了处理打开和关闭标签的需要,并简化了整体代码.

以下是我所描述的示例实现.我使用与表相关的标签进行渲染,但您可以使用div或任何最适合您的标签.在撰写本文时,关于模板中的内容的信息并不多,所以我创建了一个愚蠢的小例子.

var KvpColumn = React.createClass({
    render: function() {
        return <td>{this.props.kvp.key}: {this.props.kvp.value}</td>;
    }
});

var KvpRow = React.createClass({
    render: function() {
        return (
            <tr>
            {this.props.items.map(function(item) {
                return <KvpColumn key={item.key} kvp={item}/>;
            })}
            </tr>
        );
    }
});

var ObjectIDsTable = React.createClass({
    render: function() {
        var templates = this.props.templates;

        var propertyNames = Object.getOwnPropertyNames(templates);
        var group = [];
        var rows = [];
        var cols = Number(this.props.cols) || 2;

        for(var i = 0; i < propertyNames.length; i++) {
            var key = propertyNames[i];

            group.push({key: key,value: templates[key]});
            if(group.length === cols) {
                rows.push(<KvpRow key={group[0].key} items={group}/>);
                group = [];
            }
        }

        if(group.length > 0) { // catch any leftovers
            rows.push(<KvpRow key={group[0].key} items={group}/>);
        }

        return <table>{rows}</table>;
    }
});    

// something silly as a simple example
var templates = { a: 'b',c: 'd',e: 'f',g: 'h',i: 'j' };    
React.render(<ObjectIDsTable templates={templates} cols="2"/>,document.getElementById('app'));

如果您可以访问Underscore或lodash,则可以进一步简化ObjectIDsTable中的逻辑(并避免完全编写循环!):

var ObjectIDsTable = React.createClass({
    render: function() {
        var templates = this.props.templates;

        var rows = _.chain(Object.getOwnPropertyNames(templates))
            .map(function(key) { return { key: key,value: templates[key] }; })
            .chunk(this.props.cols || 2)
            .map(function(group) { return <KvpRow key={group[0].key} items={group}/>; })
            .value();

        return <table>{rows}</table>;
    }
});

你可以在Plunker上看到这个.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读