Невозможно установить фокус на содержимом компонента Tooltip из пользовательского интерфейса материала при запуске события onClick, но возможно при запуске события onKeyPress

Я использую компонент Tooltip из MUI в своем настроенном TooltipComponent. TooltipComponent работает аналогично Dialog: пользователь может видеть всплывающее содержимое после щелчка (не наведения курсора мыши) на элемент (в моем случае div с текстом «CLICK»). Это всплывающее окно с содержимым состоит из текста и значка «x». Щелкнув значок «x», можно закрыть всплывающую подсказку. Я добавил два события: onClick и onKeyPress, они оба делают одно и то же — открывают всплывающее содержимое. В целях обеспечения доступности, когда всплывающее содержимое открыто, мне необходимо установить фокус на значок «x». Я делаю это в React, используя ссылку. Мне удалось сделать это с помощью события onKeyPress, и я ожидал, что тот же код отлично работает для события onClick, но это не работает. Я не только не могу поставить фокус после срабатывания onClick, но и почему-то всплывающее окно открывается и закрывается сразу без моего вмешательства (по логике кода всплывающее окно можно закрыть только после нажатия «x» )

Почему один и тот же код идеально работает для onKeyPress и не работает для onClick? И как решить эту проблему для onClick?
Я ценю любую помощь.

Вот код моего пользовательского компонента TooltipComponent:

import React, { useEffect, useRef, useState } from 'react';
import {Tooltip, ClickAwayListener} from '@mui/material';

function TooltipComponent() {  
 const [open, setOpen] = useState(false);   
 const toggleTooltip = () => setOpen(!open); 
 const closeTooltip = () => setOpen(false);  
 const myDivRef = useRef(null);

  useEffect(() => {
    if (myDivRef.current) {
      if (open){
        myDivRef.current.focus();
      }
    }}, [open]);

  const BodyWrapper = (
    <ClickAwayListener onClickAway = {closeTooltip}>
      <div style = {{ position: 'relative' }}>
        <div
          tabIndex = {0}
          ref = {myDivRef}
          onClick = {closeTooltip}
          onKeyPress = {closeTooltip}
          aria-description = "close icon"
          style = {{
            position: 'absolute',
            left: '-3px',
            top: '-3px',
            fontSize: '36px',
            fontWeight: 'light',
            cursor: 'pointer',
          }}
        >
          x
        </div>
        <div aria-description = "tooltip content">
          <div style = {{ padding: '24px', color: 'black' }}>
            Top - Start -{' '}
            <div>
              <a href = "#">I am a link</a>
            </div>
          </div>
        </div>
      </div>
    </ClickAwayListener>   );

  return (
    <Tooltip
      title = {BodyWrapper}
      arrow
      disableHoverListener = {true}
      tabIndex = {0}
      open = {open}
      placement = "bottom"
      onClose = {closeTooltip}
      PopperProps = {{
        disablePortal: true,
        role: 'dialog',
        'aria-live': 'polite',
      }}
    >
      <div
        onClick = {toggleTooltip}
        onKeyPress = {toggleTooltip}
        style = {{
          display: 'inline-block',
          textAlign: 'center',
          cursor: 'pointer',
        }}
      >
        <div style = {{ margin: '6px', color: 'black' }}>
          CLICK
        </div>
      </div>
    </Tooltip>   ); }

export default TooltipComponent;
  
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
1
0
62
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ваша функция работает, но поскольку вы нажимаете «X» в верхней части всплывающей подсказки, на которой есть еще один onClick, появляются пузырьки событий. Обе функции onClick работают, и всплывающая подсказка снова открывается. Попробуй это:

const closeTooltip = (e) => {
  e.stopPropagation();
  setOpen(false)
}

сопутствующая документация:

https://developer.mozilla.org/en-US/docs/Web/API/Event/stopPropagation

Ответ принят как подходящий

Попробуйте использовать Tooltop с элементом кнопки, а не с элементом Div со свойством onClick. Также можно использовать свойство ref, чтобы проверить, происходят ли события клавиш кнопки.

return (
    <div>
      <Tooltip
        PopperProps = {{
          disablePortal: true,
        }}
        onClose = {handleTooltipClose}
        open = {open}
        disableFocusListener
        disableHoverListener
        disableTouchListener
        title = "Tooltip content"
      >
        <Button
          ref = {buttonRef}
          onClick = {toggleTooltip}
          onKeyPress = {toggleTooltip}
        >
          Click or press Enter
        </Button>
      </Tooltip>
    </div>
  );

На самом деле, похоже, что добавления отключенногоFocusListener = {true} было достаточно, чтобы решить мою проблему, потому что я переопределяю поведение фокусировки компонента. Спасибо всем

Другие вопросы по теме