Как использовать флажок внутри опций выбора? Реагировать на крючок - PullRequest
7 голосов
/ 17 июня 2020

В настоящее время я пытаюсь создать этот дизайн.

hoo

Он не открывается и не закрывается должным образом. Я также создал codeandbox

Три вещи:
1. У меня есть onClick, но я не уверен, правильно ли мой logi c открывает и закрывает кнопку .Также должен ли быть здесь useEffect для прослушивания изменений?

const showPlatformOptions =()=> {
  //  let checkboxes = el;
  //  console.log("ref:",myRef.current)
  //   if (!expanded) {
  //    //checkboxes.style.display = "block";
  //     setExpanded(true);
  //   } else {
  //   // checkboxes.style.display = "none";
  //     setExpanded(false);
  //   }


  }

У меня есть onChange под названием selectionOptions, который должен сообщить мне, какие платформы выбраны, но в настоящее время он показывает только одну платформу за раз, почему?

Является есть другой способ создать это раскрывающееся меню и флажок. Может быть, библиотека, использующая хуки?

Любая помощь приветствуется.

import React, { useState,useEffect, useRef} from "react";


const SearchBar =()=>{
  const [query, setQuery] = useState("");
  const [expanded,setExpanded] = useState(false);
  const [selectionOptions, setSelectionOptions] = useState(["Instagram","LinkedIn","Twitter"]);
  const myRef = useRef(null);

  const showPlatformOptions =()=> {
  //  let checkboxes = el;
  //  console.log("ref:",myRef.current)
  //   if (!expanded) {
  //    //checkboxes.style.display = "block";
  //     setExpanded(true);
  //   } else {
  //   // checkboxes.style.display = "none";
  //     setExpanded(false);
  //   }


  }

  const handleQueryChange = event => {
    console.log("Event:",event.target.value)
    setQuery(event.target.value);
  };

  return (
    <form onSubmit={showPlatformOptions}>
      <div className="w-64">
        <div className="relative" onClick={showPlatformOptions}>
          <h6>PLATFORMS </h6>
          <select className="w-full font-semibold"  onChange={handleQueryChange}>
              {selectionOptions.map((platform,x) => (
                  <option key={x} value={platform}>
                      {platform}
                  </option>
              ))}
          </select>
          <div className="absolute left-0 right-0 top-0 bottom-0"></div>
        </div>
        <div 
        ref={myRef}
        className="checkboxes border-gray-200 border border-solid">
          <label htmlFor="one" className="block ">
            <input type="checkbox" id="one" onChange={handleQueryChange} className="m-3"/>
            Instagram</label>
          <label htmlFor="two" className="block">
            <input type="checkbox" id="two" onChange={handleQueryChange} className="m-3"/>
            LinkedIn</label>
          <label htmlFor="three" className="block">
            <input type="checkbox" id="three" onChange={handleQueryChange} className="m-3"/>
            Twitter</label>
        </div>
      </div>
    </form>
  );
}

Ответы [ 3 ]

3 голосов
/ 25 июня 2020

Вы действительно близки со своим логом c и кодом, пока так хорошо сделано! Я отвечу на ваши вопросы по порядку:

  1. У меня есть onClick, но я не уверен, правильно ли мой logi c открывает и закрывает кнопку. быть useEffect здесь, чтобы слушать изменения?

Да, ваш logi c для переключения скрытия и отображения раскрывающегося списка на месте. Единственное, о CSS можно не беспокоиться. Вы можете использовать это логическое значение, чтобы отображать или скрывать раскрывающийся список при изменении состояния.

У меня есть onChange под названием selectionOptions, который должен сообщить мне, какие платформы выбраны, но в настоящее время он показывает только одну платформу за раз, почему?

Хороший вопрос, причина для это потому, что он срабатывает при смене флажка "каждый". При изменении флажков вы увидите событие срабатывания и просто покажете значение для нового флажка. Сам флажок - это то, что обозначает event.target. Не вся форма

Есть ли другой способ создать это раскрывающееся меню и флажок. Может быть, библиотека с хуками?

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

Вот

Я укажу на пару изменений, которые я сделал:

  1. Вместо того, чтобы иметь дело с CSS, я использовал вашу переменную expanded, чтобы определить, следует ли отображать раскрывающийся список. Этот условный лог c находится в строке 50.

  2. Поскольку вы хотите отслеживать все различные запросы, я изменил переменную query, чтобы отслеживать, какие запросы были выбраны в массив. Лог c для этого находится в строке 26, но в основном, если пользователь снимает флажок, я удаляю его из массива (если он есть), и если они проверяют его, я добавляю его в массив (если его нет).

Надеюсь, это вам поможет!

2 голосов
/ 30 июня 2020

Ответ, данный Code Novitiate, действительно хорош для устранения ошибок в вашем существующем коде ? Это немного другой подход, который упрощает код.

В настоящее время вы пытаетесь визуализировать select и отдельно флажки рендеринга. select и его содержимое на самом деле никогда не используются, кроме визуального отображения значка раскрывающегося списка.

Лично мне сложно работать с собственным тегом select, особенно когда вы хотите выбрать несколько вариантов . Большинство избранных библиотек, похоже, создают свои собственные компоненты из div s и стилируют их так, чтобы они выглядели и чувствовали себя как select, что, я думаю, может быть лучшим подходом и здесь ?

Подход

  • Условное отображение флажков в зависимости от того, был ли раскрывающийся список развернут
  • Отслеживать выбор в локальном состоянии
  • Обновлять состояние при каждом щелчке по одному из флажков
  • Рендеринг выбранных элементов в раскрывающемся заголовке
  • Стиль раскрывающегося заголовка, чтобы он выглядел как выбор
    • В моем примере я добавил маленький треугольник в css, но вы бы использовали что-то, что лучше соответствует дизайн, который у вас есть

Пример

Я собрал этот CodePen , который, надеюсь, будет вам полезен

Другие предложения

  • response-select - действительно хорошая библиотека для того, чтобы делать то, что вы хотите, взгляните на пример Multi.
  • Учитывая, что selectionOptions никогда не меняется, нет причин считать это государством. Вместо этого вы можете просто объявить массив. В моем примере это константа PLATFORMS.
  • удалить <div className="absolute left-0 right-0 top-0 bottom-0" />. Похоже, эффект заключается в создании div, покрывающего всю область? Это доставило мне проблемы, потому что это мешает некоторым событиям щелчка ?
1 голос
/ 28 июня 2020

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

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

...