一篇文章带你深入浅出Vuex

简介: 在写Vuex之前,我们先用一个简单的例子来实现一个小demo

大家都知道Vue的父传子用在很多场景,比如像这样:


父组件:


<template>
  <div id="app">
    <product-list-one :msg='msg'></product-list-one>  
  </div>
  </template>
  <script>
  export default {
  name: 'app',
  components:{
    'product-list-one':ProductListOne,
  },
  data () {
    return {
      msg:'love'
    }
  }
}
</script>


子组件:


<template>
  <div id="product-list-one">
    <div>{{msg}}</div>
  </div>
</template>
<script>
props:['msg']
</script>


有父传子,当然也有子传父:


子组件:


<template>
  <div id="product-list-one">
    <button @click="but">点击</button>
  </div>
</template>
<script>
  data(){
    return {
      txt:'hello'
    }
  },
  methods:{
    but() {
      this.$emit('get',this.txt);
    }
  }
</script>


父组件:


<template>
  <div id="app">
    <product-list-one :msg='msg' @get='world'></product-list-one>  
  </div>
</template>
<script>
import ProductListOne from './components/ProductListOne.vue'
export default {
  name: 'app',
  components:{
    'product-list-one':ProductListOne
  },
  methods:{
    world(data){
      console.log(data)
    }
  }
}
</script>


但是有些场景如果使用父传子、子传父的话,很难实现。比如说:


微信截图_20220427133140.png


a组件b组件相互通信,必须要有一个公共变量库才更方便。 所以Vuex应运而生,通过创建一个集中的数据存储,供程序中所有组件访问。


一、安装


npm install vuex


二、配置


创建一个store文件夹在根目录src下,然后在文件夹里创建一个名叫index.js文件。


import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
export const store = new Vuex.Store({
  strict:true,
  state:{},
  getters:{},
  mutations:{},
  actions:{}
});


然后在src文件夹下的main.js文件里引入store


import Vue from 'vue'
import App from './App.vue'
import {store} from './store/store'
new Vue({
  store:store,
  el: '#app',
  render: h => h(App)
})


三、实际操作


Vuex分为四大板块:


  • state
  • getters
  • mutations
  • actions


那么我们接下来分别讲解一下

1、state


state用于存储数据。


import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
export const store = new Vuex.Store({
  strict:true,
  state:{
    products:[
          {name:"马云",price:200},
          {name:"马化腾",price:140},
          {name:"马冬梅",price:20},
          {name:"马蓉",price:10}
        ]
  }
});


使用this.$store.state.products获取获取数据。


<template>
  <div id="product-list-one">
    <ul>
      <li v-for="(product,index) in saleProducts" :key="index">
        <span class="name">{{product.name}}</span>
        <span class="price">${{product.price}}</span>
      </li>
    </ul>
  </div>
</template>
<script>
export default {
  computed:{
    products(){
      return this.$store.state.products;
    }
  },
}
</script>


2、getters


getters用于获取数据。


import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
export const store = new Vuex.Store({
  strict:true,
  state:{
    products:[
          {name:"马云",price:200},
          {name:"马化腾",price:140},
          {name:"马冬梅",price:20},
          {name:"马蓉",price:10}
        ]
  },
  getters:{
    saleProducts: (state) =>{
      var saleProducts = state.products.map(product =>{
            return {
              name: "**" + product.name + "**",
              price: product.price / 2
            };
        });
        return saleProducts;
    }
  }
});


调用获取数据的方法。


<template>
  <div id="product-list-one">
    <ul>
      <li v-for="(product,index) in saleProducts" :key="index">
        <span class="name">{{product.name}}</span>
        <span class="price">${{product.price}}</span>
      </li>
    </ul>
  </div>
</template>
<script>
import {mapGetters} from 'vuex'
export default {
  computed:{
    ...mapGetters([
      "saleProducts"
    ])
  }
}
</script>


3、mutations


mutations用于变更state中的状态。


import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
export const store = new Vuex.Store({
  strict:true,
  state:{
    products:[
          {name:"马云",price:200},
          {name:"马化腾",price:140},
          {name:"马冬梅",price:20},
          {name:"马蓉",price:10}
        ]
  },
  getters:{
    saleProducts: (state) =>{
      var saleProducts = state.products.map(product =>{
            return {
              name: "**" + product.name + "**",
              price: product.price / 2
            };
        });
        return saleProducts;
    }
  },
  mutations:{
    reducePrice: (state,payload) =>{
        state.products.forEach(product =>{
              product.price -= payload;
          })
    }
  }
});


mutations更像是事件注册,所以需要我们需要store.commit()触发一下。


<template>
  <div id="product-list-one">
    <ul>
      <li v-for="(product,index) in saleProducts" :key="index">
        <span class="name">{{product.name}}</span>
        <span class="price">${{product.price}}</span>
      </li>
    </ul>
    <button @click="reducePrice(2)">商品降价</button>
  </div>
</template>
<script>
import {mapGetters} from 'vuex'
export default {
  computed:{
    products(){
      return this.$store.state.products;
    },
    ...mapGetters([
      "saleProducts"
    ])
  },
  methods:{
  reducePrice (n) {
     this.$store.commit('reducePrice',n);
  }
  }
}
</script>


4、actions


  • actions用于提交的是mutations,而不是直接提交状态。
  • actions可以包含任意异步操作。


import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
export const store = new Vuex.Store({
  strict:true,
  state:{
    products:[
          {name:"马云",price:200},
          {name:"马化腾",price:140},
          {name:"马冬梅",price:20},
          {name:"马蓉",price:10}
        ]
  },
  getters:{
    saleProducts: (state) =>{
      var saleProducts = state.products.map(product =>{
            return {
              name: "**" + product.name + "**",
              price: product.price / 2
            };
        });
        return saleProducts;
    }
  },
  mutations:{
    reducePrice: (state,payload) =>{
      // setTimeout(function(){
        state.products.forEach(product =>{
              product.price -= payload;
          })
        // },3000);
    }
  },
  actions:{
    reducePrice:(context,payload) =>{
      setTimeout(function(){
        context.commit("reducePrice",payload); // context.commit()相当于 this.$store.commit(),触发mutations事件。
      },2000);
    }
  }
});


需要用store.dispatch()触发actions,但是为了方便,我们这里使用mapActions


<template>
  <div id="product-list-one">
    <ul>
      <li v-for="(product,index) in saleProducts" :key="index">
        <span class="name">{{product.name}}</span>
        <span class="price">${{product.price}}</span>
      </li>
    </ul>
    <button @click="reducePrice(2)">商品降价</button>
  </div>
</template>
<script>
import {mapGetters} from 'vuex'
import {mapActions} from 'vuex'
export default {
  props:['msg'],
  data(){
    return {
      txt:'hello'
    }
  },
  computed:{
    products(){
      return this.$store.state.products;
    },
    ...mapGetters([
      "saleProducts"
    ])
  },
  methods:{
    ...mapActions([
      "reducePrice"
    ])
  }
}
</script>



相关文章
|
10天前
|
存储 关系型数据库 分布式数据库
PostgreSQL 18 发布,快来 PolarDB 尝鲜!
PostgreSQL 18 发布,PolarDB for PostgreSQL 全面兼容。新版本支持异步I/O、UUIDv7、虚拟生成列、逻辑复制增强及OAuth认证,显著提升性能与安全。PolarDB-PG 18 支持存算分离架构,融合海量弹性存储与极致计算性能,搭配丰富插件生态,为企业提供高效、稳定、灵活的云数据库解决方案,助力企业数字化转型如虎添翼!
|
9天前
|
存储 人工智能 Java
AI 超级智能体全栈项目阶段二:Prompt 优化技巧与学术分析 AI 应用开发实现上下文联系多轮对话
本文讲解 Prompt 基本概念与 10 个优化技巧,结合学术分析 AI 应用的需求分析、设计方案,介绍 Spring AI 中 ChatClient 及 Advisors 的使用。
408 130
AI 超级智能体全栈项目阶段二:Prompt 优化技巧与学术分析 AI 应用开发实现上下文联系多轮对话
|
3天前
|
存储 安全 前端开发
如何将加密和解密函数应用到实际项目中?
如何将加密和解密函数应用到实际项目中?
197 138
|
9天前
|
人工智能 Java API
AI 超级智能体全栈项目阶段一:AI大模型概述、选型、项目初始化以及基于阿里云灵积模型 Qwen-Plus实现模型接入四种方式(SDK/HTTP/SpringAI/langchain4j)
本文介绍AI大模型的核心概念、分类及开发者学习路径,重点讲解如何选择与接入大模型。项目基于Spring Boot,使用阿里云灵积模型(Qwen-Plus),对比SDK、HTTP、Spring AI和LangChain4j四种接入方式,助力开发者高效构建AI应用。
377 122
AI 超级智能体全栈项目阶段一:AI大模型概述、选型、项目初始化以及基于阿里云灵积模型 Qwen-Plus实现模型接入四种方式(SDK/HTTP/SpringAI/langchain4j)
|
3天前
|
存储 JSON 安全
加密和解密函数的具体实现代码
加密和解密函数的具体实现代码
197 136
|
21天前
|
弹性计算 关系型数据库 微服务
基于 Docker 与 Kubernetes(K3s)的微服务:阿里云生产环境扩容实践
在微服务架构中,如何实现“稳定扩容”与“成本可控”是企业面临的核心挑战。本文结合 Python FastAPI 微服务实战,详解如何基于阿里云基础设施,利用 Docker 封装服务、K3s 实现容器编排,构建生产级微服务架构。内容涵盖容器构建、集群部署、自动扩缩容、可观测性等关键环节,适配阿里云资源特性与服务生态,助力企业打造低成本、高可靠、易扩展的微服务解决方案。
1355 8
|
8天前
|
监控 JavaScript Java
基于大模型技术的反欺诈知识问答系统
随着互联网与金融科技发展,网络欺诈频发,构建高效反欺诈平台成为迫切需求。本文基于Java、Vue.js、Spring Boot与MySQL技术,设计实现集欺诈识别、宣传教育、用户互动于一体的反欺诈系统,提升公众防范意识,助力企业合规与用户权益保护。
|
20天前
|
机器学习/深度学习 人工智能 前端开发
通义DeepResearch全面开源!同步分享可落地的高阶Agent构建方法论
通义研究团队开源发布通义 DeepResearch —— 首个在性能上可与 OpenAI DeepResearch 相媲美、并在多项权威基准测试中取得领先表现的全开源 Web Agent。
1461 87