vue全局数据管理示例详解

yizhihongxing

Vue全局数据管理示例详解

Vue是一个流行的JavaScript框架,用于构建交互式的Web应用程序。在Vue中,数据管理是非常重要的一个方面。Vue提供了不同的方式来管理各种不同类型的数据,包括本地数据、API请求和服务器数据等。

Vuex

在Vue中,我们可以使用Vuex来管理全局数据。Vuex是一个Vue.js专用的状态管理库,它提供了一种集中存储共享状态数据的方案。Vuex利用单向数据流的架构,使得我们能够追踪应用程序的状态变化和响应。

Vuex提供了五种核心部分:

  1. State(状态):存储应用程序级别的状态
  2. Getters(计算属性):派生状态数据
  3. Mutations(变更):修改状态
  4. Actions(动作):异步修改状态
  5. Modules(模块):将store分割成更小的模块

通过使用Vuex,我们可以轻松地在整个应用程序中共享状态,而不必通过 props 和事件传递数据。

示例1:数据同步

下面是一个简单的TODO应用程序。使用Vuex来管理TODO列表数据,并使用mutatations将数据更改反映到视图中。

//store.js
import Vue from 'vue'
import Vuex from 'vuex'

Vue.use(Vuex)

export const store = new Vuex.Store({
  state: {
    todos: [
      { id: 1, text: 'Learn Vue', done: true },
      { id: 2, text: 'Learn Vuex', done: false }
    ]
  },
  mutations: {
    setTodoDone (state, id) {
      const todo = state.todos.find(todo => todo.id === id)
      todo.done = true
    }
  },
  getters: {
    doneTodos: state => {
      return state.todos.filter(todo => todo.done)
    }
  }
})
<!-- App.vue -->
<template>
  <div>
    <h2>TODOs</h2>
    <ul>
      <li v-for="todo in todos" :key="todo.id">
        <input type="checkbox" @change="setTodoDone(todo.id)" :checked="todo.done">
        {{ todo.text }}
      </li>
    </ul>
    <h2>Done TODOS</h2>
    <ul>
      <li v-for="todo in doneTodos" :key="todo.id">{{ todo.text }}</li>
    </ul>
  </div>
</template>

<script>
import { mapState, mapGetters } from 'vuex'

export default {
  computed: {
    ...mapState(['todos']),
    ...mapGetters(['doneTodos'])
  },
  methods: {
    setTodoDone (id) {
      this.$store.commit('setTodoDone', id)
    }
  }
}
</script>

在上面的示例中,我们在store中定义了一个todos数组,包含了两个todo项。我们还定义了一个setter(mutations),使用ID来更新todo项的状态。我们还定义了一个getter,返回已完成的todo项数组。

在组件中,使用mapState和mapGetters来映射到store中定义的todos和doneTodos方法。我们使用通过setTodoDone方法来更新todo项的状态,使用$store.commit方法来触发更新视图。

示例2:数据异步请求

下面是一个更复杂的例子,涉及到用户注册和登录。在这个例子中,我们使用Vuex来管理用户数据和API请求。

//store.js
import Vue from 'vue'
import Vuex from 'vuex'
import axios from 'axios'

Vue.use(Vuex)

const API_ROOT = 'https://api.example.com/'

export const store = new Vuex.Store({
  state: {
    user: null
  },
  mutations: {
    setUser (state, user) {
      state.user = user
    }
  },
  actions: {
    async register ({ commit }, { email, password }) {
      const response = await axios.post(`${API_ROOT}/register`, { email, password })
      commit('setUser', response.data.user)
      return response.data.user
    },
    async login ({ commit }, { email, password }) {
      const response = await axios.post(`${API_ROOT}/login`, { email, password })
      commit('setUser', response.data.user)
      return response.data.user
    },
    async logout ({ commit }) {
      await axios.post(`${API_ROOT}/logout`)
      commit('setUser', null)
    }
  },
  getters: {
    isLoggedIn: state => !!state.user
  }
})
<!-- App.vue -->
<template>
  <div>
    <div v-if="isLoggedIn">
      Logged in as {{ user.email }}
      <button @click="logout">Logout</button>
    </div>
    <div v-else>
      <form @submit.prevent="register">
        <h2>Sign up</h2>
        <div>
          <label>Email</label>
          <input type="email" v-model="email">
        </div>
        <div>
          <label>Password</label>
          <input type="password" v-model="password">
        </div>
        <button>Register</button>
      </form>
      <hr>
      <form @submit.prevent="login">
        <h2>Sign in</h2>
        <div>
          <label>Email</label>
          <input type="email" v-model="email">
        </div>
        <div>
          <label>Password</label>
          <input type="password" v-model="password">
        </div>
        <button>Login</button>
      </form>
    </div>
  </div>
</template>

<script>
import { mapState, mapGetters, mapActions } from 'vuex'

export default {
  data: () => ({
    email: '',
    password: ''
  }),
  computed: {
    ...mapState(['user']),
    ...mapGetters(['isLoggedIn'])
  },
  methods: {
    ...mapActions(['register', 'login', 'logout'])
  }
}
</script>

在上面的示例中,我们在store中定义了一个user对象,该对象可以设置为null或一个包含用户信息的对象。此外,我们还定义了register、login和logout三个actions来处理API请求并更新store中的user对象。我们还定义了一个getter,用于检查用户是否已登录。

在组件中,使用mapState和mapGetters来映射到store中定义的user和 isLoggedIn方法。我们使用register、login和logout方法来处理API请求并触发更新视图。

结论

通过使用Vuex,在组件之间共享状态数据变得非常容易。我希望这些示例能够帮助您更好地理解如何在Vue应用程序中使用Vuex来管理数据。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:vue全局数据管理示例详解 - Python技术站

(0)
上一篇 2023年5月28日
下一篇 2023年5月28日

相关文章

  • 详解Vue中watch的高级用法

    详解Vue中watch的高级用法 Vue中的watch是一个非常重要的属性,它用于监听数据的变化并执行相应的回调函数。除了最基本的用法,Vue中的watch还有一些高级用法,本文将针对这些高级用法进行详细讲解。 watch的基本用法 先来回顾一下watch的基本用法。在Vue实例中使用watch属性来监听某个数据的变化,代码如下所示: data() { re…

    Vue 2023年5月28日
    00
  • vuex在vite&vue3中的简单使用说明

    下面是“vuex在vite&vue3中的简单使用说明”的完整攻略: Vue3项目中使用Vuex 在Vue3项目中使用Vuex需要先安装vuex: npm install vuex –save 然后在src目录下新建store目录,在store目录下新建index.js文件: import { createStore } from ‘vuex’ co…

    Vue 2023年5月28日
    00
  • vue数据操作之点击事件实现num加减功能示例

    下面是详细讲解“vue数据操作之点击事件实现num加减功能”的攻略。 使用Vue实现num加减功能 在Vue中,我们可以通过绑定点击事件实现num的加减操作。下面通过两个示例说明具体实现方法。 示例一:使用Vue实现num加减 HTML代码: <div id="app"> <h2>{{ num }}</h2&…

    Vue 2023年5月27日
    00
  • Vue中methods的this指向问题浅析

    下面是详细讲解“Vue中methods的this指向问题浅析”的完整攻略。 1. 什么是Vue中的methods? 在Vue组件里,methods是用于存放方法的一个对象。它可以包含各种实例方法,例如事件监听、异步请求等等。在组件内部可以通过this关键字来调用methods里面的方法。 2. methods中的this指向问题 在Vue中,methods中…

    Vue 2023年5月28日
    00
  • VsCode里的Vue模板的实现

    下面是关于VsCode里的Vue模板的实现的完整攻略。 什么是Vue模板? 在VsCode中,Vue模板是一种代码片段(snippet),简化了Vue.js的常用代码块的编写,让开发人员更加专注于逻辑开发,提高开发效率。 如何在VsCode中使用Vue模板? 安装插件 首先,需要在VsCode中安装支持Vue代码片段的插件,有多种插件可供选择,例如: Vet…

    Vue 2023年5月28日
    00
  • Vue中的computed属性详解

    接下来就为大家讲解一下Vue中的computed属性详解。 什么是computed属性 在Vue中,有一个计算属性computed,它是一个在模板中具有缓存特性的属性,当依赖的响应式数据发生变化时,会重新计算。 computed属性一般用于计算和过滤数据,在模板中使用computed属性,可以让代码更加清晰简洁。 如何声明computed属性 在Vue中声明…

    Vue 2023年5月28日
    00
  • vue excel上传预览和table内容下载到excel文件中

    Vue Excel上传预览 在Vue中实现Excel上传预览,需要使用以下三个库:xlsx、file-saver、vue-xlsx。引入这三个库后,在Vue组件中可以实现以下代码: <template> <div> <input type="file" @change="onUpload"…

    Vue 2023年5月28日
    00
  • Vue2.0 vue-source jsonp 跨域请求

    Vue2.0 vue-source jsonp 跨域请求攻略: 一、什么是跨域请求? 当浏览器执行前端代码时,由于同源策略的存在,只能向同一域名下的服务器发出请求,而不能向其他域名下的服务器发出请求。这就是跨域请求。 二、Vue2.0 的 jsonp 请求方法 jsonp 是利用浏览器动态创建标签,通过 src 属性实现跨域请求的方法,Vue2.0 的 vu…

    Vue 2023年5月28日
    00
合作推广
合作推广
分享本页
返回顶部