Задать вопрос
  • Как задать условие в компоненте слайдера?

    0xD34F
    @0xD34F Куратор тега Vue.js
    Сделать markSlider из обычного свойства вычисляемым:

    computed: {
      markSlider() {
        switch (this.selectedCoin) {
          case 'BTC': return что-то одно;
          case 'ETH': return что-то другое;
    
          default: return null;
        }
      },
      ...
    Ответ написан
    Комментировать
  • Как мне установить интервал выбора данных слайдера равным 100?

    0xD34F
    @0xD34F Куратор тега Vue.js
    если я ставлю параметр :interval="100", то у меня появляется черная полоса под слайдером и все начинает очень лагать

    Разница между максимальным и минимальным доступными значениями 150000. Делим на 100, получаем 1500. Это количество отметок под слайдером. Ширина экрана в пикселях имеет тот же порядок - естественно, все эти 100, 200, ... наслаиваются друг на друга до степени абсолютной неразличимости - отсюда "черная полоса".

    Сами отметки представлены тремя div'ами каждая. Изменили значение с 1000 на 10000, например - надо переназначить классы (с последующей перерисовкой) у 27000 элементов. Как думаете, может ли это быть причиной вашего "очень лагать"?

    Что делать? - рисовать меньше отметок. Скажем, одну через каждые двадцать тысяч:

    methods: {
      marks: v => !(v % 20000),
      ...

    <vue-slider
      :marks="marks"
      ...
    Ответ написан
    1 комментарий
  • Как назначать класс активному элементу внутри блока независимо от других блоков?

    0xD34F
    @0xD34F Куратор тега JavaScript
    Где элементы находятся, что за элементы, какой класс у них надо переключать:

    const containerSelector = '.block-btn';
    const itemSelector = `${containerSelector} [data-cost]`;
    const activeClass = 'active';

    Какие тут возможны варианты:

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

    const onClick = ({ currentTarget: t }) => t
      .closest(containerSelector)
      .querySelectorAll(itemSelector)
      .forEach(n => n.classList.toggle(activeClass, n === t));
    
    document.querySelectorAll(itemSelector).forEach(n => {
      n.addEventListener('click', onClick);
    });

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

    for (const n of document.querySelectorAll(containerSelector)) {
      n.addEventListener('click', onClick);
    }
    
    function onClick(e) {
      const item = e.target.closest(itemSelector);
      if (item) {
        this.querySelector(`.${activeClass}`)?.classList.remove(activeClass);
        item.classList.add(activeClass);
      }
    }

    Делегированный обработчик для всей страницы. От элемента, где случился клик, поднимаемся до элемента, которому должен быть назначен класс, если таковой нашёлся, получаем также и его соседей, перебираем их, переключаем класс в зависимости от наличия внутри элемента, где случился клик:

    document.addEventListener('click', ({ target: t }) => t
      .closest(itemSelector)
      ?.closest(containerSelector)
      .querySelectorAll(itemSelector)
      .forEach(n => n.classList.toggle(activeClass, n.contains(t)))
    );
    Ответ написан
    2 комментария
  • Как сбросить состояние всех компонентов одной кнопкой?

    0xD34F
    @0xD34F Куратор тега React
    Храните значения, отвечающие за цвет текста, в родительском компоненте, можно вместе с остальными данными:

    const [ items, setItems ] = useState([
      { id: ..., text: '...', active: false },
      { id: ..., text: '...', active: false },
      ...
    ]);

    Тогда сброс этих значений оказывается делом тривиальным:

    const reset = () => setItems(items.map(n => ({ ...n, active: false })));

    <button onClick={reset}>reset</button>

    Ну а переключение значений изнутри экземпляров компонента Text придётся переписать. Сделаем функцию, которая принимает id, и изменяет соответствующий элемент:

    const toggle = id => setItems(items.map(n => n.id === id ? { ...n, active: !n.active } : n));

    Передадим эту функцию в экземпляры компонента Text:

    {items.map(n => <Text key={n.id} {...n} toggle={toggle} />)}

    Назначим её в качестве обработчика клика:

    const Text = ({ id, text, active, toggle }) => (
      <p
        className={active ? 'active' : ''}
        onClick={() => toggle(id)}
      >
        {text}
      </p>
    );

    Всё.
    Ответ написан
    Комментировать
  • Как переключить на нужный слайд если loop?

    0xD34F
    @0xD34F
    let linkIndex = link.dataset.first;
    <...>
    mySwiper.slideToLoop(linkIndex);

    Значения какого типа содержаться в dataset? Строки. А индекс - это что? Число. Ну так сделайте из строки число.
    Ответ написан
    Комментировать
  • Как исправить ошибку при удалении элемента списка?

    0xD34F
    @0xD34F Куратор тега React
    Самый простой способ - перенести вызов setIsDeleted из finally в catch.

    Понимаю, что это как-то связано с преждевременным размонтированием компонента перед завершением api запроса.

    Не связано. Запрос успешно завершается, удаляется элемент данных, соответствующий ему экземпляр компонента тоже долой - и уже после этого вы пытаетесь обновить состояние экземпляра компонента. А зачем? Не всё ли равно, как он будет выглядеть, если его уже нет?
    Ответ написан
    1 комментарий
  • Как вывести список с перечеслением порядка элементов?

    0xD34F
    @0xD34F
    print('\n'.join(f'{i}. {n}' for i, n in enumerate(arr, 1)))
    Ответ написан
    Комментировать
  • Как мне передать статические данные в label слайдера?

    0xD34F
    @0xD34F Куратор тега Vue.js
    я так понимаю - это называется label

    не понимаете
    Ответ написан
    Комментировать
  • Как мне по дефолту отключить ряд "First Y Data 1 - portfolio pnl"на диаграмме?

    0xD34F
    @0xD34F Куратор тега Vue.js
    Соответствующую настройку просили добавить, но безрезультатно. Так что придётся закостылить.

    Добавляем ссылку на компонент графика:

    <apexchart
      ref="chart"
      ...

    После монтирования скрываем лишнее:

    mounted() {
      this.$nextTick(() => {
        this.$refs.chart.hideSeries('здесь имя набора данных, который не хотите показывать');
      });
    },
    Ответ написан
    3 комментария
  • Как получить разделитель даты?

    0xD34F
    @0xD34F Куратор тега JavaScript
    Разделитель - первый символ, не являющийся цифрой. Так что

    const delimiter = str.match(/\D/)[0];
    
    // или
    
    const delimiter = str[str.search(/\D/)];
    
    // или
    
    const [ delimiter ] = str.replace(/^\d+/, '');
    
    // или
    
    const delimiter = Array.prototype.find.call(str, n => Number.isNaN(+n));
    
    // или
    
    const delimiter = [...str].filter(n => !'0123456789'.includes(n)).shift();
    Ответ написан
    Комментировать
  • Как добавить класс всем блокам, которые выводятся после 3го блока?

    0xD34F
    @0xD34F Куратор тега JavaScript
    Где элементы находятся, какой класс надо добавить и начиная с какого по счёту элемента:

    const parent = document.querySelector('.container');
    const className = 'green';
    const startFrom = 4;

    Добавляем:

    parent
      .querySelectorAll(`:scope > :nth-child(n + ${startFrom + 1})`)
      .forEach(n => n.classList.add(className));
    
    // или
    
    for (const n of Array.prototype.slice.call(parent.children, startFrom)) {
      n.classList.add(className);
    }
    
    // или
    
    for (let el = parent.children[startFrom]; el; el = el.nextElementSibling) {
      el.classList.add(className);
    }
    
    // или, также удаляем класс (если вдруг есть) у тех, кому он не должен быть добавлен
    
    for (let i = 0; i < parent.children.length; i++) {
      parent.children[i].classList.toggle(className, i >= startFrom);
    }
    Ответ написан
    1 комментарий
  • Как превратить строку в список из чисел по 2 знака и более?

    0xD34F
    @0xD34F
    chunk_size = 3
    arr = [ int(data[i:i + chunk_size]) for i in range(0, len(data), chunk_size) ]
    Ответ написан
    Комментировать
  • Как сгенерировать массив только из уникальных чисел определенной длины?

    0xD34F
    @0xD34F Куратор тега JavaScript
    Какие есть способы создания массива:

    • Создавать случайные числа, пока не наберётся сколько надо.
    • Создать массив, состоящий из всех чисел интервала, выдернуть из него сколько надо случайных.
    • Создать массив, состоящий из всех чисел интервала, перемешать его, взять кусок нужного размера.

    Что делать при попытке создать массив с длиной больше указанного интервала:

    • Кидать ошибку.
    • Создавать массив с длиной меньше указанной.

    Вот как-то так:

    function createRandomArr(size, min, max) {
      if (size > (max -= ~-min)) {
        throw 'невозможно создать массив указанного размера';
      }
    
      const values = new Set;
      for (; values.size < size; values.add(min + Math.random() * max | 0)) ;
      return [...values];
    }

    или

    function createRandomArr(size, min, max) {
      const len = max - min + 1;
      const arr = [...Array(len).keys()];
    
      return Array.from(
        { length: Math.min(size, len) },
        () => min + arr.splice(Math.random() * arr.length | 0, 1)[0]
      );
    }

    или

    function createRandomArr(size, min, max) {
      const arr = Array.from(
        { length: max - min + 1 },
        (_, i) => i + min
      );
    
      for (let i = arr.length; --i > 0;) {
        const j = Math.floor(Math.random() * (i + 1));
        [ arr[j], arr[i] ] = [ arr[i], arr[j] ];
      }
    
      return arr.slice(-size);
    }
    Ответ написан
    Комментировать
  • Почему не работает рекурсия?

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

    Components can recursively invoke themselves in their own template. However, they can only do so with the name option
    Ответ написан
  • Как можно сократить запись создания одинаковых элементов?

    0xD34F
    @0xD34F Куратор тега JavaScript
    Значения собрать в массив: const values = [ id, sum, system, date ];.

    Дальше есть варианты:

    payment.innerHTML = values.map(n => `<td>${n}</td>`).join('');
    
    // или
    
    values.forEach(n => payment.insertCell().textContent = n);
    
    // или
    
    payment.append(...values.map(n => {
      const td = document.createElement('td');
      td.innerText = n;
      return td;
    }));

    Или, то же самое, но с массивом ключей вместо значений:

    - function createPayment({id, sum, system, date}) {
    + function createPayment(data) {

    - const values = [ id, sum, system, date ];
    + const keys = [ 'id', 'sum', 'system', 'date' ];

    - values.forEach(n => payment.insertCell().textContent = n);
    + keys.forEach(n => payment.insertCell().textContent = data[n]);
    Ответ написан
    Комментировать
  • Если практически не знаю JS и TypeScript к изучению Angular бессмысленно приступать?

    0xD34F
    @0xD34F
    Почему же? Смысл есть - так вы станете говнокодером.

    Пытаться осваивать фреймворк без знания языка всё равно что получать высшее образование не имея среднего - на блестящие результаты можете не рассчитывать.

    UPD. Вынесено из комментариев:

    мне ж понятно будет

    Не будет. Начните с изучения языка.
    Ответ написан
    1 комментарий
  • Как рекурсивно обойти древовидный объект?

    0xD34F
    @0xD34F Куратор тега JavaScript
    const getKeys = obj =>
      obj instanceof Object
        ? Object.entries(obj).flatMap(n => [ n[0], ...getKeys(n[1]) ])
        : [];
    
    const keys = getKeys(obj);

    или

    function* getKeys(obj) {
      if (Object(obj) === obj) {
        for (const k in obj) if (obj.hasOwnProperty(k)) {
          yield k;
          yield* getKeys(obj[k]);
        }
      }
    }
    
    const keys = [...getKeys(obj)];
    Ответ написан
    Комментировать
  • Как оставить в объекте три самых больших числа?

    0xD34F
    @0xD34F Куратор тега JavaScript
    Сколько свойств должно быть в объекте: const propsCount = 3;.

    Собираем новый объект:

    const newObj = Object.fromEntries(Object
      .entries(obj)
      .sort((a, b) => a[1] - b[1])
      .slice(-propsCount)
    );

    Удаляем свойства существующего:

    Object
      .entries(obj)
      .sort((a, b) => b[1] - a[1])
      .slice(propsCount)
      .forEach(n => delete obj[n[0]]);
    Ответ написан
    3 комментария
  • Vue.js данные не успевают подгрузиться?

    0xD34F
    @0xD34F Куратор тега Vue.js
    Установите наблюдение за свойством, которое должно содержать данные, в обработчике проверяйте, что пришедшее значение корректно, если да - выполняйте код, который сейчас у вас в mounted (конечно, уже без setTimeout'а):

    watch: {
      данные: {
        immediate: true,
        handler(value) {
          if (value какой нужен) {
            делаете чего там вам надо
          }
        },
      },
    },

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

    computed: {
      данные() {
        return [ this.данные1, this.данные2, /* ... */ ];
      },
    },
    watch: {
      данные: {
        immediate: true,
        handler(value) {
          if (value.every(n => n какой нужен)) {
            делаете чего там вам надо
          }
        },
      },
    },
    Ответ написан
    Комментировать
  • Как добавить в таблицу дополнительный столбец, если данные приходят как объект?

    0xD34F
    @0xD34F Куратор тега React
    смотрел документацию к компоненту, но...

    плохо смотрели
    Ответ написан
    Комментировать