如何为 HOC 组件设置 key?

How to set keys for HOC components?

class Demo extends Component {
  render() {
    const { list } = this.state
    return (
      <div>
        {list.map(this._renderItem)}
      </div>
    )
  }
  _renderItem = item => {
    const Item = withSwipeDelete(
      <div>{item.id}</div>,
      () => console.log('callback')
    )
    return <Item />
  }
}

这是我的代码示例,其中警告:列表中的每个 child 都应该有一个唯一的 "key" prop

所以我尝试了:

  _renderItem = item => {
    const Item = withSwipeDelete(
      <div key={item.id}>{item.id}</div>, // add key here
      () => console.log('callback')
    )
    return <Item />
  }

还有这个:

  _renderItem = item => {
    const Item = withSwipeDelete(
      <div>{item.id}</div>,
      () => console.log('callback')
    )
    return <Item key={item.id} /> // add key here
  }

两者都不行。

withSwipeDeletehigher-order-components:

export default function withSwipeDelete(Cell, onDelete) {
  return class extends Component {
    render() {
      return (
        <div>
          {Cell}
        </div>
      )
    }
  }
}

您发布的第二个解决方案应该有效:

_renderItem = item => {
    const Item = withSwipeDelete(
      <div>{item.id}</div>,
      () => console.log('callback')
    )
    return <Item key={item.id} /> // add key here
}

我这里试过了https://codesandbox.io/s/brave-http-3w3ki

只要id是唯一的,控制台就不会出现错误。

说明:React 会要求您在您尝试渲染项目数组的地方放置一个键。如果我们简化您的代码(不管 HOC 是什么),您实际上是在主渲染中的 <div> 内渲染一个数组。翻译后的意思是你有一个 <Item /> 组件数组(因为这是 _renderItem 会 return 的),因此,每个 <Item /> 都需要一个键。