如何处理点击子元素

Posted

技术标签:

【中文标题】如何处理点击子元素【英文标题】:How to handle click on child element 【发布时间】:2019-07-03 19:13:37 【问题描述】:

为什么我在这里对子元素执行点击事件时会产生错误?当我附加onClick=this.handleChangeCity in the"cities"` 类时也产生了错误

我很想听听您是如何解决这个问题的。

Eslint 错误:[eslint] 具有点击处理程序的可见、非交互式元素必须至少有一个键盘侦听器。 (jsx-a11y/click-events-have-key-events) [eslint] 带有事件处理程序的静态 html 元素需要一个角色。 (jsx-a11y/no-static-element-interactions) (JSX 属性) onClick: 任意

import React from "react";
import ReactDOM from "react-dom";
import jsonData from "./navigation.json";

class App extends React.Component 
    constructor(props) 
super(props);

this.state = 
  loading: true,
  cities : jsonData.cities,
  currentCity: jsonData.cities[0].label,
;

this.handleChangeCity = this.handleChangeCity.bind(this);
  

  createCities()
    //let cityList = [];
    let children = [];
    let cityClass = 'oneCity';
    let activeCityClass = `$cityClass active`;
    this.state.cities.forEach((city, index) => 
      let divClass = index ? cityClass : activeCityClass;
      children.push(<div 
        onClick=this.handleChangeCity ===> error when this is added
        className=divClass 
        data-city=city.label
        key=index>city.label</div>)
    );

    return children;

  

我不知道为什么会这样......

  handleChangeCity = (event) => 
    event.preventDefault();
    console.log(event.currentTarget);
    this.setState(
      currentCity: event.currentTarget.key
    );
  



  render() 
    return (

      <section className="container">
        <div className="navigation">
          <div className = "cities clearfix">
               this.createCities()

          </div>

          <div className="underline"></div>
        </div>
      </section>
    );
  


ReactDOM.render(<App />, document.getElementById("root"));

【问题讨论】:

包括你得到的具体错误和它发生的行。 @Jayce444 刚刚添加 对于那些在尝试将交互式 div 设为按钮时遇到此问题的人。 1.***.com/a/48576350/6119618(同时添加onClick和onKeyDown)2.***.com/a/54274507/6119618(添加role="button")3.***.com/a/57380207/6119618(添加tabindex)4.dequeuniversity.com/tips/tabindex-positive-numbers(正tab index) 【参考方案1】:

看起来你有 2 个 linting 错误。首先是Visible, non-interactive elements with click handlers must have at least one keyboard listener.。这看起来是关于可访问性的,因此人们可以使用键盘鼠标进行交互。所以你也必须添加一个密钥处理程序,查看this similar post。

第二期是Static HTML elements with event handlers require a role.。这是一个 linting 选项,可防止将事件处理程序绑定到像 &lt;div/&gt; 这样的通用事物。查看this post 以获得答案。

或者,您可以更改或禁用 linting,这样这些就不再是问题了。

【讨论】:

其实我都加了,但是还是有错误……是的,我也用了div,这可能是问题所在,但没关系【参考方案2】:

这些是 ESLint 文档中提到的 linting 问题,如下所示:

Enforce onClick 至少伴随以下一项: onKeyUp、onKeyDown、onKeyPress。

要解决此问题,您可以使用上述任何道具并将您的代码更改为:

<div 
   onClick=this.handleChangeCity
   onKeyDown=this.handleChangeCity
   className=divClass 
   data-city=city.label
   key=index>city.label
</div>

【讨论】:

以上是关于如何处理点击子元素的主要内容,如果未能解决你的问题,请参考以下文章

在 MVVM + Coordinator 中,如何处理子视图?

android RecyclerView嵌套 RecyclerView 子item 和 父item点击事件如何处理

交互PopGesture时如何处理UITabBarController的子视图(如Flipboard)

如何处理带有角度 2 参数的子路由?

如何处理 XML 中 URL 中的特殊字符

垂直方向的布局