Vue学习之Vuex的使用详解

目录
  • 简介
  • 优缺点
    • 优点
    • 缺点
  • 使用场景
  • 示例
  • 安装Vuex并引入
    • 1.安装vuex
    • 2.编写vuex的store
    • 3.main.js引入CounterStore.js
  • 业务代码
    • 测试

简介

说明

本文介绍Vue的插件:Vuex。包括:优缺点、使用场景、示例。

官网

官网文档

API vuex-store

优缺点

优点

1.响应式

属于 vue 生态一环,,能够触发响应式的渲染页面更新。 (localStorage 就不会)

2.可预测的方式改变数据

避免数据污染

3.无需转换数据

JS 原生的数据对象写法(不需要做转换)。(localStorage 需要做转换)

缺点

1.复杂

适合大应用,不适合小型应用

2.不能持久化(刷新页面后vuex中的state会变为初始状态)

解决方案

结合localStorage

vuex-persistedstate插件

使用场景

当我们多个页面需要共享数据时就可以使用Vuex。

实际开发中我们一般在下面这种情况使用它:

当前登录用户的信息

购物车的信息

收藏的信息

用户的地理位置

示例

本处用计数器来测试:一个组件修改计数器的值,其余两个不相关组件可以监测到时计数器值的改变。

做法:一个组件(ComponentA)将数据共享给另外两个不相关组件(ComponentB和ComponentC),外部用Parent.vue放置这三个组件。

安装Vuex并引入

1.安装vuex

在工程目录下执行:npm install vuex

2.编写vuex的store

创建目录store,在其下边创建CounterStore.js,内容如下:

import Vue from 'vue';
import Vuex from 'vuex';

Vue.use(Vuex);
const couterStore = new Vuex.Store(
  {
    state: {
      count1: 0,
      count2: 0,
    },
    mutations: {
      increment1(state) {
        state.count1++;
      },
      decrement1(state) {
        state.count1--;
      },
      increment2: state => state.count2++,
      decrement2: state => state.count2--,
    }
  }
);

export default couterStore;

3.main.js引入CounterStore.js

// The Vue build version to load with the `import` command
// (runtime-only or standalone) has been set in webpack.base.conf with an alias.
import Vue from 'vue'
import App from './App'
import router from './router'
import CouterStore from './store/CounterStore'

Vue.config.productionTip = false

/* eslint-disable no-new */
new Vue({
  el: '#app',
  router,
  store: CouterStore,
  components: { App },
  template: '<App/>'
})

按照JS语法,key与value重名时可以简写:(很多教程这么写)

// The Vue build version to load with the `import` command
// (runtime-only or standalone) has been set in webpack.base.conf with an alias.
import Vue from 'vue'
import App from './App'
import router from './router'
import store from './store/CounterStore'

Vue.config.productionTip = false

/* eslint-disable no-new */
new Vue({
  el: '#app',
  router,
  store,
  components: { App },
  template: '<App/>'
})

业务代码

代码

ComponentA.vue

<template>
  <div class="container">
    <h3>ComponentA</h3>
    <button @click="increment1">增加:第1个计数器</button>
    <button @click="decrement1">减少:第1个计数器</button><br><br>
    <button @click="increment2">增加:第2个计数器</button>
    <button @click="decrement2">减少:第2个计数器</button>
  </div>
</template>

<script>
export default {
  data() {
    return {
      count1: 0,
      count2: 0,
    }
  },
  methods:{
    increment1() {
      this.$store.commit('increment1')
    },
    decrement1() {
      this.$store.commit('decrement1')
    },
    increment2() {
      this.$store.commit('increment2')
    },
    decrement2() {
      this.$store.commit('decrement2')
    }
  }
}
</script>

<style scoped>
.container {
  margin: 20px;
  border: 2px solid blue;
  padding: 20px;
}
</style>

ComponentB.vue

<template>
  <div class="container">
    <h3>ComponentB</h3>
    计数器的值:{{msg}}
    <!--也可以这么写:-->
    <!--计数器的值:{{this.$store.state.count1}}-->
  </div>
</template>

<script>
export default {
  computed:{
    msg() {
      return this.$store.state.count1;
    }
  }
}
</script>

<style scoped>
.container {
  margin: 20px;
  border: 2px solid blue;
  padding: 20px;
}
</style>

ComponentC.vue

<template>
  <div class="container">
    <h3>ComponentC</h3>
    计数器的值:{{msg}}
    <!--也可以这么写:-->
    <!--计数器的值:{{this.$store.state.count2}}-->
  </div>
</template>

<script>
export default {
  computed:{
    msg() {
      return this.$store.state.count2;
    }
  }
}
</script>

<style scoped>
.container {
  margin: 20px;
  border: 2px solid blue;
  padding: 20px;
}
</style>

Parent.vue

<template>
  <div class="outer">
    <h3>父组件</h3>
    <component-a></component-a>
    <component-b></component-b>
    <component-c></component-c>

  </div>
</template>

<script>
import ComponentA from "./ComponentA";
import ComponentB from "./ComponentB";
import ComponentC from "./ComponentC";

export default {
  name: 'Parent',
  components: {ComponentA, ComponentB, ComponentC},
  data() {
    return {
      name: 'Tony',
      age: 20,
      phoneNumber: '1234567890'
    }
  }
}
</script>

<style scoped>
.outer {
  margin: 20px;
  border: 2px solid red;
  padding: 20px;
}
</style>

路由

import Vue from 'vue'
import Router from 'vue-router'
import Parent from "../components/Parent";

Vue.use(Router)

export default new Router({
  routes: [
    {
      path: '/parent',
      name: 'Parent',
      component: Parent,
    }
  ],
})

测试

访问: http://localhost:8080/#/parent

到此这篇关于Vue学习之Vuex的使用详解的文章就介绍到这了,更多相关Vuex使用内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • vuex的核心概念和基本使用详解

    目录 介绍 开始 安装 ①直接下载方式 ②CND方式 ③NPM方式 ④Yarn方式 NPM方式安装的使用方式 store概念及使用 概念: 定义 使用 mutations概念及使用 概念: 使用: 定义 使用 action概念及使用 概念: 定义 使用 getters概念及使用 概念: 定义 使用 总结 介绍 Vuex是实现组件全局状态(数据)管理的一种机制,可以方便的实现组件之间的数据共享 开始 安装 ①直接下载方式 创建一个 vuex.js 文件 将https://unpkg.com/vue

  • 详解Vuex的属性和作用

    目录 Vuex是什么? Vuex的5个属性 vuex 的 State 特性是? vuex 的 Getter 特性是? vuex 的 mauation 特性是? vuex 的 action 特性是? 什么情况下应该使用 Vuex? 总结 Vuex是什么? VueX是一个专门为 Vue.js 应用设计的状态管理架构,统一管理和维护各个vue组件的可变化状态(你可以理解成 vue 组件里的某些 data ). vuex 可以理解为一种开发模式或框架.比如 PHP 有 thinkphp ,java 有

  • vuex的使用步骤

    一.使用Vuex的目的 实现多组件状态管理.多个组件之间需要数据共享时,Vuex是个很好的帮手哦 二.Vuex 的五大核心 其中state和mutation是必须的,其他可根据需求来加 1.state 负责状态管理,类似于vue中的data,用于初始化数据 2.mutation 专用于修改state中的数据,通过commit触发 3.action 可以处理异步,通过dispatch触发,不能直接修改state,首先在组件中通过dispatch触发action,然后在action函数内部commi

  • Vue的状态管理vuex使用方法详解

    引入vuex 当访问数据对象时,一个 Vue 实例只是简单的代理访问.所以,如果有一处需要被多个实例间共享的状态,可以简单地通过维护一份数据来实现共享 const sourceOfTruth = {} const vmA = new Vue({ data: sourceOfTruth }) const vmB = new Vue({ data: sourceOfTruth }) 现在当 sourceOfTruth 发生变化,vmA 和 vmB 都将自动的更新引用它们的视图.子组件们的每个实例也会

  • Vue学习之Vuex的使用详解

    目录 简介 优缺点 优点 缺点 使用场景 示例 安装Vuex并引入 1.安装vuex 2.编写vuex的store 3.main.js引入CounterStore.js 业务代码 测试 简介 说明 本文介绍Vue的插件:Vuex.包括:优缺点.使用场景.示例. 官网 官网文档 API vuex-store 优缺点 优点 1.响应式 属于 vue 生态一环,,能够触发响应式的渲染页面更新. (localStorage 就不会) 2.可预测的方式改变数据 避免数据污染 3.无需转换数据 JS 原生的

  • Vue学习之组件用法实例详解

    本文实例讲述了Vue学习之组件用法.分享给大家供大家参考,具体如下: Vue中的模块化.可重用代码块将页面细分为一个个功能组件,而且组件之间可以嵌套.组件分为全局组件与局部组件,局部组件在实例中进行注册,并且只可以应用于该实例中. 1. 组件的使用流程: //1.创建组件构造器 let overallDiv=Vue.extend({ template:` <div> <p>这是一个全局组件div</p> </div> ` }); //2.注册全局组件 Vue

  • Vue学习之常用指令实例详解

    本文实例讲述了Vue常用指令.分享给大家供大家参考,具体如下: 1.创建一个vue实例 vue的一个特点就是数据驱动界面,一旦对js中的数据进行修改,界面中用到数据的地方也会立马做出更改.为了对界面进行操纵,需要先获取到界面的标签元素,并实例化一个vue实例. 例如在HTML创建一个div: <div id="app"> <p>{{msg}}</p> </div> 在js中将其实例化为vue对象: let app=new Vue({ el

  • Vue的实例、生命周期与Vue脚手架(vue-cli)实例详解

    一.Vue的实例 1.1.创建一个 Vue 的实例 每个 Vue 应用都是通过 Vue 函数创建一个新的 Vue 实例开始的: var vm = new Vue({// 选项}) 虽然没有完全遵循 MVVM 模型,Vue 的设计无疑受到了它的启发.因此在文档中经常会使用 vm (ViewModel 的简称) 这个变量名表示 Vue 实例. 1.vue.js就是一个构造器,通过构造器Vue来实例化一个对象:例如:var vm = new Vue({}); 2.实例化Vue时,需要传入一个参数(选项

  • vue组件间通信子与父详解(二)

    接着vue组件父与子通信详解继续学习. 二.组件间通信(子组件传值给父组件) 通过事件的方式来完成数据的传输. ①在父组件中 定义一个方法,用来接收子组件所通过事件传来的值 methods:{ recvMsg:function(msg){ //参数msg就是子组件通过事件出来的数据 } } ②绑定事件处理函数 事件一般情况 都是自定义事件 <child-component @myEvent="recvMsg"></child-component> ③在子组件触发

  • vue.js+boostrap项目实践(案例详解)

    一.为什么要写这篇文章 最近忙里偷闲学了一下vue.js,同时也复习了一下boostrap,发现这两种东西如果同时运用到一起,可以发挥很强大的作用,boostrap优雅的样式和丰富的组件使得页面开发变得更美观和更容易,同时vue.js又是可以绑定model和view(这个相当于MVC中的,M和V之间的关系),使得对数据变换的操作变得更加的简易,简化了很多的逻辑代码. 二.学习这篇文章需要具备的知识 1.需要有vue.js的知识 2.需要有一定的HTML.CSS.JavaScript的基础知识 3

  • vue实现简单表格组件实例详解

    本来想这一周做一个关于vuex的总结的,但是由于朋友反应说还不知道如何用vue去写一个组件,所以在此写写一篇文章来说明下如何去写vue页面或者组件.vue的核心思想就是组件,什么是组件呢?按照我的理解组件就是装配页面的零件,比如一辆车有大大小小许多零件组成,那么同样的一个页面,也是有许多组件构成的比如说头部组件 按钮组件等等,vue三大核心组件 路由 状态管理,路由控制页面的渲染,页面由组件组成,数据有vuex进行管理和改变.下面我会以一个简单的案例来说 第一步:构建一个简单的vue项目,老规矩

  • Vue 短信验证码组件开发详解

    Vue.js(读音 /vjuː/, 类似于 view)是一个构建数据驱动的 web 界面的库.Vue.js 的目标是通过尽可能简单的 API 实现响应的数据绑定和组合的视图组件. Vue.js 自身不是一个全能框架--它只聚焦于视图层.因此它非常容易学习,非常容易与其它库或已有项目整合.另一方面,在与相关工具和支持库一起使用时,Vue.js 也能完美地驱动复杂的单页应用. 摘要: 1.该组件基于Vue 2.1.X版本: 1. Vue 组件代码如下: Vue.component('timerBtn

  • Vue.directive()的用法和实例详解

    官网实例: https://cn.vuejs.org/v2/api/#Vue-directive https://cn.vuejs.org/v2/guide/custom-directive.html 指令定义函数提供了几个钩子函数(可选): bind: 只调用一次,指令第一次绑定到元素时调用,用这个钩子函数可以定义一个在绑定时执行一次的初始化动作. inserted: 被绑定元素插入父节点时调用(父节点存在即可调用,不必存在于 document 中). update: 被绑定元素所在的模板更新

  • vue通信方式EventBus的实现代码详解

    vue通信方式有很多,项目中用的比较多的的有 pros.vuex.$emit/$on 这3种,还有 provide/inject (适合高阶组件). $attrs和$listeners (适合高阶组件)以及 $parent/$child/ref.eventBus 等这3种方式.很多时候我们都是只会使用api,而懂得原理以及实现,但我就觉得懂得原理以及实现跟一个只会调用api的开发人员时不在同一层次的.所以这里就像把跨组件通信的 eventBus 通信的原理给大家展示一下.这也是自己学到大佬的的东

随机推荐