如何以正确的方式将密钥添加到此反应代码中

How to add keys the proper way to this react code

本文关键字:添加 代码 密钥 方式      更新时间:2023-09-26

我在下面的代码中收到了关于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了解更多信息。

只需将键添加到列div中,React只需要一些唯一的标识符,就可以使其虚拟DOM diff保持最新。

钥匙可以是任何东西,只要它是独一无二的。

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

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