Задать вопрос
Ответы пользователя по тегу Vue.js
  • Как сделать так, чтобы карточка была по размеру контента, если его немного?

    victormayorov
    @victormayorov
    Frontend разработчик
    .q-card {
      display: flex;
      flex-direction: column;
    --  height: 100%;
    ++  height: fit-content;
    }
    .q-card__section {
      max-height: full;
      overflow: auto;
    --  flex-basis: 0;
    --  flex-grow: 1;
      display: flex;
      flex-direction: column;
    }
    .q-table__container {
      overflow: auto;
    --  flex-basis: 0;
    --  flex-grow: 1;
    }
    Ответ написан
  • Как сделать роутинг для модального окна в Vue.js?

    victormayorov
    @victormayorov
    Frontend разработчик
    В router/index.js
    {
        path: '/products/:id',
        name: 'ProductModal',
        component: Categories,// указываем компонент страницы с которой и осуществляется переход
     },


    Далее в Categories.vue
    <!-- тут условно какие карточки по клику открывают модальное окно -->
    <!-- @click="openProduct(product.id)" -->
    <vue-final-modal v-if="isModalOpen" @close="closeModal">...</vue-final-modal>

    import { ref, watch } from 'vue';
        import { useRoute, useRouter } from 'vue-router';
    
        const isModalOpen = ref(false);
        const currentProductId = ref(null);
    
        const openProduct = (id) => {
          currentProductId.value = id;
          isModalOpen.value = true;
          router.push(`/products/${id}`);
        };
    
        const closeModal = () => {
          isModalOpen.value = false;
          currentProductId.value = null;
          router.push('/products'); // Возвращаемся к списку
        };
    
        // Отслеживание изменения маршрута
        watch(
          () => route.params.id,
          (id) => {
            if (id) {
              currentProductId.value = id;
              isModalOpen.value = true;
            } else {
              isModalOpen.value = false;
            }
          },
          { immediate: true }
        );


    не проверял, но если нужно примерно решение из того, что вы написали в комментарии к этому ответу, то как-то так.
    если в двух словах, то при клике мы перенаправляем юзера на туже самую страницу, но с другим адресом и т.к. указан id,в ватчере сработает проверка и откроется модальное окно.
    при клике на карточку товара откроется сразу модальное окно и при переходе на другую страницу будет открыто модальное окно(конечно, будет виден эффект этого перехода)
    можно еще попробовать через хуки роутера это провернуть, но мне кажется это уж больно все костыльно будет, я б так не делал.
    Ответ написан
    2 комментария
  • Как заменить последний next в v-stepper?

    victormayorov
    @victormayorov
    Frontend разработчик
    Смотрите документацию

    Playground Vuetify
    <template>
      <v-app>
        <v-container>
          <v-stepper v-model="step" :items="items">
            <!--...-->
            <template v-slot:item.3>
              <!-- Последний item-->
              <!--...-->
            </template>
    
            <template v-slot:next>
              <v-btn @click="nextOrSubmit" :disabled="false">
                {{ isLastItem ? 'Submit' : 'Next' }}
              </v-btn>
            </template>
          </v-stepper>
        </v-container>
      </v-app>
    </template>
    
    <script setup>
      import { ref, reactive, computed } from 'vue'
    
      const items = reactive(['Название и авторы', 'Описания', 'Изображение'])
      const step = ref(1)
    
      const isLastItem = computed(() => step.value === items.length)
    
      const nextOrSubmit = () => {
        if (isLastItem.value) {
          // submit
          alert('submit')
          return
        }
        step.value++
      }
    </script>
    Ответ написан
    Комментировать
  • Каков правильный импорт функций и объектов во vuejs для использования в шаблоне?

    victormayorov
    @victormayorov
    Frontend разработчик
    <script setup>
    import { some } from "fx.js"
    return { some }
    </script>

    или
    <script>
    import { some } from "fx.js"
    export default {
      methods: {
        some,
      }
    }
    </script>
    Ответ написан
  • Как подключить js библиотеку cdn(которой нет в npm) в проект Vue js?

    victormayorov
    @victormayorov
    Frontend разработчик
    В package.json находишь `dependencies` и указываешь следующее
    "dependencies": {
        ...
    ++  "smoothScroll": "git+https://github.com/LieutenantPeacock/SmoothScroll.git"
    }

    В компоненте
    import smoothScroll from 'smoothScroll/src/smoothscroll.js'
    Ответ написан
    Комментировать
  • Как исправить ошибку Module parse failed: Unexpected token при билде проекта?

    victormayorov
    @victormayorov
    Frontend разработчик
    Необходимо настроить сборщик для возможности подгружать css файлы через import.

    Почитать можно тут и тут
    Ответ написан
    Комментировать
  • Как поменять статус отправки во vuex через некоторое время?

    victormayorov
    @victormayorov
    Frontend разработчик
    addProductToCart(context, {
        productId,
        colorId,
        sizeId,
        amount,
      }) {
      // Тут наверное не лишним будет доп. проверку повесить, раз setTimeout используете, иначе при повторных запросах у вас могут прошлые setTimeout переводить `updateisAddLoadingEnded` в false
    ++ if (context.state.updateisAddLoadingEnded) return;
        context.commit('updateAddLoading', true);
        context.commit('updateAddLoadingFailed', false);
        context.commit('updateisAddLoadingEnded', false);
        return axios.post('url', {
          productId: productId,
          colorId: colorId,
          sizeId: sizeId,
          quantity: amount,
        }, {
          params: {
            userAccessKey: context.state.userAccessKey,
          },
        })
          .then((response) => {
            context.commit('updateProductsCartData', response.data.items);
            context.commit('syncProductsCart');
          })
          .catch(() => {
    --      context.commit('updateAddLoading', false);
            context.commit('updateAddLoadingFailed', true);
          })
          .finally(() => {
            context.commit('updateAddLoading', false);
            context.commit('updateisAddLoadingEnded', true);
    ++    setTimeout(() => context.commit('updateisAddLoadingEnded', false),  3000);
          });
      },
    Ответ написан
  • Как хранить состояние авторизованного пользователя в spa и как ее правильно обновлять?

    victormayorov
    @victormayorov
    Frontend разработчик
    Посоветовал бы сделать общий сервис с запросами, например написал бы класс с основными методами(get,post,patch,delete etc) и наследовался бы от него для отправки запросов где нужна авторизация, например получения инфы о пользователе. В родительском классе можно вытаскивать перед запросами из localstorage jwt токен и проверять его время жизни, если оно вышло, то отправляем запрос на обновление токена, обновляем токен и разрешаем запрос для получения инфы о пользователе, иначе меняешь статус isLogin: false и у тебя интерфейс автоматом перерисовывается. Как-то так, надеюсь мое краткое объяснение поможет :)
    Ответ написан
    Комментировать
  • Как пробросить класс компонента?

    victormayorov
    @victormayorov
    Frontend разработчик
    Вы не можете использовать зарезервированные имена для передачи данных в props.
    <autocomplete-input
                  :variants="cargo_codes"
                  :variantKey="'id'"
                  :label="'Код груза'"
                  :variantTitle="'code6'"
                  v-model="all_information.cargo_code"
    --              :class="{ 'error_label': this.telegram_error.cargo_code }"
    ++             :myClass="{ 'error_label': this.telegram_error.cargo_code }"
                ></autocomplete-input>


    export default {
        name: 'AutocompleteInput',
        props: {
            variants: {
                type: Array,
                required: true,
            },
            value: {
                default: ''
            },
            label: {
                type: String,
                default: '',
            },
            variantKey: {
                type: String,
                default: 'id'
            },
            variantTitle: {
                type: String,
                default: 'id'
            },
            placeholder: {
                type: String,
                default: ''
            },
            needFull: {
                type: Boolean,
                default: false
            },
    --        error_label: {
    --           type: String,
    --           default: ''
    --       }
    ++        myClass: {
    ++          type: String,
    ++         default: {},
    ++       }
        },


    <template>
        <div class="autocomplite_component">
            <div class="controller">
    
            <input type="text" class="textarea" @input="onInput" :value="value" :placeholder="placeholder">
            </div>
            <br>
    --        <label class="label" :class="error_label">{{ label }}</label>
    ++        <label class="label" :class="myClass">{{ label }}</label>
            <div class="variants" v-if="filtered && showVariants" style="max-height: 50px; overflow: auto;">
                <div v-for="v in filtered" :key="v[variantKey]" class="variant" @click="selectVariant(v)">
                  <span style="cursor: pointer;">{{ v[variantTitle] }}</span>  
                </div>
            </div>
           
        </div>
    </template>
    Ответ написан
    1 комментарий
  • Можно ли обойтись одной функций filter?

    victormayorov
    @victormayorov
    Frontend разработчик
    filteredArray() {
                return this.array
                    .filter((el) => {
                        return (!this.search.length ? true : (el?.name?.toLowerCase().includes(this.search) ||
                            el?.surname?.toLowerCase().includes(this.search))) &&
                            (this.salary === null ? true : el.salary === this.salary) &&
                            (this.quality === null ? true : el.quality === this.quality) &&
                            (this.rating === null ? true : el.rating === this.rating && el.mode !== MODES.HIGH) &&
                            (this.body === null ? true : (this.body === Bodys.CHECKED ?  el.workers.some(({ checked }, index) =>
                                  index <= el.workersIds.length - 1 ? !checked : false
                              )
                            : el.workers.every(({ checked }, index) =>
                                  index <= el.workersIds.length - 1 ? checked : true
                              )) )
                    }).sort((a, b) => {
                        if (a?.name?.toLowerCase() > b?.name?.toLowerCase()) {
                            return isDesc ? -1 : 1;
                        }
                        if (a?.name?.toLowerCase() < b?.name?.toLowerCase()) {
                            return isDesc ? 1 : -1;
                        }
                        return 0;
                    });
            },
    Ответ написан
    Комментировать