【问题标题】:How to add keys the proper way to this react code如何以正确的方式向此反应代码添加键
【发布时间】:2015-02-11 20:14:40
【问题描述】:

我在以下代码中收到有关 GridRow 上缺少键的警告。我已经阅读了它,但我没有找到将它应用到反应组件的方法?看来我必须在最终的渲染方法中这样做,但我那里没有任何数据?

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() {
        var data = [], columns;

        if(this.props.columns){
            for(var i = 0; i < this.props.columns.length; i++){
                data.push({
                    HTMLclass: this.props.columns[i].HTMLClass,
                    content: this.props.cells[i]
                })
            }
        }


        columns = data.map(function(col) {
            return (
                <div className={col.HTMLclass}>{col.content}</div>
            );
        }.bind(this));

        return (
            <li>
                {columns}
            </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, i) {
                return (
                    <GridHead data={columns} key={i} />
                );
            });
            var row = this.props.data.Rows.map(function (row, i) {
                return (
                    <GridRow columns={data1.Columns} cells={row.Cells} key={i} />
                );
            });
        }
        return (
            <ul>
                <li>{header}</li>
                {row}
            </ul>
        );
    }
});


var GridBox = React.createClass({
    loadCommentsFromServer: function() {
        var xhr = new XMLHttpRequest();
        xhr.open('get', this.props.url, true);
        xhr.onload = function() {
          var data = JSON.parse(xhr.responseText);
          this.setState({ data: data });
        }.bind(this);
        xhr.send();
    },
    getInitialState: function() {
        return { data: this.props.initial };
    },
    render: function(){
        return (
            <GridList data={data1} />
        );
    }
});

警告:数组中的每个孩子都应该有一个唯一的“关键”道具。 检查 GridRow 的渲染方法。看 fb.me/react-warning-keys 了解更多信息。

【问题讨论】:

    标签: javascript reactjs react-jsx


    【解决方案1】:

    只需将键添加到您的列 div,React 只需要一些唯一标识符,这样它就可以使其 Virtual DOM diff 保持最新。

    密钥可以是任何东西,只要它是唯一的。

    columns = data.map(function(col, i) {
        return (
            <div className={col.HTMLclass}>{col.content} key={i}></div>
        );
    }.bind(this));
    

    【讨论】:

    • 好的,我想我必须将它添加到 li 元素中。所以我真正要做的就是为链条最下游的孩子添加一把钥匙?
    【解决方案2】:

    只有在没有其他选项的情况下,才应将键设置为索引。

    【讨论】:

      猜你喜欢
      • 2021-08-24
      • 2011-02-28
      • 2020-09-21
      • 2010-09-07
      • 2016-01-24
      • 2021-10-21
      • 2017-01-08
      • 2021-03-01
      • 2021-08-10
      相关资源
      最近更新 更多