• Можно ли задать стили при определенном условии другому элементу?

    Stalker_RED
    @Stalker_RED
    .progressbar-line[style="width: 25%;"] + .progressbar-point .progressbar-point__icon {
      outline: dashed 2px tomato;
    }
    Ответ написан
    Комментировать
  • Как обратиться к стилям определенного элемента?

    MrDecoy
    @MrDecoy Куратор тега CSS
    Верставший фронтендер
    nth-child

    .app__block:nth-child(3) {
      margin-bottom: 8px;
    }
    
    .app__block:nth-child(3) .item-hr {
      display: none
    }
    Ответ написан
    2 комментария
  • Как стилизовать список?

    sfi0zy
    @sfi0zy Куратор тега CSS
    Creative frontend developer
    нужно, чтобы строки при переносе начинались с отступом

    В свойстве list-style не нужен inside. Форматирование "с отступом" - это форматирование, которое применяется по умолчанию. Просто не меняйте то, что и так работает.
    Ответ написан
    Комментировать
  • Как правильно применять цвета для svg?

    LenovoId
    @LenovoId
    svg, css,js
    в svg не color а fill и это касается всех элементов в теле тега svg
    fill: transparent
    fill: red;
    fill: ...

    fill - это как background
    но закрашивает только нарисованную область
    stroke - это border и у него два свойства
    stroke: здесь цвет границы
    stroke-width: здесь толщина границы
    но есть и другие свойства
    Вот примерно то что я написал выше: https://codepen.io/topicstarter/pen/QWVorJp
    Ответ написан
    2 комментария
  • Как получить значение внутри функции при нажатии кнопки?

    Aetae
    @Aetae Куратор тега JavaScript
    Тлен
    Если changeTab не может примать async функцию(функцию возвращающую Promise) то никак. Ожидание действия пользователя - асинхронная операция. Тебе надо изменить логику поведения.

    Иначе: система диалогов должна быть в любом случае вынесена в отдельный компонент, а в идеале вообще во внутренние вызовы, типа:
    const result = await modal({
      title: ...,
      type: 'confirm',
      acceptText: 'Подтвердить',
      ...
    })


    Но если что-то колхозить, то условно так:
    showPopup() {
      this.isDialogShown = true;
      this.pending = new Promise((resolve) => {
        this.discardChanges = () => resolve(false);
        this.saveChanges = () => resolve(true);
      });
    },
    async changeTab() {
      ...
      return await this.pending;
    }

    Ну или прямо так:
    changeTab() {
      return new Promise((resolve) => {
        this.discardChanges = () => resolve(false);
        this.saveChanges = () => resolve(true);
      });
    }


    Но я бы так делать не стал, а таки вынес нормально всё, ибо один компонент должен выполнять ровно одну функцию и его логика не должна просачиваться в иные.
    Ответ написан
    4 комментария
  • Как сравнить значение с ключом объекта?

    Aetae
    @Aetae Куратор тега Vue.js
    Тлен
    Твой index - и есть в данном случае ключ. Т.е. проверять нужно просто index === 'dateTime'.

    Опережая возможный вопрос - если тебе нужен именно цифровой индекс, то в случае с объектом на входе он будет третьим параметром:v-for="(filter, key, index) in filters". Однако в твоём случае он не нужен, т.к. лучше привязывать key именно к ключу.

    В vue всё для людей.)
    Ответ написан
    1 комментарий
  • Почему проскролив одну страницу, перейдя на другую, она тоже проскроленна?

    @azam29
    Frontend developer (Vue, Nuxt)
    Обычно в крупных проектах где это нужно в mounted указывается ScrollTop чтобы страница прокручивалась на верх. Но так как Vue-router не перезагружает страницу а только пересобирает её, никакого скролла не происходит.
    Ответ написан
    Комментировать
  • Как изменить формат полученной даты?

    TTATPuOT
    @TTATPuOT
    https://code.patriotovsky.ru/
    Самое простое - использовать библиотеку типа Moment.js или Day.js. Они умеют работать с датами аккуратно и красиво. Если в проекте так или иначе отображаются даты, то вам эти библиотеки пригодятся.

    Для разового же использования куда проще и лучше не тянуть лишние зависимости и использовать нативный Date.

    В вашем случае строка 2023-01-09T05:39:26+04:00 легко распарситься:
    const date = new Date("2023-01-09T05:39:26+04:00")

    Далее, вы уже можете отформатировать её в нужном вам виде:
    console.log(`${d.getFullYear()}-${d.getMonth() + 1}-${d.getDate()} (${d.getHours()}:${d.getMinutes()}:${d.getSeconds()})`) //'2023-1-9 (7:39:26)'


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

    Aetae
    @Aetae Куратор тега Vue.js
    Тлен
    const options = computed(() => {
      if (props.secondType) 
        return props.secondTypeItems.map(({ id, value}) => ({
          label: value,
          value: id 
        }));
    
      if (props.thirdType) 
        return props.thirdTypeEvents.map(({ desc, name }) => ({
          label: name,
          value: desc 
        }));
    
      // ...
    
      return [];
    });


    <el-select
          v-model="modelText"
          placeholder="Выберите предмет"
          @change="changeVal"
        >
          <el-option
            v-for="{ label, value} in options"
            :key="value"
            :label="label"
            :value="value"
          >
            {{ label }}
          </el-option>
        </el-select>
    Ответ написан
    Комментировать
  • Как поменять значение при фокусе?

    0xD34F
    @0xD34F Куратор тега Vue.js
    Устанавливаете текстовому полю новое значение и отправляете ему событие input, чтобы v-model обновил данные компонента:

    methods: {
      removeLastChar({ target: t }) {
        t.value = t.value.slice(0, -1);
        t.dispatchEvent(new Event('input'));
      },
      ...
    },

    <input
      @focus="removeLastChar"
      ...
    >
    Ответ написан
    Комментировать
  • Как типизировать в ts?

    Aetae
    @Aetae Куратор тега TypeScript
    Тлен
    Вопрос конечно в духе "я его того, а он мне нихрна, чаво это он". Где конкретика блин? Что именно за ошибка? Любая ошибка TS - это "ошибка типов", он для этого и существует. Что у тебя в route?

    Но окей, предположим, что route у тебя - это текущий роут vue-рутера, тогда ошибка у тебя скорее всего выглядит как-то так:
    TS7053: Element implicitly has an 'any' type because expression of type 'RouteRecordName' can't be used to index type '{ first: string; second: string; }'.   No index signature with a parameter of type 'string' was found on type '{ first: string; second: string; }'.

    Собственно прочитав текст ошибки можно уже догадаться, в чём проблема: у (неявно выведенного за отсутствием явного объявления) типа объекта pages есть ключи типа 'first' | 'second' | ..., но нет index signature типа string, т.е. не указано, что ключом может быть любая строка, а не только конкретные'first' | 'second' | ....
    route.name же после проверки на пустоту имеет тип string | symbol. Ты не можешь у объекта с чётко ограниченным набором ключей брать значение по произвольному строковому/символьному.

    Прямое решение в лоб:
    Задать тип pages позволяющий рандомные ключи, например
    const pages: Record<PropertyKey, string> = {
      first: 'Первая',
      second: 'Вторая',
      ...
    }

    Всё сразу заработает, но это не спасёт тебя от ошибок(например опечаток).


    Не менее прямой вариант
    (но с другой стороны):
    Кастануть нужный тип руками: ... = pages[route.name as keyof typeof pages]
    Ведь мы уверены, что name в route всегда будет одним из ключей pages. Уверены же?..

    Энтерпрайз решение(ничем не лучше предыдущих, зато выглядит солидно):
    Твой файл routes.ts:
    export enum ERoutes {
      FIRST = 'first',
      SECOND = 'second'
    }
    
    const routes = [
      {
         name: ERoutes.FIRST,
         ...
      },
      {
         name: ERoutes.SECOND,
         ...
      },
      ...
    ]

    В коде:
    const pages: Record<ERoutes, string> = {
      [ERoutes.FIRST]: 'Первая',
      [ERoutes.SECOND]: 'Вторая',
      ...
    }
    
    ... = pages[route.name as ERoutes]


    Надмозговое решение("как батька"):
    Твой файл routes.ts:
    const routes = [
      {
         name: 'first',
         ...
      },
      {
         name: 'second',
         ...
      },
      ...
    ] as const satisfies ReadonlyArray<ReadonlyRouteRecordRaw>;
    
    type ReadonlyRouteRecordRaw = Omit<RouteRecordRaw, 'children'> & {
      children?: ReadonlyArray<ReadonlyRouteRecordRaw>;
    };
    
    type ExtractNames<Route> = Route extends { name: infer Name } ? Name : never;
    type FlattenChildren<Route> = Route extends { children: ReadonlyArray<infer Children> }
      ? FlattenChildren<Children> | Route
      : Route;
    
    // с помощью магии ts вытаскиваем в тип RouteNames все заданные у нас имена маршрутов
    export type RouteNames = ExtractNames<FlattenChildren<typeof routes[number]>>;
    
    // с помощью магии же прокидывем их прямо в декларацию vue-router
    declare module 'vue-router' {
      export interface RouteLocationNormalizedLoaded {
        name: RouteNames | null | undefined;
      }
    }

    satisfies
    satisfies - новая фича ts 4.9, в предыдущих версиях того же можно добиться сделав обёртку вида:
    const narrowRoutesTypeWrapper = <T extends ReadonlyArray<ReadonlyRouteRecordRaw>>(routes: T) => routes;
    const routes = narrowRoutesTypeWrapper([ ... ] as const);

    И твой код заработает вообще без изменений (если в pages есть все нужные ключи).)
    Однако для удобства можно написать так:
    const pages: Record<RouteNames, string> = {
      first: 'Первая',
      second: 'Вторая',
      ...
    }
    Ответ написан
    Комментировать
  • Как передать переменную при нажатии на клавишу?

    @karminski
    Senior React.JS Developer
    @keydown="(event) => handleSomething(index, event)"
    Ответ написан
    Комментировать
  • Как растянуть flex блок на всю высоту родителя?

    neuotq
    @neuotq
    Прокрастинация
    Малова-то информации. Но если some-page родитель, и в нём два элемента. То можно последнему задать свойство flex-grow:1 , таким образом, при неуказанном flex-grow у других, последний займёт всё свободное пространство.
    Ответ написан
    Комментировать
  • Как установить булево значение через computed?

    Alexandroppolus
    @Alexandroppolus
    кодир
    Комментировать
  • Как установить булево значение через computed?

    MrDecoy
    @MrDecoy
    Верставший фронтендер
    - forEach
    + some


    const isFilled = computed(() => {
      Object.entries(names.val).some(([, val]) => val.inputVal)
    })
    Ответ написан
    Комментировать
  • Как поменять значение ключа объекта объектов?

    @historydev Куратор тега JavaScript
    Редактирую файлы с непонятными расширениями
    function clear_key(obj, k) {
    	if(obj && k) {
      	Object.keys(obj).forEach(key => {
                obj[key][k] = undefined;
            });
        return;
      }
      throw 'Object and key is required';
    }


    Или коротко:
    function clear_key(obj, k) {
    	if(obj && k) return Object.keys(obj).forEach(key => obj[key][k] = undefined);
      throw 'Object and key is required';
    }
    Ответ написан
    Комментировать
  • Как поменять значение ключа объекта объектов?

    yarkov
    @yarkov Куратор тега JavaScript
    Помог ответ? Отметь решением.
    Object.keys, Object.values, Object.entries.
    Выбирайте))
    Ответ написан
    Комментировать