javascript - 如何在 React/JSX 中手动创建的数组中设置键?

标签 javascript reactjs

我正在构建一个基于几种不同状态的工具栏。一切工作正常,我只能按下所需的(当时)按钮,一切都很顺利。

因为它是一个数组,React 希望每个元素都有其宝贵的键。然而,在每个推送点手动设置它们似乎不太灵活,因为当我添加更多项目时,我需要手动更新。

我尝试了一个简单的 map 创建后(请参阅 _.map 行),但是 item.key 是只读的。

有没有办法根据数组索引或类似的方式自动分配键?

var toolbar = null;
if(!this.state.loading) {
    toolbar = [];
    if(this.state.conditionOne) {
        toolbar.push(<a onClick={this.toggleOne}>Close Section One</a>);
    } else {
        toolbar.push(<a onClick={this.toggleOne}>Show Section One</a>);
    }
    if(this.state.conditionTwo) {
        toolbar.push((
            <div>
                <a onClick={this.otherAction}>Other Action</a>
                <a onClick={this.toggleTwo}>Close Section Two</a>
            </div>
        );
    } else {
        toolbar.push(<a onClick={this.toggleTwo}>Show Section Two</a>);
    }

    _.map(toolbar, (item, i) => { item.key = i; });
}

// Later
return (
    Stuff and things
    {toolbar}
);

最佳答案

我相信你现在已经找到了一个好方法。正如昨天评论中所写,根据按钮的行为手动分配按键可能不会那么糟糕。

但是,如果它们太多(或者只是为了将 key 的创建保留在一个明确定义的位置),您可以集中计算。我设置了一个小Codepen来说明一下。

class App extends React.Component { 
  // (1) Helper method
  applyMenuItemProps(label) {
    return {
      label: label,
      key: _.snakeCase(_.escape(label))
    };
  }

  render() {
    // (2) Stateless component
    const MenuItem = (props) => <li><a href="#">{ props.label }</a></li>;

    // (3) Using the Spread operator to apply the properties
    let menuItems = [
      <MenuItem {...this.applyMenuItemProps("Hello World")} />,
      <MenuItem {...this.applyMenuItemProps("Ham and Eggs")} />
    ];

    return (
      <div>
        <p><strong>Render with keys</strong></p>
        { menuItems }
      </div>
    );
  }
}

(1)是一个返回标签和计算出的键的辅助方法。在本例中,我使用 Lodash/Underscore 的 snakeCaseescape根据标签计算字符串(当然,只有在同一数组中不存在具有相同标签的两个项目时,这才有效)。

(2)使用 React 的 stateless components (docs) ,我开始非常喜欢。如果它们应该是可重用的,那么它们可以进入一个单独的模块,但我喜欢它们的原因之一是它们不一定需要单独的文件,因此样板文件可以最小化。

(3)使用 Javascript 的 Spread 运算符 (ES2015) 来应用 applyMenuItemProps() 返回的对象的属性作为 <MenuItem/> 上的属性元素。

Codepen 还具有 onClick应用了处理程序。我将其留在这里,因为它与集中 key 计算没有太大关系。希望它对您有所帮助,并且您喜欢使用 React。 :)

关于javascript - 如何在 React/JSX 中手动创建的数组中设置键?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35377973/

相关文章:

javascript - 警告 Vue Js 中未保存的更改

reactjs - 使用 Route render 时,ReactComponent 没有与类型 'IntrinsicAttributes & { children?: ReactNode; }' 相同的属性

javascript - 通过 React-Redux 进行地理定位

javascript - 在 getStaticProps 函数中序列化 Next.js 时出错?

javascript - 如何使用 JavaScript 将变量的值传递到下一页?

javascript - JQuery 代码适用于 Chrome,但不适用于 IE 版本 8.0.7601.17514

reactjs - 如何将 Pug 与 React 结合使用?

javascript - fs.opensync 不是一个函数

javascript - 如何使用 React Native 使工具栏位于默认键盘上方?

javascript - 数据表:更改表的高度不起作用