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

    IgorPI
    @IgorPI
    css important
    Ответ написан
    Комментировать
  • Как сделать ширину v-select равной ширине контента во vuetify?

    IgorPI
    @IgorPI
    Как мне нужно изменить код, чтобы v-select занимал не всю ширину контейнера, в котором он находиться, а столько, сколько ему необходимо для отображения своих чисел и чтобы он был выровнен по правому краю.


    Да там же в примерах есть как это делается
    Ответ написан
    Комментировать
  • Как полностью обнулять хранилище при логауте?

    IgorPI
    @IgorPI
    Хранилище vuex не имеет ни какого отношения к localStorage.
    Как коллеги озвучили выше, обновите страницу.

    В некоторых случаях люди ищут способ как сохранить эти самые данные,
    у вас прямо пропорциональная проблема ))
    Ответ написан
    Комментировать
  • Nuxt.js - Как перенаправить с localhost на домен сайта?

    IgorPI
    @IgorPI
    Как минимум выкинуть Apache.

    Использовать Nginx в режиме прокси.

    Пример базовой конфигурации nginx
    server {
        listen      			<ip>:<port>;
        server_name 			<ваш домен>;
    
        location / {
    	proxy_pass  		http://127.0.0.1:3000;	
    	#proxy_read_timeout	2s
            proxy_set_header	Host $host;
            proxy_set_header	X-Real-IP $remote_addr;
            proxy_set_header	X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header	X-Forwarded-Host $server_name;
        }
    }
    Ответ написан
    Комментировать
  • Где хранить access token для API?

    IgorPI
    @IgorPI
    localStorage
    Cookie
    Ответ написан
    Комментировать
  • Адаптивный список в несколько столбцов?

    IgorPI
    @IgorPI Автор вопроса
    Решение!

    // Загрузка городов
          let cities_items = await getCities({
            country_id: 3159,
            offset: 0,
            count: 50
          });
    
          // Загрузка регионов
          let regions_items = await getRegions({
            country_id: 3159
          });
    
          const max_cols = 4
    
          let regions = []
          let regions_size = Math.ceil(regions_items.length / max_cols); //размер подмассива
          for (let i = 0; i < Math.ceil(regions_items.length / regions_size); i++) {
            regions[i] = regions_items.slice((i * regions_size), (i * regions_size) + regions_size);
          }
    
          let cities = []
          let cities_size = Math.ceil(cities_items.length / max_cols); //размер подмассива
          for (let i = 0; i < Math.ceil(cities_items.length / cities_size); i++) {
            cities[i] = cities_items.slice((i * cities_size), (i * cities_size) + cities_size);
          }


    <v-row>
          <v-col md="12" cols="12">
            <v-card class="pb-5">
              <v-card-title>Популярные города</v-card-title>
              <v-card-text>
                <v-row>
                  <v-col
                    md="3"
                    sm="6"
                    cols="12"
                    v-for="(cities_item, cities_index) in cities"
                    :key="cities_index"
                    class="pa-0 text-left"
                  >
                    <ul>
                      <li v-for="(item, index) in cities_item">{{ item.name }}</li>
                    </ul>
                  </v-col>
    
                </v-row>
              </v-card-text>
            </v-card>
          </v-col>
    
          <v-col md="12" cols="12">
            <v-card class="pb-5">
              <v-card-title>Регионы России</v-card-title>
              <v-card-text>
                <v-row>
                  <v-col
                    md="3"
                    sm="6"
                    cols="12"
                    v-for="(regions_item, region_index) in regions"
                    :key="region_index"
                    class="pa-0 text-left"
                  >
                    <ul>
                      <li v-for="(item, index) in regions_item">{{ item.name }}</li>
                    </ul>
                  </v-col>
                </v-row>
              </v-card-text>
            </v-card>
          </v-col>
        </v-row>


    image
    Ответ написан
    Комментировать
  • Vue auth, что делать с валидным токеном пришедшим с сервера?

    IgorPI
    @IgorPI
    Сохраните токен в cookie
    Или в localstorage.
    Только нужно сделать так, что бы этот самый токен не имел силы, выступая от другого браузера.
    Ответ написан
  • Как правильно построить архитектуру приложения Vue?

    IgorPI
    @IgorPI
    Всё гораздо проще.
    Использовать vue как клиент
    И мыслить так как это клиентское приложение.
    Хоть оно и имеет свой собственный аля клиент-сервер и может работать без back-end.
    На этом можно с vue покончить.

    Далее в игру вступает back end

    Вот и делайте архитектуру там.
    Продукты, корзины, заказы, хранение данных, удаление, разделение ролей и так далее.

    Отдавайте vue json

    А vue это всего лишь 1 единица клиента.
    1 единица приложения, которая оторвется от сервера и будет работать в браузере не используя свой сервер.

    PS, vue из коробки не настроен ssr.
    А вообще можно использовать nuxt
    Теже яйца только с боку.
    Только там уже настроен ssr.
    Ответ написан
    Комментировать
  • Как определить, был ли товар помещён в корзину?

    IgorPI
    @IgorPI
    <template>
      <b-row>
        <b-col sm="6" lg="4" xl="3" v-for="product in products" :key="product.id">
          <div class="image" v-lazy:background-image="product.image">
            Видно если нажали "Купить".
          </div>
          <div class="d-flex justify-content-between">
            <div>
              <p class="mb-0">{{product.name}}</p>
              <p class="mb-0">{{product.price}} грн.</p>
            </div>
            <b-button class="align-self-center" variant="outline-dark" @click="buyProduct(product)">Купить</b-button>
          </div>
        </b-col>
      </b-row>
    </template>
    
    <script lang="javascript">
      import { BRow, BCol, BButton } from 'bootstrap-vue'
      import { mapState, mapActions } from 'vuex'
    
      export default {
        components: {
          BRow,
          BCol,
          BButton
        },
        computed: mapState({
          products: state => state.product.all
        }),
        methods: {
          buyProduct(product){
            console.log(product)
          }
        }
      }
    </script>


    По поводу кнопки можно так
    <b-button class="align-self-center" variant="outline-dark" @click.once="buyProduct(product.id)">Купить</b-button>
    Ответ написан
    Комментировать
  • Как подключить Vue в пакете Laravel?

    IgorPI
    @IgorPI
    Vue самостоятельное приложение!
    Он может работать отдельно на любом сервере в любой стране мира!
    Нет ни какой связи между Vue и Laravel кроме как API по протоколу http

    Располагайте Vue где вам удобно можете вообще в корневой папке root.
    Для удобства может сделать так
    5d6bfa43cd486731611606.png
    Но так уже делаю я.
    Выберите любой другой способ.
    Ответ написан
  • Импорт и последующий вызов анонимной функции?

    IgorPI
    @IgorPI Автор вопроса
    Решение!

    Выполняю динамический импорт анонимных функций из @/middleware/
    middleware.forEach(async (e, i, a) => {
        import(`@/middleware/${e}.js`)
            .then((obj) => {
              obj.default(context)
            })
      })
    Ответ написан
    Комментировать
  • Ленивая загрузка в Nuxt?

    IgorPI
    @IgorPI Автор вопроса
    Внимание!

    Правильное решение!

    import Vue from 'vue'
    import Router from 'vue-router'
    import paths from './routes/paths'
    
    Vue.use(Router)
    
    function route (path, view, name, meta) {
      return {
        name: name || view,
        path,
        meta,
        component: () => import(`~/pages/${view}.vue`).then(m => m.default || m) // здесь гребаный компонент
      }
    }
    
    export function createRouter() {
      return new Router({
        mode: 'history',
        routes: paths.map(path => route(path.path, path.view, path.name, path.meta)).concat([{ path: "*", redirect: "/" }])
      })
    }
    Ответ написан
    Комментировать
  • Nginx не стартует с конфигурацией для Nuxt?

    IgorPI
    @IgorPI Автор вопроса
    Коллеги, нашёл логи

    2019/08/04 14:01:52 [emerg] 15376#8580: could not build map_hash, you should increase map_hash_bucket_size: 32
    2019/08/04 14:05:40 [emerg] 12020#17148: could not build map_hash, you should increase map_hash_bucket_size: 32
    2019/08/04 14:06:49 [emerg] 13284#5700: could not build map_hash, you should increase map_hash_bucket_size: 32


    в конфигурации сервера, контексте http
    установил конфиг
    http {
    	map_hash_bucket_size		  128;
      ...


    Как бабушка пошептала.
    Ответ написан
    Комментировать
  • Отвратительный лог ошибок в nuxt?

    IgorPI
    @IgorPI
    Стоп, это call stack

    Этого достаточно, что бы понять, что сделал js когда, пытался выполнить код.

    Используйте дополнительные средства.
    Ответ написан
  • Как исключить дребезг живого поиска?

    IgorPI
    @IgorPI Автор вопроса
    Всем, спасибо, действительно помогло.

    Когда перестаёшь тапать, запрос отправляется.
    events()
        {
    
            let search = debounce(async ({e, value, f}) => {
                let response = await Digest.fastSearch({
                    q: value
                })
                f(response.items)
            }, 1000)
    
            this.$root.$on("on-root-main-search-change", async ({e, value, f}) => {
                search({e, value, f})
            })
        }
    Ответ написан
    Комментировать
  • Правильно ли при изменении запрашивать ВСЕ данные заново?

    IgorPI
    @IgorPI
    Предположим, что комментариев очень много.
    Из экономической точки зрения лучше загрузить отдельный комментарий.
    Другое дело, что это в степени усложняет задачу, кто бы что не говорил, если сравнивать с обычной перезагрузкой.

    Экономические составляющие:
    1. Объем передаваемой информации по сети.
    2. Базе данных легче вернуть 1 запись по ключу. (это тоже сэкономит ресурс)
    3. На стороне клиента меньше движений.

    Скажу так, лучше если будет перезагрузка одного коммента.
    Ответ написан
    Комментировать
  • Как добавить пользовательские элементы в таблицу b-table?

    IgorPI
    @IgorPI Автор вопроса
    В общем есть такая штука:

    Называется "Custom data rendering"

    Там есть инструкция, как это делается.

    Выдержка из инструкции

    Scoped slots give you greater control over how the record data appears. If you want to add an extra field which does not exist in the records, just add it to the fields array, And then reference the field(s) in the scoped slot(s).


    Ну что-то типа вот этого

    <b-table
                            no-local-sorting hover show-empty
                            select-mode="multi"
                            selectedVariant="success"
                            :items="this.products.items"
                            :fields="this.products.fields"
                            @row-selected="rowSelected"
                            @filtered="filtered"
    
                    >
    
                        <template slot="mybutton" slot-scope="data">
                            <b-button variant="outline-primary">Edit</b-button>
                        </template>
    
                        <template slot="empty" slot-scope="scope">
                            <div class="text-center">
                                <h5>Пусто</h5>
                            </div>
                        </template>
                    </b-table>
    Ответ написан
  • Как проверять jwt в Nuxt, в режиме "spa"?

    IgorPI
    @IgorPI Автор вопроса
    Коллеги, всё разрешилось следующим образом:


    Происходит всего один раз при обновлении страницы или при первой загрузке на стороне клиента (в браузере)

    /plugins/nuxt-client-init.js
    export default (ctx) => {
    
        let auth = isAuth(Cookie.get("access_token"))
    
        if(!auth){
            ctx.redirect('/login')
        } else {
            ctx.redirect('/')
        }
    
    }


    /middleware/check-auth.js

    Происходит каждый раз при изменении роута. В режиме спа не работает на сервере ()

    export default async function ({store, req, redirect}) {
    
        if (process.browser){
    
            console.log('check auth')
            let auth = isAuth(Cookie.get("access_token"))
            if(!auth){
                redirect('/login')
            }
    
        }
    };


    Всё это вместе работает корректно.

    1. При первой загрузке или обновлении срабатывает nuxt-client-init.js
    2. При навигации работает только /middleware/check-auth.js
    Ответ написан
  • Vue callable or events?

    IgorPI
    @IgorPI Автор вопроса
    Такс, решение выступает "emit"

    в дочернем элементе

    this.$parent.$emit("on-main-menu-select-item", {item})

    В родительском
    this.$on("on-main-menu-select-item", ({item}) => {
                        console.debug(item)
                    })


    Вот такой вариант тоже рабтает
    export default {
            name: "CardRows",
            components: {Card},
            props: {
                items: [],
                OnClickItem: Function
            },
    
            methods: {
            
    
                itemClick({id, name}){
                    if (typeof this.OnClickItem === "function"){
                        this.OnClickItem({id, name})
                    }
                }
            }
        }
    Ответ написан
    Комментировать