(ReactJS) 不应为非交互式元素分配鼠标或键盘事件侦听器

Dav*_*ton 11 javascript reactjs

我收到此错误和两个警告:

不应为非交互式元素分配鼠标或键盘事件侦听器。

道具验证中缺少 video 和 onVideo 选择

import React from 'react';

const VideoListItem = ({ video, onVideoSelect }) => {
  const imageUrl = video.snippet.thumbnails.default.url;

  return (
    <li onClick={() => onVideoSelect(video)} className="list-group-item">
      <div className="video-list media">
        <div className="media-left">
          <img className="media-object" src={imageUrl} alt="Media" />
        </div>

        <div className="media-body">
          <div className="media-heading">{video.snippet.title}</div>
        </div>
      </div>
    </li>
  );
};

export default VideoListItem;
Run Code Online (Sandbox Code Playgroud)

有人请以正确的方式帮助我纠正这些问题。

Pau*_*oze 11

第一个警告意味着,你不应该onClickli元素上有事件监听器,只能在元素 like<a><button>element 上。

第二个警告是关于不使用 PropTypes 包 - 你应该验证你传递给你的组件的道具 - 它说明传递的道具应该是什么 - 在你的情况下video是一个对象,onVideoSelect是一个函数,对吧?您可以像这样使用https://www.npmjs.com/package/prop-types包:

import PropTypes from 'prop-types'; // or PropTypes = require('prop-types');

const VideoListItem = ({ video, onVideoSelect }) => {...};

VideoListItem.propTypes = {
  video: PropTypes.object.isRequired,
  onVideoSelect: PropTypes.func.isRequired,
};
Run Code Online (Sandbox Code Playgroud)

如果您省略isRequired,您将收到关于 props 没有默认值的警告(假设您使用的是 airbnb linter 配置 - 看起来像这样)。你可以像这样修复它:

VideoListItem.defaultProps = {
  video: {},
  onVideoSelect: () => {},
}
Run Code Online (Sandbox Code Playgroud)