Уроки по программированию

Как использовать Nuxt.js + Vuex + localStorage ?

Самым легким способом для тестирования будет установить с нуля Nuxt.js с отмеченными галочками Vuex и Axios.

После установки создайте файл с любым названием и разрешением js в директории store. В моем случае файл называется newspaper.js

export const state = () => ({
  posts: {}
})

export const mutations = {
  updatePosts (state, posts) {
    state.posts = posts
  }
}

export const actions = {
  async fetchPosts ({ commit }) {
    // Пытаемся получить посты с LocalStorage
    let posts = JSON.parse(localStorage.getItem('posts'))

    // Если посты получены
    if (posts) {
      // Обновляем переменную posts в store для тех кто не видит, где функция updatePosts она выше
      commit('updatePosts', posts)
      // В else попадаем только в первый раз
    } else {
      // Url API для примера был взят API WordPress демо шаблона Newspaper
      let apiUrl = 'https://demo.tagdiv.com/newspaper_pro/wp-json/wp/v2/posts/'

      // Axios
      await this.$axios.get(apiUrl).then(response => {
        // Формируем структуру постов
        let posts = response.data.map(post => ({
          id: post.id,
          title: post.title.rendered,
          excerpt: post.excerpt.rendered
        }))

        // заносим посты в localStorage
        localStorage.setItem('posts', JSON.stringify(posts))

        // Обновляем переменную posts в store для тех кто не видит, где функция updatePosts она выше
        commit('updatePosts', posts)
      })
    }
  }
}

export const getters = {
  // Этой функцией будем дергать наши посты в компонентах
  getPosts (state) {
    return state.posts
  }
}

2020-11-25_11-40-24

Создайте тестовую страницу test.vue в директории pages и добавьте следующий код:

<template>
  <div>
    <!--  Получаем посты используя getter getPosts  -->
    <div class="post" v-for="post in getPosts" :key="post.id">
      <h2 v-html="post.title"></h2>
      <div v-html="post.excerpt"></div>
    </div>
  </div>
</template>

<script>
// Получаем функции getters и actions с созданного модуля newspaper
import { mapGetters, mapActions } from 'vuex'

export default {
  name: 'test',
  // Запускаем API в модуле newspaper
  methods: {
    ...mapActions('newspaper', [
      'fetchPosts'
    ])
  },
  async mounted () {
    this.fetchPosts()
  },
  // Запускаем getter getPosts в модуле newspaper
  computed: {
    ...mapGetters('newspaper', [
      'getPosts'
    ])
  }
}
</script>

<style scoped>
h2 {
  font-size: 26px;
  margin-bottom: 10px;
}

.post {
  margin-bottom: 20px;
  border: 1px solid #ddd;
  padding: 20px;
}
</style>

2020-11-25_12-03-37

Пересобираем проект командой

yarn dev

Заходим по адресу

http://localhost:3000/test

Комментарии к статье

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *