Указывает, удерживается ли сдвиг в onClick в React

#javascript #reactjs

#javascript #reactjs

Вопрос:

Мне нужно запускать onClick только в том случае, если meta (mac) / ctrl (win) удерживается при нажатии.

Вот что я попробовал:

 const [shiftOn, setShiftOn] = useState(false)

  useEffect(() => {
    document.addEventListener('keydown', (e) => {
      e.preventDefault()
      if ((e.metaKey || e.ctrlKey) amp;amp; e.code === 'KeyC') {
        setShiftOn(true)
      }
    })
  })

  useEffect(() => {
    document.addEventListener('keyup', (e) => {
      e.preventDefault()
      if ((e.metaKey || e.ctrlKey) amp;amp; e.code === 'KeyC') {
        setShiftOn(false)
      }
    })
  })

  const highlightCol = () => {
    console.log(shiftOn) // always false
    if (shiftOn) ... do something
  }

const col = (
        <td onClick={highlightCol} {...tdProps}>
          {colName}
        </td>

  

Ответ №1:

Вы почти на месте — metaKey , shiftKey , и т.д. — это то, что вы ищете, но вы ищете их не в том месте: это будут просто логические свойства самого события щелчка. Вам не нужно проверять отдельные события нажатия или нажатия клавиш на клавишах shift или cmd, поэтому вы можете удалить все, что у вас есть в useEffect.

Все, что вам нужно, это обработчик одного щелчка:

   const highlightCol = e => {
    if (e.shiftKey) {
      // shift key was down during the click
    }
    if (e.ctrlKey) {
      // ctrl key was down during the click 
    }
  }
  

onClick всегда будет запущен; просто проверьте свойства shiftKey его события (или metaKey, или altKey, или ctrlKey), чтобы решить, делать ли что-либо в нем.

Ответ №2:

Разные браузеры могут иметь разные реализации обнаружения нажатых клавиш.
Я думаю, проблема здесь в том, что вы неправильно определяете клавишу ctrl / meta.

Попробуйте заглянуть в эту службу, чтобы узнать, какими способами вы должны определить конкретный ключ.

Ниже то, что он показывает для меня, когда я нажимаю клавишу ctrl на win.

введите описание изображения здесь

Лучше использовать несколько методов обнаружения ключей, чтобы охватить все браузеры и платформы.

Ответ №3:

Вы можете ошибиться в способе определения управляющей клавиши. Кстати, просто зарегистрируйте прослушиватель событий 1 раз.

 const Component =(props)=>{
    const [valueFromChild, setValueFromChild] = useState('');

    const [shiftOn, setShiftOn] = useState(false)

    useEffect(() => {
        document.addEventListener('keydown', (e) => {
            console.log('dow', e);
            e.preventDefault()
            if (e.key === 'Control') {
                setShiftOn(true)
            }
        })
    }, [])

    useEffect(() => {
        document.addEventListener('keyup', (e) => {
            console.log('up', e);
            e.preventDefault()
            if (e.key === 'Control') {
                setShiftOn(false)
            }
        })
    }, [])

    const highlightCol = () => {
        console.log(shiftOn) // always false
        if (shiftOn) {

        }
    }

    return <>
        {shiftOn ? 'on' : 'off'}
        <button onClick={highlightCol} > Click </button>
        </>
}