【问题标题】:React Semantic UI - add key to options in Dropdown menuReact Semantic UI - 向下拉菜单中的选项添加键
【发布时间】:2017-01-05 06:09:46
【问题描述】:

我有这个下拉菜单实例:

      <Dropdown
        selection
        options={this.state.options}
        search
        value={value}
        onChange={this.handleChange}
        onSearchChange={this.handleSearchChange}
      />

当我的后端返回响应时,它被设置为状态,其结构如下:

"options": [
    {
      "text": "New York,All Airports (NYC) , USA",
      "value": "NYC"
    },
    {
      "text": "New York,Newark Liberty Intl (EWR), USA",
      "value": "EWR"
    },
    {
      "text": "New York,John F Kennedy (JFK), USA",
      "value": "JFK"
    },
    {
      "text": "New York,La Guardia (LGA), USA",
      "value": "LGA"
    }
  ]

...我收到此警告:

警告:flattenChildren(...): 遇到两个相同的孩子 键,1:$BLZ。子键必须是唯一的;当两个孩子共用一个 键,只会使用第一个孩子。

in select (created by Dropdown)
in div (created by Dropdown)
in Dropdown (created by SearchForm)

如何向这些元素添加键以防止出现此警告?

【问题讨论】:

    标签: javascript reactjs semantic-ui


    【解决方案1】:

    查看Semantic UI source for the dropdown 组件的代码,render options 函数将您传入的选项转换为 DropdownItem 组件数组:

    renderOptions = () => {
        const { multiple, search, noResultsMessage } = this.props
        const { selectedIndex, value } = this.state
        const options = this.getMenuOptions()
    
        if (noResultsMessage !== null && search && _.isEmpty(options)) {
          return <div className='message'>{noResultsMessage}</div>
        }
    
        const isActive = multiple
          ? optValue => _.includes(value, optValue)
          : optValue => optValue === value
    
        return _.map(options, (opt, i) => (
          <DropdownItem
            key={`${opt.value}-${i}`}
            active={isActive(opt.value)}
            onClick={this.handleItemClick}
            selected={selectedIndex === i}
            {...opt}
            // Needed for handling click events on disabled items
            style={{ ...opt.style, pointerEvents: 'all' }}
          />
        ))
      }
    

    该数组的键是通过获取 value 属性并将索引附加到它来设置的:

    key={`${opt.value}-${i}`}
    

    它应该始终是唯一的,因为使用了索引,但是hidden inputs 的另一部分代码

     renderHiddenInput = () => {
        debug('renderHiddenInput()')
        const { value } = this.state
        const { multiple, name, options, selection } = this.props
        debug(`name:      ${name}`)
        debug(`selection: ${selection}`)
        debug(`value:     ${value}`)
        if (!selection) return null
    
        // a dropdown without an active item will have an empty string value
        return (
          <select type='hidden' aria-hidden='true' name={name} value={value} multiple={multiple}>
            <option value='' />
            {_.map(options, option => (
              <option key={option.value} value={option.value}>{option.text}</option>
            ))}
          </select>
        )
      }
    

    在这一项中,键仅设置为值,而不是值加索引。

     <option key={option.value} value={option.value}>{option.text}</option>
    

    这可能是您的问题,如果您有重复的值,那么键将不是唯一的。仔细检查选项列表以确保没有重复值。

    【讨论】:

    • 嘿,谢谢你的信息。我现在知道了。我认为这个问题的发生是因为一些数据被缓存了。基本上我正在进行自动完成搜索,并且在语义 UI 的 jQuery 版本中,我会让 saveRemoteData 等于 false 以防止它发生。但是在 React 版本中,该设置不存在(或至少据我所知--github.com/Semantic-Org/Semantic-UI-React/issues/1124
    • 如果您还不熟悉,我强烈建议您使用Chrome React Tools。这将让您查看您的选项集合并仔细检查值。
    • 您好,感谢您的建议,我正在使用 Firefox 版本的 React 工具。我做了更多的挖掘并找到了重复项。
    猜你喜欢
    • 1970-01-01
    • 2014-04-05
    • 1970-01-01
    • 1970-01-01
    • 2018-05-09
    • 2018-10-31
    • 1970-01-01
    • 1970-01-01
    • 2021-02-02
    相关资源
    最近更新 更多