Задать вопрос
  • Какая лучшая практика для фильтрации данных по нескольким значениям?

    0xD34F
    @0xD34F Куратор тега JavaScript
    Как-то уж очень громоздко выглядит. Если я правильно понял, то то, что вам нужно, делается куда проще:

    const filterItems = () => items.filter(n => state[n.size]);
    Ответ написан
    Комментировать
  • Как добавить точки локации на карту по API Яндекс?

    0xD34F
    @0xD34F Куратор тега Яндекс.Карты
    Во-первых - у вас обработчик клика не назначается, вы выполняете find на элементе, который и пытаетесь найти.

    Во-вторых - говорите, что карта "при нажатии переезжает к локации", что-то я такого у вас тут вовсе не вижу. Нужно использовать метод setCenter.

    В-третьих - каким образом вы собираетесь показывать на карте всплывающие окна меток, если сами метки никак с картой не связаны? Откажитесь от меток, и используйте popup карты (типа так), или всё-таки добавляйте метки на карту (типа так).
    Ответ написан
    1 комментарий
  • Как подключить google map в vue проект?

    0xD34F
    @0xD34F Куратор тега Vue.js
    Правильно ли подключаю карту

    Конечно же нет - документацию вы явно не читали. Это зря. Вот вам правильно подключенная карта - сравнивайте как было, как стало, думайте, читайте документацию.
    Ответ написан
  • Как задать ширину svg при помощи переменной?

    0xD34F
    @0xD34F
    Во-первых - вы явно путаете ширину с высотой. Во-вторых - [attr.viewBox]="'0 0 100 ' + bla".
    Ответ написан
    Комментировать
  • Переключение между двумя атрибутами?

    0xD34F
    @0xD34F Куратор тега JavaScript
    this.setAttribute('aria-expanded', this.getAttribute('aria-expanded') === 'false');
    Ответ написан
  • Как добавить текст элементу в цикле?

    0xD34F
    @0xD34F Куратор тега JavaScript
    Куда и сколько:

    const id = 'out';
    const count = 10;

    Конечно, можно добавлять строки неоднократно:

    const $el = $('[id="' + id + '"]');
    for (let i = 0; i < count; i++) {
      $el.text((_, text) => text + (i ? ', ' : '') + i);
    }
    
    // или
    
    (function next(el, i) {
      if (i < count) {
        const text = (el.innerHTML && ', ') + i;
    
        el.innerText += text;
        // или
        el.insertAdjacentText('beforeend', text);
        // или
        el.append(text);
        // или
        el.insertBefore(new Text(text), null);
        // или
        el.appendChild(document.createTextNode(text));
    
        next(el, -~i);
      }
    })(document.getElementById(id), 0);

    Но лучше будет сначала собрать текст полностью, и модифицировать содержимое элемента всего один раз:

    $('#'.concat(id)).text(Array.from({ length: count }, (_, i) => i).join(', ');
    
    // или
    
    document.querySelector(`#${id}`).textContent = [...Array(count).keys()].join`, `;
    Ответ написан
    2 комментария
  • @click в блоке v-else-if во Vue js, почему выдает ошибку?

    0xD34F
    @0xD34F Куратор тега Vue.js
    <button class="btn btn-danger" @click='delete'>Удалить</button>

    Нет, delete - это ключевое слово, и его нельзя вот так просто использовать в шаблоне.

    Переименуйте метод. Или пишите @click="this.delete".
    Ответ написан
    1 комментарий
  • Как в React извлекать информацию из children?

    0xD34F
    @0xD34F Куратор тега React
    Собственно вопрос - как при фильтровании children понять, какой элемент является Column, какой GridToolbar и т.д.? Есть ли какие-либо хорошие практики для этого? Склоняюсь к тому, чтобы проверять свойство type.name, которое вроде как должно быть названием компонента, т. е. 'Column', 'GridToolbar' и т. д.

    Можно просто type, без name. Только, конечно, в этом случае сравнивать надо не со строкой, а с самим компонентом.

    Но должны ли это быть именно children?
    Есть вариант...
    ...оформить передачу каждого из элементов через отдельный prop:

    While this is less common, sometimes you might need multiple “holes” in a component. In such cases you may come up with your own convention instead of using children:

    function SplitPane(props) {
      return (
        <div className="SplitPane">
          <div className="SplitPane-left">
            {props.left}
          </div>
          <div className="SplitPane-right">
            {props.right}
          </div>
        </div>
      );
    }
    
    function App() {
      return (
        <SplitPane
          left={
            <Contacts />
          }
          right={
            <Chat />
          } />
      );
    }

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

    Мне хочется в React достичь того, что называется слотами в Web Components и Vue.js.

    Окей, сделаем компонент слота:

    function Slot({ name, content, scope, children = null }) {
      const slotContent = []
        .concat(content || [])
        .filter(n => n.props.slot === name)
        .map(n => n.type === 'template'
          ? [].concat(n.props.children).map(m => m instanceof Function ? m(scope) : m)
          : n
        );
    
      return slotContent.length
        ? slotContent
        : children;
    }

    Пример использования - компонент таблицы с возможностью кастомизации внешнего вида столбцов (как заголовков, так и ячеек с данными):

    function Table({ columns, data, children }) {
      return (
        <table>
          <thead>
            <tr>{columns.map(n => (
              <th>
                <Slot name={`header.${n.name}`} content={children} scope={n}>
                  {n.label}
                </Slot>
              </th>))}
            </tr>
          </thead>
          <tbody>{data.map((row, index) => (
            <tr>{columns.map(({ name }) => (
              <td>
                <Slot name={`cell.${name}`} content={children} scope={{ name, row, index }}>
                  {row[name]}
                </Slot>
              </td>))}
            </tr>))}
          </tbody>
        </table>
      );
    }

    const COLUMNS = [
      { name:  'num', label:  'number' },
      { name:  'str', label:  'string' },
      { name: 'bool', label: 'boolean' },
    ];
    
    const DATA = [
      { num:  69, str:  'hello, world!!', bool: false },
      { num: 187, str:  'fuck the world', bool:  true },
      { num: 666, str: 'fuck everything', bool:  true },
    ];

    <Table columns={COLUMNS} data={DATA}>
    
      {/* в один слот можно передавать контент несколько раз */}
      <u slot="header.num" style={{ color:   'red' }}>NUM</u>
      <i slot="header.num" style={{ color: 'green' }}>!!!</i>
    
      {/* или, за один раз передавать несколько элементов */}
      <template slot="header.bool">
        boolean:
        <input type="checkbox" disabled />
        or
        <input type="checkbox" disabled defaultChecked />
      </template>
    
      {/* контент слота можно определять динамически */}
      <template slot="cell.bool">
        {({ row }) => <input type="checkbox" disabled defaultChecked={row.bool} />}
      </template>
    
    </Table>

    Можно даже сделать, чтобы было похоже на то, что вы показывали в тексте вопроса - добавляем компонент строки таблицы, экземпляры которого будут получать описания столбцов и контент слотов, вот как-то так:

    function TableColumn() {
      // да, всё правильно - тут пусто, этот компонент нужен только как место, где будет
      // собрано всё, что относится к столбцу, сам он ничего делать не должен
      return null;
    }
    
    function Table({ data, children }) {
      const columns = []
        .concat(children || [])
        .reduce((acc, n) => (
          (n.type === TableColumn) && acc.push(n.props),
          acc
        ), []);
    
      return (
        <table>
          <thead>
            <tr>{columns.map(({ children, ...n }) => (
              <th>
                <Slot name="header" content={children} scope={n}>
                  {n.label}
                </Slot>
              </th>))}
            </tr>
          </thead>
          <tbody>{data.map((row, index) => (
            <tr>{columns.map(({ name, children }) => (
              <td>
                <Slot name="cell" content={children} scope={{ name, row, index }}>
                  {row[name]}
                </Slot>
              </td>))}
            </tr>))}
          </tbody>
        </table>
      );
    }

    <Table data={DATA}>
    
      <TableColumn name="row-index" label="#">
        <template slot="cell">
          {({ index }) => -~index}
        </template>
      </TableColumn>
    
      <TableColumn name="num" label="number" />
    
      <TableColumn name="str" label="string" />
    
      <TableColumn name="bool">
        <span slot="header" style={{ color: 'red' }}>boolean</span>
    
        <template slot="cell">
          {({ row }) => <input type="checkbox" disabled defaultChecked={row.bool} />}
        </template>
      </TableColumn>
    
    </Table>
    Ответ написан
  • Почему не отображается компонент?

    0xD34F
    @0xD34F Куратор тега Vue.js
    Я бы предположил, что компонент на самом деле отображается, а вот с данными проблема. Как вы передаёте данные в компонент? Выскажу ещё одну догадку, выглядит это у вас как-то так:

    <my-fucking-component :myData="someData">

    Ну а как подсказывает документация:

    Имена HTML-атрибутов являются регистро-независимыми, поэтому браузеры интерпретируют любые прописные символы как строчные. Это означает, что при использовании шаблонов в DOM, входные параметры в camelCase стиле должны использовать свои эквиваленты в стиле kebab-case
    Ответ написан
    9 комментариев
  • Как заменить символы в тексте, используя JS?

    0xD34F
    @0xD34F Куратор тега JavaScript
    const replaceTime = (str, newTime) => str.replace(/\d\d:\d\d(P|A)M/g, newTime);
    Ответ написан
    Комментировать
  • Как узнать самое частое значение по формуле (value*frequency)?

    0xD34F
    @0xD34F
    SELECT value, SUM(value * frequency) AS value_sum
    FROM table
    GROUP BY value
    ORDER BY value_sum DESC
    LIMIT 1
    Ответ написан
    Комментировать
  • Как увеличить число внутри строки?

    0xD34F
    @0xD34F Куратор тега JavaScript
    const ul = document.querySelector('ul');
    
    document.querySelector('a').addEventListener('click', () => {
      const id = ul.lastElementChild.id.replace(/\d+$/, m => ++m);
      ul.insertAdjacentHTML('beforeend', `<li id="${id}"></li>`);
    
      // или
    
      const li = ul.querySelector('li:last-child').cloneNode(true);
      li.id = li.id.replace(/\d/g, '').concat(-~ul.children.length);
      ul.append(li);
    
      // или
    
      const li = document.createElement('li');
      li.id = 'a' + (+ul.children[ul.children.length - 1].id.slice(1) + 1);
      ul.insertBefore(li, null);
    });
    Ответ написан
    Комментировать
  • PixyJs. Почему у объекта Graphics x и y =0?

    0xD34F
    @0xD34F Куратор тега JavaScript
    Почему? Ну, наверное, потому что это дефолтное значение. Хотите, чтобы был не 0 - вместо рисования прямоугольников чёрт знает где делайте соответствующую трансформацию, а сам прямоугольник рисуйте в (0, 0). Т.е., вместо

    rectangle.drawRect(cur_x,cur_y,seg_size,seg_size);

    будет

    rectangle.drawRect(0, 0, seg_size, seg_size);
    rectangle.setTransform(cur_x, cur_y);
    Ответ написан
    Комментировать
  • Как правильно подключить все компонетны в vue проекте?

    0xD34F
    @0xD34F Куратор тега Vue.js
    Импортируйте компоненты Home и Map (надо заметить, что имена подобраны так себе - одно слово не рекомендуется использовать; кроме того, Map уже есть) там, где используете их - в router/index.js, импортировать в App.vue не надо (как и указывать их в components). Типа так.
    Ответ написан
    2 комментария
  • Как отрендерить vue-компонент на событие?

    0xD34F
    @0xD34F Куратор тега Vue.js
    Сделайте копию project.is_enabled, работайте с ней, а по событию project-saved обновляйте оригинал.
    Ответ написан
  • Как проверить, завершилось ли действие, вызванное из другого компонента?

    0xD34F
    @0xD34F Куратор тега Vue.js
    Да не надо ничего проверять. Что у вас является следствием завершившегося действия? - наличие нужных данных. Сделайте соответствующий геттер, и повесьте на экземпляр компонента v-if с этим геттером. Пока данных нет - экземпляр компонента не будет рендериться, а значит и мутация, требующая отсутствующих данных, тоже вызвана не будет, а значит и ошибки не будет.
    Ответ написан
    Комментировать
  • Смена цвета DIV анимация?

    0xD34F
    @0xD34F Куратор тега CSS
    Ответ написан
    Комментировать
  • Как запустить функцию по клику по любой ссылке?

    0xD34F
    @0xD34F Куратор тега Vue.js
    Создавайте ссылки с помощью v-for.

    В data у вас будет массив:

    links: [
      { title: 'link #1', to: { name: 'AdmissionActList' } },
      { title: 'link #2', to: { name: 'ShiftsTask' } },
      // ну и так далее
    ],

    А в шаблоне вместо кучи элементов:

    <ul class="list-unstyled components">
      <b-nav-item
        v-for="link in links"
        :to="link.to"
        @click.prevent="sidebarCollapse"
      >{{ link.title }}</b-nav-item>
    </ul>

    Вот как-то так. А вообще - читайте документацию, это основы.
    Ответ написан
    2 комментария
  • Динамическое добавление атрибутов?

    0xD34F
    @0xD34F Куратор тега Vue.js
    в зависимости от значения переменной, нужно рендерить либо
    <div class="link">контент</div>
    либо
    <router-link to="/path" class="link">контент</router-link>

    Используйте v-if / v-else.

    Ну или сделайте computed свойство:

    <component v-bind="bullshit" class="link">контент</component>

    computed: {
      bullshit() {
        const attrs = {};
        attrs.is = this.isLink ? 'router-link' : 'div';
        if (this.isLink) {
          attrs.to = '/path';
        }
        return attrs;
      }
    }
    Ответ написан