vuex实现及简略解析(小结)

Vuex实现及简略解析

Vuex是一个专为Vue.js设计的状态管理库,他采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化。在大型的Vue.js应用程序中,多个组件之间共享同一状态,直接进行状态传递会比较麻烦。在这种情况下,我们可以使用Vuex。本文详细介绍了Vuex的实现和简略的解析。

Vuex简单介绍

Vuex提供了一个集中式存储管理应用的所有组件的状态的机制。包括:状态(state)、变更(mutations)、行为(actions)、获取器(getters)这四个部分。Vuex 属于基于状态管理模式的设计,视图和状态是分开了的,它们之间的复杂关系都被交给了 Vuex 来管理。一个重要的点就是:状态的改变一定是发生在 Mutation 函数中,每当一个 Action 被触发时,都会间接地导致提交 Mutations 的过程。

几种常见的状态管理模式

Vue.js中我们经常使用以下几种状态管理模式:

  1. Props & $emit:@click“新增”按钮 --“新增”是一个父组件,并可以通过$emit来向子组件传值。这种状态传递模式适用于组件通信中父子关系单向的情况。

  2. Event Bus:适用于复杂的组件通信中,多个兄弟之间、跨多层嵌套组件直接的情况。

  3. Vuex:适用于中大型SPA应用中的状态管理。

Vuex的实现

state

Vuex的state是给Vuex用来存状态的,它类似于一个全局变量,定义在src/store/index.js,并在Vue实例中作为计算属性引用。

const store = new Vuex.Store({
  state: {
    count: 0
  },
  mutations: {
    increment (state) {
      state.count++
    }
  }
})

getter

Vuex的getter顾名思义就是用来获取已经在Vuex存储的状态的。可以将state值通过getter进行计算,返回一个新的值。实现:getter相当于 store 中的计算属性(commit/mutations 其实是 store 的 methods) getter可以理解为是 store 的计算属性。

const store = new Vuex.Store({
  state: {
    todos: [
      { id: 1, done: true },
      { id: 2, done: false }
    ]
  },
  getters: {
    doneTodos: state => {
      return state.todos.filter(todo => todo.done)
    },
    doneTodosCount: (state, getters) => {
      return getters.doneTodos.length
    }
  }
})

mutation

Vuex的mutation是唯一管理状态的途径,需要注册一个函数来操作状态。mutation是Vuex中用于改变状态的唯一途径。通过提交mutation来进行操作。

const store = new Vuex.Store({
  state: {
    count: 1
  },
  mutations: {
    add (state, n) {
      return (state.count += n)
    },
    addOne (state) {
      return (state.count += 1)
    },
    minus (state, n) {
      return (state.count -= n)
    }
  }
})

action

Vuex的action主要是为了方便异步操作,将异步操作提交给mutation,并提供了跟踪异步操作状态的方法。

const store = new Vuex.Store({
  state: {
    count: 1
  },
  mutations: {
    add (state, n) {
      return (state.count += n)
    },
  },
  actions: {
    actionAdd ({commit}, payload) {
      setTimeout(() => {
        commit('add', payload)
      }, 1000)
    }
  }
})

简略解析

在Vuex中,存在以下几种部分:state:我们需要管理的状态,驱动应用的数据源;mutations:修改状态的事件处理器;getters:从state中获取数据的计算属性;actions:异步处理逻辑。

当状态state变化时,视图响应函数对应的视图也会自动更新。

示例

示例1:count

  • 定义state
export default {
  state: {
    count: 0
  }
}
  • 定义mutations
export default {
  mutations: {
    increment (state) {
      state.count++
    },
    decrement (state) {
      state.count--
    }
  }
}
  • 定义actions
export default {
  actions: {
    increment ({ commit }) {
      commit('increment')
    },
    decrement ({ commit }) {
      commit('decrement')
    },
    incrementAsync ({ commit }) {
      setTimeout(() => {
        commit('increment')
      }, 1000)
    }
  }
}
  • 定义getters
export default {
  getters: {
    evenOrOdd: state => state.count % 2 === 0 ? 'even' : 'odd'
  }
}

示例2:todos

  • 定义state
export default {
  state: {
    todos: [
      { id: 1, text: 'vue.js', done: true },
      { id: 2, text: 'react.js', done: false },
      { id: 3, text: 'angular.js', done: false }
    ]
  }
}
  • 定义mutations
export default {
  mutations: {
    addTodo (state, text) {
      state.todos.push({
        id: state.todos.length + 1,
        text,
        done: false
      })
    },
    toggleTodo (state, todo) {
      todo.done = !todo.done
    }
  }
}
  • 定义actions
export default {
  actions: {
    addTodo ({ commit }, text) {
      commit('addTodo', text)
    },
    toggleTodo ({ commit }, todo) {
      commit('toggleTodo', todo)
    }
  }
}
  • 定义getters
export default {
  getters: {
    doneTodos: state => {
      return state.todos.filter(todo => todo.done)
    },
    undoneTodos: state => {
      return state.todos.filter(todo => !todo.done)
    }
  }
}

以上就是对Vuex实现及简略解析的详细攻略,希望对大家有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:vuex实现及简略解析(小结) - Python技术站

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

相关文章

  • vuex中的5个属性使用方法举例讲解

    下面是 “vuex中的5个属性使用方法举例讲解” 的详细攻略: 1. State State 是 Vuex 存储数据的地方,类似于组件中的 data。通过处于 Store 对象中的 state 选项来定义,我们可以在模块内或组件中直接通过 this.$store.state 进行访问。 下面是一个 State 的示例,用来存储当前文章列表: // store…

    Vue 2023年5月27日
    00
  • vue在取对象长度length时候出现undefined的解决

    当使用Vue框架的语法时,在某些情况下从一个对象中获取其长度属性时,可能会返回undefined。这通常是由于Vue对象中有未定义的属性造成的。下面是解决这种问题的方法。 方法一:使用计算属性 我们可以使用计算属性来获取Vue对象的长度。通过计算属性,我们可以遍历对象并返回正确的长度。 <template> <div>{{ objec…

    Vue 2023年5月27日
    00
  • vue如何循环给对象赋值

    想要循环给对象赋值,可以使用Vue中的v-for指令来实现。v-for指令可以遍历一个数组或者一个对象中的所有元素,常用语渲染列表,也可以用于动态生成表单。 对于对象,v-for指令可以通过它的第二个参数,键名(key),来获取到对象的键名和键值。通过在模板中使用{ key, value } in object 表达式可以遍历对象。具体过程如下: 1.创建一…

    Vue 2023年5月28日
    00
  • SpringBoot使用Shiro实现动态加载权限详解流程

    下面是”SpringBoot使用Shiro实现动态加载权限详解流程”的完整攻略: 1. 确定需求 首先,我们需要明确本次实现的需求。我们将使用Shiro来实现认证和权限控制,同时,我们的权限控制将支持动态的添加和删除。具体来说,我们需要实现以下功能: 用户登录 用户退出 用户认证 用户权限控制 动态添加权限 动态删除权限 2. 搭建SpringBoot项目 …

    Vue 2023年5月28日
    00
  • Vue中如何实现在线预览word文件、excel文件

    要在Vue中实现在线预览Word文件或Excel文件,可以使用第三方插件view-doc和vue-embed, 具体步骤如下: 1. 安装插件 在Vue项目中安装view-doc和vue-embed插件。 npm install view-doc vue-embed –save 2. 引入插件并定义组件 在Vue项目的入口文件中,引入view-doc和vu…

    Vue 2023年5月28日
    00
  • Vue input输入框回车以后自动刷新页面(直播程序)

    当用户在 Vue 应用程序的输入框中按下回车键时,页面自动刷新可能不是一个理想的效果。为了实现此目标,我们可以使用 Vue 的 v-model 指令来修改数据模型,还可以使用自定义指令来绑定键盘事件,并阻止回车键的默认操作。 以下是实现此目标的完整攻略: 1. 创建输入框组件并使用 v-model 指令 首先,我们需要在 Vue 中创建一个输入框组件。我们可…

    Vue 2023年5月27日
    00
  • vue进行post和get请求实例讲解

    Vue进行post和get请求实例讲解 Vue.js是一款轻量级的JavaScript框架,且它提供了强大的数据绑定和交互功能,于是很多web开发人员喜欢使用Vue.js开发web应用。常见的web应用需要从服务器获取数据,而请求方式一般有POST和GET两种,在Vue.js中,使用axios库可方便地进行POST和GET请求。 axios库简介 axios…

    Vue 2023年5月28日
    00
  • Vue.js实现的购物车功能详解

    下面是“Vue.js实现的购物车功能详解”的完整攻略。 确定需求 在开始Vue.js实现购物车功能之前,我们需要先明确我们的需求,包括: 需要展示商品列表; 需要将商品添加到购物车中; 需要展示购物车中的商品列表; 需要对购物车中的商品进行增删操作; 需要实时展示购物车总价。 准备工作 实现此功能需要准备以下工作: 安装Vue.js的开发环境; 准备好商品数…

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