• Как заставить работать пагинацию?

    0xD34F
    @0xD34F Куратор тега Vue.js
    Пусть в сторе кроме собственно массива данных также хранятся текущая страница и общее количество страниц; действие fetchCharacters - пусть загружает не дефолтную первую страницу, а какую будет указано:

    state: {
      characters: [],
      page: 0,
      pages: 0,
    },
    mutations: {
      setCharacters: (state, { characters, pages, page }) =>
        Object.assign(state, { characters, pages, page }),
    },
    actions: {
      async fetchCharacters({ commit }, page = 1) {
        try {
          const { data: { info, results } } = await axios.get(`${BASE_URL}?page=${page}`);
          commit('setCharacters', {
            page,
            pages: info.pages,
            characters: results,
          });
        } catch (e) {
          console.error(e);
        }
      },
    },

    В компоненте, где используется пагинация, делаем вычисляемое свойство, которое будет отвечать за текущую страницу - геттер достаёт значение из стора, сеттер вызывает действие fetchCharacters:

    computed: {
      currentPage: {
        get() {
          return this.$store.state.page;
        },
        set(page) {
          this.$store.dispatch('fetchCharacters', page);
        },
      },
    },

    Привязываем это вычисляемое свойство к экземпляру компонента пагинации:

    <el-pagination
      v-model:current-page="currentPage"
      :page-count="$store.state.pages"
      layout="prev, pager, next"
      background
    />

    https://jsfiddle.net/qbjc9onm/
    Ответ написан
    Комментировать
  • Как сделать несколько условий в if и чтобы они все выполнялись?

    @kttotto
    пофиг на чем писать
    Кажется все забыли, что есть два варианта для "И", так же как и для "ИЛИ".
    Первый вариант "&" : будет проверена и левая, и правая части, не зависимо от того, что вернет левая.
    Второй вариант "&&" : правая часть будет проверена только в том случае, если левая вернет true.

    Поэтому в Вашем варианте, если Вы хотите, чтобы проверка в любом случае выполнилась и слева, и справа, то
    if(function1 & function2){
         // если обе возвращают true что то делаем. 
    }
    Ответ написан
    4 комментария
  • В чем отличие navigateTo() от router.push()?

    SeaInside
    @SeaInside
    15 лет пилю все эти штуки
    Сомневаетесь - смотрите исходники.

    Вкратце - это обёртка над router.push/replace(), изначально созданная исключительно в качестве сахара (да, чтобы не писать useRouter()), потом её научили выполнять редирект на стороне сервера, а потом научили справляться с внешними урлами.

    все используют router.push

    Это появилось только в Nuxt 3, который всё ещё не то чтобы production-ready, поэтому не успело примелькаться.

    Всегда используйте navigateTo. :)
    Ответ написан
    1 комментарий
  • Почему nuxt.js не находит картинку по одному и тому же пути?

    @inFernal123 Автор вопроса
    Понятия не имею почему nuxt ставит неверный путь. Но решил проблему, перенеся папку img из assets в папку static и изменил путь к изображению на "img/recipes_lvl1.png"
    Ответ написан
    Комментировать
  • Как написать интерфейс для массива с объектами?

    @pekc83
    Чем строже типы в тайпскрипте, тем меньше проблем у вас возникнет в рантайме.
    interface Package {
      id: number;
      activated: boolean;
      name: string;
    }
    
    interface ActivatedPackage extends Package {
      activated: true;
    }
    
    interface OptionalProps {
      foo: string;
      bar: number
    }
    
    const activatedPackages: Array<ActivatedPackage & Partial<OptionalProps>> = [ ... ];
    Ответ написан
    Комментировать
  • Node js: Error: Can't set headers after they are sent что произошло?

    maxfarseer
    @maxfarseer
    https://maxpfrontend.ru, обучаю реакту и компании
    Ошибка говорит о том, что у вас express пытается ответить с заголовком (в стиле "Статус 200" - все ок).
    Проблема в том, что у вас уже был ответ, и еще раз ответить он не может. Дословно: не могу установить заголовки, после того, как они отправлены.

    Решение, всегда использовать ключевое слово return, когда вы "отвечаете". В вашем примере это либо res.json, либо next. Суть в этом.
    Пример из api:
    d4b2dd2981684414a39e31573f403b77.jpg
    Если убрать return, то в случае ошибки, мы попадем в if (err) ..., ответим как ошибка(400), и не выйдем из роутинг функции, пойдем ниже и ответим как успешно(200) - и бам-с, получим ошибку - не могу установить заголовки...
    Ответ написан
    2 комментария
  • Задать класс body при активной переменной во vue?

    0xD34F
    @0xD34F Куратор тега Vue.js
    watch: {
      переменная: {
        immediate: true,
        handler(val) {
          document.body.classList.toggle('класс', val);
        },
      },
    },
    Ответ написан
    Комментировать
  • Что эффективней, чтение из файла или массив?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Вопрос не глупый а вполне себе хороший.

    Его плавное развитие приводит к концепции баз данных. Самое главное что можно сказать тезисно это
    1) Пока памяти хватает (массив) - используй смело память
    2) Диск - больше и дешевле памяти
    3) С памятью работать легко. С диском - очень неудобно и надо обрабатывать IOExceptions почти всегда.
    Диски внезапно полны сюрпризов. Могут быть сетевыми дисками.
    4) Разные диски имеют скорость на порядки разную.
    5) Диски ведут себя очень плохо на random access. От этого даже метрика IOPS появилась.
    Ее очень любят обсуждать админы баз данных.
    6) Существуют структуры данных которые спецом создавались только для дисков (B+Tree)
    7) Диск - переживает выключение питания.
    8) Самые разумные решения - сочетают в себе и диск и память в тех частях кода где это нужно.
    9) Есть интерфейсы программирования которые виртуализирут диск как память. Этим пользуется
    SQLite например.
    10) Диск может достигать очень высокой последовательной скорости чтения или записи в файл
    при условии отсутствия конкурирующих записей в данный момент. Этим пользуются в БД
    для журналирования событий.

    В принципе если современный программист просто будет использовать только оперативную память
    то никто ему не сможет ударить по рукам или подойти с какой-то метрикой и чего-то там измерив
    сказать что он неправ. Тут уж только падения по OOM и потери информации и performance issues
    могут быть каким-то значимым аргументом.
    Ответ написан
    3 комментария
  • Mac OS X El Capitan: suggestd кушает проц?

    alexxxst
    @alexxxst Автор вопроса
    В общем, опять же, если кому интересно, то это новый функционал сбора контактов отовсюду. Периодически ищет в почте адреса и предлагает их как новые контакты. Можно отключить эти предложения в программе "Контакты" в настройках. В моём случае было ОЧЕНЬ МНОГО писем, поэтому тормозило. Пришлось разобраться старые архивы и навести порядок :)
    Ответ написан
    Комментировать
  • Смена активного класса при клике с помощью vue.js?

    0xD34F
    @0xD34F Куратор тега Vue.js
    Сложить пары "текст кнопки / имя класса" в объекты, объекты в массив, массив сделать свойством компонента:

    data: () => ({
      items: [
        { buttonText: '+', className: 'container' },
        { buttonText: '-', className: 'container-fluid' },
      ],
      ...
    }),

    На основе этого массива создавать кнопки:

    <button
      v-for="n in items"
      v-text="n.buttonText"
      :class="{ active : active === n.className }"
      @click="active = n.className"
    ></button>

    Похоже на то, к чему вы стремились?
    Ответ написан
    1 комментарий
  • Git: объясните «на пальцах» разницу между rebase и cherry-pick?

    @Nkly777
    git chery-pick - ты забираешь комиты из одной ветки в другую, это бывает полезно когда изменения сделаные другим разработчиком в его ветке, прямо сейчас нужны тебе в твоей ветке, и что бы не писать этот код заново, ты забираешь его комит себе в ветку

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

    git merge - обычно используется когда у вас 2 и более master ветки (к примеру master и prototype) в этих ветках очень много комитов (и rebase здесь не подходит) и обчно через пару недель, maintainer репозитория наработки из prototype ветки "сливает" в master ветку по средствам этого самого git merge

    P.S. Что бы легче предствить разницу между git merge и git rebase. Представь что merge как собачка на молнии у одежды - "сшивает" комиты по дате их создания.
    В то время как git rebase как пожарная лестница - при применении твои коммиты крепится на конец родительской ветки

    git merge используйте для мержа фич и фиксов в master ветку (как и делает это Github)
    а git rebase используется для своей ветку в которой вы работаете над фичей что бы забрать последние изменения с master ветку (для этого есть очень удобная команда `git pull --rebase origin master`, аналог 3х команд (`git checkout master; git pull origin master; git checkout mybrach; git rebase master`)
    Ответ написан
    2 комментария
  • Git: объясните «на пальцах» разницу между rebase и cherry-pick?

    Все красиво объяснил Nkly777, только в блоке PS merge с rebase перепутаны.
    Добавлю картинок.

    git rebase devel - собачка на молнии - "сшивает" коммиты по дате их создания
    (ветка devel "растворяется" в основной ветке)
    518b8dbce1cd4f96b30de9782ae38fcd.png
    git merge devel - пожарная лестница, все коммиты ветки devel крепятся в конец, образуется пересечение
    (devel остается отдельной веткой, к которой можно вернуться)
    1ba8186d879d46ff85ea7c1e192328e2.png
    git chery-pick idea - забрать коммиты из ветки idea
    2717e3091f644ef2954aa2de4514f446.png
    Ответ написан
    2 комментария
  • Vue Router как передать переменную?

    ar6uz
    @ar6uz Автор вопроса
    Фронтент разработчик в компании Profsoft
    и так, как это сделать:
    1. надо прописать в роуте разрешение на передачу props (props: true):
    {
          path: '/history/:id',
          component: HistoryId,
          name: 'historyId',
          props: true
        }

    2. в route-link прописать, какие парметры хотите передать (params: {}):
    <router-link
                                   tag="a"
                                   class="button"
                                   :to="{name: 'historyId', params: {id: historyItem.id, date: historyItem.date}}"
                           >

    3/ Принять эти данные в компоненте:
    <script>
        export default {
            props: ['date'],
    Ответ написан
    Комментировать
  • Как удалить элемент массива не зная его индекс?

    MrDecoy
    @MrDecoy
    Верставший фронтендер
    Если я всё верно понял, то:
    remove() {
      this.arr = this.arr.filter( button => button !== this.active)
    }


    а ещё круглые скобки тут вам не нужны у remove(). То есть просто remove
    <button @click="remove()">Remove active button</button>
    Ответ написан
    1 комментарий
  • Как вытянуть 10 объектов из API?

    yarkov
    @yarkov Куратор тега JavaScript
    Помог ответ? Отметь решением.
    Комментировать
  • Как удалить приложение из Launchpad Mac OS X?

    meeshanya
    @meeshanya
    кодокот
    1 перетянуть ярлык в док
    2 вызвать меню ярлыка в доке и выбрать "показать в finder"
    3 из открывшегося окна перетянуть в корзину
    4 удалить ярлык из дока
    Ответ написан
    4 комментария
  • Сервер Express в nuxt, как настроить?

    FinGanapre
    @FinGanapre
    Если вопроса не появилось, возможно вы не выбрали SSR при генерации приложения (mode: 'universal' в nuxt.config.js должно быть)

    Примерно так должны выглядеть файлы. В app.js работаем как с обычным express далее, только запуск сервера у нас в index.js, так что в app.js его запускать не нужно, просто экспортируем и импортируем в index.js в котором и запускаем (тут уже всё сделано, просто объяснил)

    Структура:
    server/index.js
    server/app.js

    index.js

    const consola = require('consola')
    const { Nuxt, Builder } = require('nuxt')
    const app = require('./app')
    
    // Import and Set Nuxt.js options
    const config = require('../nuxt.config.js')
    config.dev = process.env.NODE_ENV !== 'production'
    
    async function start () {
      // Init Nuxt.js
      const nuxt = new Nuxt(config)
    
      const { host, port } = nuxt.options.server
    
      await nuxt.ready()
      // Build only in dev mode
      if (config.dev) {
        const builder = new Builder(nuxt)
        await builder.build()
      }
    
      // Give nuxt middleware to express
      app.use(nuxt.render)
    
      // Listen the server
      app.listen(port, host, () => {
    		consola.ready({
    			message: `Server listening on http://${host}:${port}`,
    			badge: true
    		})
    	})
    }
    start()


    app.js

    const express = require('express')
    const app = express()
    
    module.exports = app



    Новый способ:
    nuxt.config.js

    serverMiddleware: {
        '/api': '~/api'
      },



    api/index.js

    const express = require('express')
    
    // Create express instance
    const app = express()
    
    app.get('/', (req, res) => res.status(200).json([{name: "Robert"}, {name: "John"}]))
    
    // Export express app
    module.exports = app
    
    // Start standalone server if directly running
    if (require.main === module) {
      const port = process.env.PORT || 3001
      app.listen(port, () => {
        console.log(`API server listening on port ${port}`)
      })
    }



    pages/index.vue

    <template lang="pug">
      div
        p(v-for="user in users") {{ user.name }}
    </template>
    <script>
    export default {
      async asyncData({ $axios }) {
        const users = await $axios.$get('/api/')
    
        return {
          users,
        }
      },
    }
    </script>

    Ответ написан
    7 комментариев