Задать вопрос
  • Как использовать watch с [] внутри?

    0xD34F
    @0xD34F Куратор тега Vue.js
    Выражение с [] оформить как вычисляемое свойство. Установить наблюдение за этим свойством.
    Ответ написан
    Комментировать
  • Как сделать, чтобы при выборе значения в одном select'е оно пропадало в других?

    0xD34F
    @0xD34F Куратор тега JavaScript
    const selects = [...document.querySelectorAll('select')];
    const onChange = () =>
      selects.forEach(function({ value, options: [...n] }) {
        n.forEach(m => m.hidden = this(m.value) && value !== m.value);
      }, Set.prototype.has.bind(new Set(selects.map(n => n.value))));
    
    selects.forEach(n => n.addEventListener('change', onChange));
    Ответ написан
    1 комментарий
  • Как в ряду чекбоксов устанавливать checked только до того чекбокса, который был кликнут?

    0xD34F
    @0xD34F Куратор тега Vue.js
    data: () => ({
      checkedCount: 0,
    }),

    <div v-for="i in 10">
      <label>
        <input
          type="checkbox"
          :checked="i <= checkedCount"
          @change="checkedCount = checkedCount < i ? i : i - 1"
        >
        {{ 2 ** i }}
      </label>
    </div>
    Ответ написан
    Комментировать
  • Как "развернуть" таблицу, превратив строки в столбцы?

    0xD34F
    @0xD34F Куратор тега JavaScript
    function transposeTable(table) {
      const headerCol = table.rows[0]?.cells[1]?.tagName === 'TH';
      const content = Array.from(
        table.rows,
        tr => Array.from(tr.cells, td => td.innerHTML)
      );
    
      table.innerHTML = content[0]?.map((n, i) => `
        <tr>${content.map((m, j) => (j = (headerCol ? j : i) ? 'td' : 'th', `
          <${j}>${m[i]}</${j}>`)).join('')}
        </tr>
      `).join('') ?? '';
    }

    или

    function transposeTable(table) {
      const cells = Array.prototype.reduce.call(table.rows, (acc, tr) => (
        Array.prototype.forEach.call(tr.cells, (n, i) => (acc[i] ??= []).push(n)),
        acc
      ), []);
    
      table.replaceChildren();
      cells.forEach(n => table.insertRow().append(...n));
    }

    https://jsfiddle.net/q4wy9s1o/
    Ответ написан
    Комментировать
  • Как проверить, что набор карт образует покерную комбинацию "стрит"?

    0xD34F
    @0xD34F Куратор тега JavaScript
    Сделать вспомогательный объект, где для нечисловых карт будут указываться их числовые эквиваленты. Массив карт превратить в массив соответствующих им чисел (карты используется как ключ для извлечения значения из объекта, если ничего не найдено, то карта приводится к числу); отсортировать массив; убедиться, что разность соседних значений всегда составляет единицу.

    const weights = {
      j: 11,
      q: 12,
      k: 13,
      a: 14,
    };
    
    const isStraight = hand => hand
      .map(n => weights[n] ?? +n)
      .sort((a, b) => a - b)
      .every((n, i, a) => !i || (n - a[i - 1] === 1));
    Ответ написан
    Комментировать
  • Как убрать disabled при повторном нажатии на чекбокс?

    0xD34F
    @0xD34F Куратор тега JavaScript
    Не надо отслеживать никаких "повторных" "нажатий".
    Достаточно поставить состояние кнопки в зависимость от состояния чекбокса:

    чекбокс.addEventListener('change', e => кнопка.disabled = !e.target.checked);
    Ответ написан
    1 комментарий
  • Как создать/дополнить словарь?

    0xD34F
    @0xD34F
    d = input_dict
    
    for n in path.split('/'):
      d = d.setdefault(n, {})
    
    d[key] = data
    Ответ написан
    Комментировать
  • Почему не работает функция useSwiper слайдера во vue 3?

    0xD34F
    @0xD34F Куратор тега Vue.js
    Вроде делаю как в документации

    Делаете что? Если бы вы не только копипастили из документации примеры кода, но ещё и читали, что написано рядом, то знали бы, что useSwiper предназначен для того, чтобы

    get the Swiper instance in components inside of Swiper

    А теперь посмотрите, как относительно друг друга расположены экземпляр swiper'а, до которого вы хотите достучаться, и компонент, где вы делаете вызов useSwiper.

    Переделываем.

    import { ref } from 'vue';

    setup() {
      const swiper = ref();
    
      return {
        swiper,
        onSwiper: instance => swiper.value = instance,
        ...
      };
    },

    <swiper
      @swiper="onSwiper"
      ...
    >

    Ответ написан
    5 комментариев
  • Как отобразить блок "Нет элементов"?

    0xD34F
    @0xD34F Куратор тега JavaScript
    $('.elem_block').on('click', '.dell', function() {
      $(this).closest('.block').addClass('fx_none');
      $('.no-res').toggleClass('fx_none', !!$('.block:not(.fx_none)').length);
    });

    или

    document.addEventListener('click', e => {
      const btn = e.target.closest('.dell');
      if (btn) {
        btn.closest('.block').classList.add('fx_none');
        document.querySelector('.no-res').classList.toggle(
          'fx_none',
          !!document.querySelector('.block:not(.fx_none)')
        );
      }
    });

    UPD. Наконец-то дождались. Теперь можно сделать так:

    • Класс fx_none вырезаем
    • Элементам .no-res и .elem_block добавляем общую обёртку, какой-нибудь <div class="container">
    • По кликам на .dell вместо добавления класса, скрывающего элементы, удаляем их по-настоящему:

      document.querySelectorAll('.dell').forEach(function(n) {
        n.addEventListener('click', this);
      }, e => e.target.closest('.block').remove());
    • Прячем .no-res, если в .elem_block что-то есть:

      .container:has(.elem_block *) .no-res {
        display: none;
      }

      Если же удаление элементов не вариант, то прятать .no-res надо в том случае, если существует .block без класса, которые его скрывает:

      .container:has(.block:not(.fx_none)) .no-res {
        display: none;
      }


    Ответ написан
    Комментировать
  • Почему не работают стрелки слайдера?

    0xD34F
    @0xD34F
    Потому что не подключен модуль навигации.

    Надо его импортировать: import { Navigation } from 'swiper';.
    И указать в настройках при инициализации: modules: [ Navigation ],.
    Ответ написан
    1 комментарий
  • Как переделать код для множества segmented control?

    0xD34F
    @0xD34F Куратор тега JavaScript
    const controls = document.querySelectorAll('.segmented-control');
    controls.forEach(n => n.addEventListener('change', updatePillPosition));
    window.addEventListener('resize', () => controls.forEach(n => updatePillPosition.call(n)));
    
    function updatePillPosition() {
      const inputs = [...this.querySelectorAll('.option input')];
      const x = this.offsetWidth / inputs.length * inputs.findIndex(n => n.checked);
      this.querySelector('.selection').style.transform = `translateX(${x}px)`;
    }
    Ответ написан
    Комментировать
  • Как показать определённое количество блоков по клику?

    0xD34F
    @0xD34F Куратор тега JavaScript
    const SHOW_ON_LOAD = 3;
    const SHOW_MORE = 2;
    
    const items = [...document.querySelectorAll('.box-list__item')];
    const button = document.querySelector('.show-more');
    
    showItems(SHOW_ON_LOAD);
    button.addEventListener('click', () => showItems(SHOW_MORE));
    
    function showItems(count) {
      items.splice(0, count).forEach(n => n.classList.add('ui-box-active'));
      button.classList.toggle('ui-button-hidden', !items.length);
    }
    Ответ написан
    1 комментарий
  • Какую логику сделать для проверки верности вопроса в приложении тест?

    0xD34F
    @0xD34F Куратор тега React
    Начать следует не с какой-то там логики, а со структуры данных, что содержит вопросы. То, что есть сейчас, никуда не годится. Что, если завтра вместо трёх вариантов ответа надо будет сделать четыре? Будете добавлять ещё по два свойства в каждый объект в массиве вопросов, а в компоненте закопипастите ещё один input? А если в разных вопросах должно будет быть разное количество вариантов ответа? Что тогда?

    Варианты ответа складываете в массив, а корректный вариант обозначаете через его индекс:

    const questions = [
      {
        text: 'Выберите верное утверждение',
        answers: [
          'СССР распался в 1997 году',
          'Солнце вращается вокруг Земли',
          'шестью восемь - двадцать три',
        ],
        correctAnswer: 1,
      },
      {
        text: '...',
        answers: [ '...', '...', ... ],
        correctAnswer: ...,
      },
      ...
    ];

    В компоненте вопроса вместо того, чтобы копипастить input'ы, делаете цикл по вариантам ответа:

    function Question(props) {
      const onChange = e => props.onAnswerChange(+e.target.value);
    
      return (
        <div>
          <h3>{props.question.text}</h3>
          <ol>
            {props.question.answers.map((n, i) => (
              <li>
                <label>
                  <input
                    type="radio"
                    value={i}
                    checked={props.answer === i}
                    onChange={onChange}
                  />
                  {n}
                </label>
              </li>
            ))}
          </ol>
        </div>
      );
    }

    В родительском компоненте храните массив ответов:

    function App(props) {
      const [ answers, setAnswers ] = useState(Array(props.questions.length).fill(null));
    
      const updateAnswer = (questionIndex, answer) =>
        setAnswers(answers.map((n, i) => i === questionIndex ? answer : n));
    
      return (
        <div>
          {props.questions.map((n, i) => (
            <Question
              question={n}
              answer={answers[i]}
              onAnswerChange={answer => updateAnswer(i, answer)}
            />
          ))}
        </div>
      );
    }

    Ну и возвращаясь к вашему вопросу, чего там надо было?

    не получается сделать грамотную проверку правильного ответа...

    Чтобы проверить правильность ответа, надо сравнить его со значением свойства correctAnswer у соответствующего (с тем же индексом) вопроса. Например, считаем количество правильных ответов:

    const correctAnswersCount = answers.reduce((acc, n, i) => {
      return acc + (n === questions[i].correctAnswer);
    }, 0);

    ...и одновременно вывести верные ответы

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

    const correctAnswers = questions.map(n => n.answers[n.correctAnswer]);

    Ну а массив строк вывести - надеюсь, справитесь сами.

    UPD. Посмотреть живьём можно здесь (есть отличия от того, что есть или предполагается у вас - вопросы показываются по очереди, а не все сразу; в результатах отображаются только верные ответы).
    Ответ написан
    1 комментарий
  • Как изменить иконку курсора, когда перетаскиваем элемент по сайту?

    0xD34F
    @0xD34F Куратор тега CSS
    селектор перетаскиваемого элемента:active {
      cursor: что сюда можно вписать, смотрите здесь - developer.mozilla.org/en-US/docs/Web/CSS/cursor
    }
    Ответ написан
    Комментировать
  • Как изменить атрибут строки в таблице по нажатию?

    0xD34F
    @0xD34F Куратор тега Vue.js
    :readonly="`${item.isReadonly}`"

    Ну и зачем в строку его засовывать? Вместо false будет "false", а булевым эквивалентом любой непустой строки является true.
    Ответ написан
  • Как сделать выборку json из postgres?

    0xD34F
    @0xD34F
    Есть поле desc

    А ещё есть ключевое слово desc. Ну, для задания направления сортировки. Как думаете, может ошибка случатся от того, что ключевое слово desc находится в неположенном месте?

    Оберните свой desc в двойные кавычки. А лучше - переименуйте столбец.
    Ответ написан
    1 комментарий
  • Как создать активность только одного элемента из многих?

    0xD34F
    @0xD34F Куратор тега Vue.js
    Активность кнопки пусть задаётся извне:

    props: {
      active: Boolean,
    },

    В родителе должно быть свойство, указывающее, кто активен (хранит индекс/имя/id - что-то, что имеет уникальное значение для каждой из кнопок):

    data: () => ({
      active: null,
    }),

    Активность конкретной кнопки вычисляете в зависимости от равенства упомянутой выше уникальной характеристики кнопок значению свойства активности; по клику переключаете значение активности:

    <v-button
      v-for="i in 3"
      :active="active === i"
      @click="active = active === i ? null : i"
    >
    Ответ написан
    1 комментарий
  • Когда применять arr.reduce?

    0xD34F
    @0xD34F Куратор тега JavaScript
    Когда сочтёте нужным. Типа, подумали, и решили - здесь reduce нужен. Или не нужен. Да, подумали. Для этого у вас есть особый инструмент - голова называется.
    Ответ написан
    Комментировать
  • Как в таблице element-plus преобразовать данные при выводе?

    0xD34F
    @0xD34F Куратор тега Vue.js
    <el-table-column prop="block" label="Block">
      <template #default="{ row }">
        {{ row.block ? 'hello, world!!' : 'fuck the world' }}
      </template>
    </el-table-column>
    Ответ написан
    Комментировать