/**PageBeginHtml Block Begin **/ /***自定义返回顶部小火箭***/ /*生成博客目录的JS 开始*/ /*生成博客目录的JS 结束*/

Vuex

一:Vue 知识要点说明:


1.概念

在Vue中实现集中式状态(数据)管理的一个Vue插件,对vue应用中多个组件的共享状态进行集中式的管理(读/写),也是一种组件间通信的方式,且适用于任意组件间通信。

Github地址:https://github.com/vuejs/vuex

2.何时使用?

多个组件需要共享数据时

1、多个组件 依赖于同一个状态

2、来自不同组件的行为需要变更统一状态


3.搭建vuex环境


指导内容

3.1: 创建文件:```src/store/index.js```


```js //引入Vue核心库 import Vue from 'vue' //引入Vuex import Vuex from 'vuex' //应用Vuex插件 Vue.use(Vuex) //准备actions对象——响应组件中用户的动作 const actions = {} //准备mutations对象——修改state中的数据 const mutations = {} //准备state对象——保存具体的数据 const state = {} //创建并暴露store export default new Vuex.Store({ actions, mutations, state }) ```



3.2: 在```main.js```中创建vm时传入```store```配置项



```js ...... //引入store import store from './store' ...... //创建vm new Vue({ el:'#app', render: h => h(App), store }) ```





4:基本使用


4.1: 初始化数据、配置```actions```、配置```mutations```,操作文件```store.js```

```js //引入Vue核心库 import Vue from 'vue' //引入Vuex import Vuex from 'vuex' //引用Vuex Vue.use(Vuex) const actions = { //响应组件中加的动作 jia(context,value){ // console.log('actions中的jia被调用了',miniStore,value) context.commit('JIA',value) }, } const mutations = { //执行加 JIA(state,value){ // console.log('mutations中的JIA被调用了',state,value) state.sum += value } } //初始化数据 const state = { sum:0 } //创建并暴露store export default new Vuex.Store({ actions, mutations, state, }) ```

4.2: 组件中读取vuex中的数据:

```$store.state.sum```

4.3: 组件中修改vuex中的数据:


```$store.dispatch('action中的方法名',数据)``` 或 ```$store.commit('mutations中的方法名',数据)``` > 备注:若没有网络请求或其他业务逻辑,组件中也可以越过actions,即不写```dispatch```,直接编写```commit```


5:getters的使用



5.1: 概念:当state中的数据需要经过加工后再使用时,可以使用getters加工。


5.2. 在```store.js```中追加```getters```配置

```js ...... const getters = { bigSum(state){ return state.sum * 10 } } //创建并暴露store export default new Vuex.Store({ ...... getters }) ```


5.3: 组件中读取数据:


```$store.getters.bigSum```


6:四个map方法的使用:


6.1 : <strong>mapState方法:</strong>用于帮助我们映射```state```中的数据为计算属性

```js computed: { //借助mapState生成计算属性:sum、school、subject(对象写法) ...mapState({sum:'sum',school:'school',subject:'subject'}), //借助mapState生成计算属性:sum、school、subject(数组写法) ...mapState(['sum','school','subject']), }, ```


6.2: <strong>mapGetters方法:</strong>用于帮助我们映射```getters```中的数据为计算属性

```js computed: { //借助mapGetters生成计算属性:bigSum(对象写法) ...mapGetters({bigSum:'bigSum'}), //借助mapGetters生成计算属性:bigSum(数组写法) ...mapGetters(['bigSum']) }, ```


6.3: <strong>mapActions方法:</strong>用于帮助我们生成与```actions```对话的方法,即:包含```$store.dispatch(xxx)```的函数

```js methods:{ //靠mapActions生成:incrementOdd、incrementWait(对象形式) ...mapActions({incrementOdd:'jiaOdd',incrementWait:'jiaWait'}) //靠mapActions生成:incrementOdd、incrementWait(数组形式) ...mapActions(['jiaOdd','jiaWait']) } ```


6.4: <strong>mapMutations方法:</strong>用于帮助我们生成与```mutations```对话的方法,即:包含```$store.commit(xxx)```的函数

```js methods:{ //靠mapActions生成:increment、decrement(对象形式) ...mapMutations({increment:'JIA',decrement:'JIAN'}), //靠mapMutations生成:JIA、JIAN(对象形式) ...mapMutations(['JIA','JIAN']), } ``` > 备注:mapActions与mapMutations使用时,若需要传递参数需要:在模板中绑定事件时传递好参数,否则参数是事件对象。


7:模块化+命名空间


7.1: 目的:让代码更好维护,让多种数据分类更加明确。

7.2: 修改```store.js```

```javascript const countAbout = { namespaced:true,//开启命名空间 state:{x:1}, mutations: { ... }, actions: { ... }, getters: { bigSum(state){ return state.sum * 10 } } } const personAbout = { namespaced:true,//开启命名空间 state:{ ... }, mutations: { ... }, actions: { ... } } const store = new Vuex.Store({ modules: { countAbout, personAbout } }) ```

7.3: 开启命名空间后,组件中读取state数据:

```js //方式一:自己直接读取 this.$store.state.personAbout.list //方式二:借助mapState读取: ...mapState('countAbout',['sum','school','subject']), ```

7.4:开启命名空间后,组件中读取getters数据:

```js //方式一:自己直接读取 this.$store.getters['personAbout/firstPersonName'] //方式二:借助mapGetters读取: ...mapGetters('countAbout',['bigSum']) ```

7.5: 开启命名空间后,组件中调用dispatch

```js //方式一:自己直接dispatch this.$store.dispatch('personAbout/addPersonWang',person) //方式二:借助mapActions: ...mapActions('countAbout',{incrementOdd:'jiaOdd',incrementWait:'jiaWait'}) ```


7.6: 开启命名空间后,组件中调用commit

```js //方式一:自己直接commit this.$store.commit('personAbout/ADD_PERSON',person) //方式二:借助mapMutations: ...mapMutations('countAbout',{increment:'JIA',decrement:'JIAN'}), ```
















二、多组件共享数据--全局事件总线实现


1、组件共享数据--全局事件总线实现

image

2、/C/D 组件读取A组件数据

image

3、/C/D 组件修改A组件数据

image



三、多组件共享数据—Vuex 实现


1、组件共享数据-vuex实现

image

image


2、/B/C/D 组件修改Vuex组件X数据

image


四:实例


1:求和案例_纯Vue版本

1:界面效果

image


2:App.vue


<template> <div > <h1>当前求和为:{{ sum }}</h1> <select v-model.number="number"> <option :value="1">1</option> <option :value="2">2</option> <option :value="3">3</option> </select> <button @click="increment">+</button> <button @click="decrement">-</button> <button @click="incrementOdd">当前求和为奇数再加</button> <button @click="incrementWait">等一等再加</button> </div> </template>

<script> export default { /* 组件名 */ name: 'Count', /* mixin(混入) */ mixins: [], /* 配置声明子组件 */ components: { }, /* 组件间数据、方法传值接收区 */ props: [ ], /* 数据对象:数据赋值声明 */ data () { return { sum:0,//当前的和 number:1//用户选择的数字 } }, /* 计算属性:计算区 */ computed: { }, /* 检测区 */ watch: { }, /* */ created () { }, /* 挂载区 */ mounted () { }, /* 方法区 */ methods: { increment(){ this.sum +=this.number; }, decrement(){ this.sum -=this.number; }, incrementOdd(){ if(this.sum % 2){ this.sum += this.number; } }, incrementWait(){ setTimeout(() =>{ this.sum +=this.number; },500); }, } } </script>

<style  lang="css" scoped>
 button{
   margin-left:30px;
 }

</style>


3.vue.config.js

const { defineConfig } = require('@vue/cli-service')
module.exports = defineConfig({
  pages:{
    index:{
      // 入口
      entry:'src/main.js',
    },
  },
  //配置vue脚手架的代理服务器:开启代理服务器  此处代理服务器默认与 该脚手架启动的模拟的前端服务器 端口相同:8080
  // 方式一
  /*
   devServer:{
     proxy:'http://localhost:5000/'
  },
 */
  // 方式二 
   devServer:{
      proxy:{
           //  '/api': 请求前缀 
          '/api':{
                    target:'http://localhost:5000/',
                    // 将请求过来的url信息里的 请求前缀  格式化去除掉
                    pathRewrite:{'^/api':''},
                    // ws:true,  //用于支持 websocket
                    // chageOrigin:true  // 用于控制请求头中的host值
                  } ,
           //  '/api': 请求前缀 
          '/demo':{
                    target:'http://localhost:5001/',
                    // 将请求过来的url信息里的 请求前缀  格式化去除掉
                    pathRewrite:{'^/demo':''},
                    // ws:true,  //用于支持 websocket
                    // chageOrigin:true  // 用于控制请求头中的host值
                  }
      }
   },
   transpileDependencies: true,
   lintOnSave:false, /*关闭语法检查*/


})


4.main.js

//引入Vue
import Vue from 'vue'
//引入App
import App from './App.vue'

// 引入 vue插件: vue-recource
import vueResource from 'vue-resource'

//关闭Vue生产提示
Vue.config.productionTip=false;

// 使用插件
Vue.use(vueResource);

// 创建Vm
const vm = new Vue(  {
        el:'#app',
        render: (h) => h(App),
        //添加全局事件总线对象
        beforeCreate(){
             Vue.prototype.$bus=this;
        }
   });


5.Count.vue

<template>
  <div  >
      <h1>当前求和为:{{ sum }}</h1>
      <select v-model.number="number">
          <option  :value="1">1</option>
          <option  :value="2">2</option>
          <option  :value="3">3</option>
      </select>
      <button  @click="increment">+</button>
      <button  @click="decrement">-</button>
      <button  @click="incrementOdd">当前求和为奇数再加</button>
      <button  @click="incrementWait">等一等再加</button>
  </div>
</template>

<script> export default { /* 组件名 */ name: 'Count', /* mixin(混入) */ mixins: [], /* 配置声明子组件 */ components: { }, /* 组件间数据、方法传值接收区 */ props: [ ], /* 数据对象:数据赋值声明 */ data () { return { sum:0,//当前的和 number:1//用户选择的数字 } }, /* 计算属性:计算区 */ computed: { }, /* 检测区 */ watch: { }, /* */ created () { }, /* 挂载区 */ mounted () { }, /* 方法区 */ methods: { increment(){ this.sum +=this.number; }, decrement(){ this.sum -=this.number; }, incrementOdd(){ if(this.sum % 2){ this.sum += this.number; } }, incrementWait(){ setTimeout(() =>{ this.sum +=this.number; },500); }, } } </script>


<style  lang="css" scoped>
 button{
   margin-left:30px;
 }

</style>

6.代码界面

image









五:VueX 工作 原理


image

image



实现步骤

image


六:vuex 使用配置步骤


1:安装vuex环境

imageimage

image



2:引入Vuex组件,创建state组件:


npm i  -g vue@3

 注释:@3是版本号,vue2用vuex@3版本,vue3用4版本





image

image

image

image


image


3:简单的vuex 求和案例



image

image


3.1 main,js

//引入Vue
import Vue from 'vue'
//引入App
import App from './App.vue'

// 引入 vue插件: vue-recource
import vueResource from 'vue-resource'
// 引入 Vuex 
import Vuex from 'vuex'
// 引入 Store 对象
import store from './store/index'


//关闭Vue生产提示
Vue.config.productionTip=false;

// 使用插件
Vue.use(vueResource);
Vue.use(Vuex);

// 创建Vm
 new Vue(  {
        el:'#app',
        render: (h) => h(App),
       /*  store:store, // 完整编写方式 */
         store, //简写方式
        //添加全局事件总线对象
        beforeCreate(){
             Vue.prototype.$bus=this;
        }
   });


3.2 vue.comfig.js

const { defineConfig } = require('@vue/cli-service')
module.exports = defineConfig({
  pages:{
    index:{
      // 入口
      entry:'src/main.js',
    },
  },
  //配置vue脚手架的代理服务器:开启代理服务器  此处代理服务器默认与 该脚手架启动的模拟的前端服务器 端口相同:8080
  // 方式一
  /*
   devServer:{
     proxy:'http://localhost:5000/'
  },
 */
  // 方式二 
   devServer:{
      proxy:{
           //  '/api': 请求前缀 
          '/api':{
                    target:'http://localhost:5000/',
                    // 将请求过来的url信息里的 请求前缀  格式化去除掉
                    pathRewrite:{'^/api':''},
                    // ws:true,  //用于支持 websocket
                    // chageOrigin:true  // 用于控制请求头中的host值
                  } ,
           //  '/api': 请求前缀 
          '/demo':{
                    target:'http://localhost:5001/',
                    // 将请求过来的url信息里的 请求前缀  格式化去除掉
                    pathRewrite:{'^/demo':''},
                    // ws:true,  //用于支持 websocket
                    // chageOrigin:true  // 用于控制请求头中的host值
                  }
      }
   },
   transpileDependencies: true,
   lintOnSave:false, /*关闭语法检查*/


})



3.3 App.vue


<template>
  <div  >
      <Count />
</div>
</template>

<script>
import Count from './components/Count.vue'


export default {
  /* 组件名 */
  name: 'App',
  /* mixin(混入)  */
  mixins: [],
  /* 配置声明子组件  */
  components: {Count},
  /* 组件间数据、方法传值接收区  */
  props: [],
  /* 数据对象:数据赋值声明  */
  data() {
    return {

    }
  },
  /* 计算属性:计算区  */
  computed: {},
  /* 检测区  */
  watch: {},
  /*   */
  created() { },
  /*  挂载区 */
  mounted() {
    console.log('App',this)

   },
  /*  方法区 */
  methods: {

  }
}
</script>



<style scoped lang="css">
    .container,.foot{
      display:flex;/* div 浮动 */
      justify-content: space-around; /* 主轴对齐 */
    }
    img{
      width:100%;
    }
    h4{
      text-align:center;
    }
    video{
       width:100%;
    }
</style>


3.4 index.js


//该文件用于创建Vuex中最为核心的store
//引入vue
import Vue from "vue";

//引入Vuex组件
import Vuex from  'vuex'

Vue.use(Vuex)
//准备actions--用于相应组件中的动作
const actions= {
    /* incrementStoreActions:function(){  }   //原写方式:*/

    //简写方式:加
    incrementOddStoreActions(storeContextMiniFunctions,values){
        if(storeContextMiniFunctions.state.sum % 2 ){
            storeContextMiniFunctions.commit('incrementStore',values);
        }
    },
    //简写方式:加
    incrementWaitStoreActions(storeContextMiniFunctions,values){
        setTimeout(()=>{
            storeContextMiniFunctions.commit('incrementStore',values);
        },500);
    },

} ;

//准备mutations--用于操作数据:state
const mutations= {
    //新增
    incrementStore(stateObject,values){
        stateObject.sum += values;  //赋值
    },
    //减
    decrementStore(stateObject,values){
        stateObject.sum -= values;  //赋值
    },



} ;

//准备 state--用于储存数据
const state = {
    sum:0,//当前的和
} ;
//创建 store  并导出 store
export default new Vuex.Store({
    //简写
    actions,
    mutations,
    state
});


3.5 Count.vue


<template>
  <div  >
      <h1>当前求和为:{{ $store.state.sum }}</h1>
      <select v-model.number="number">
          <option  :value="1">1</option>
          <option  :value="2">2</option>
          <option  :value="3">3</option>
      </select>
      <button  @click="increment">+</button>
      <button  @click="decrement">-</button>
      <button  @click="incrementOdd">当前求和为奇数再加</button>
      <button  @click="incrementWait">等一等再加</button>
  </div>
</template>




<script>
export default {
/* 组件名 */
  name: 'Count',
/* mixin(混入)  */
  mixins: [],
/* 配置声明子组件  */
  components: {

  },
/* 组件间数据、方法传值接收区  */
  props: [

  ],
/* 数据对象:数据赋值声明  */
  data () {
    return {
       number:1//用户选择的数字
    }
  },
/* 计算属性:计算区  */
  computed: {

  },
/* 检测区  */
  watch: {

  },
/*   */
  created () {

  },
/*  挂载区 */
  mounted () {
    console.log('Count',this)
  },
/*  方法区 */
  methods: {
      increment(){
         this.$store.commit('incrementStore',this.number);
      },
      decrement(){
        this.$store.commit('decrementStore',this.number);
      },
      incrementOdd(){
            this.$store.dispatch('incrementOddStoreActions',this.number);
      },
      incrementWait(){
            this.$store.dispatch('incrementWaitStoreActions',this.number);
      },
  }
}
</script>
<style  lang="css" scoped>
 button{
   margin-left:30px;
 }

</style>



4:求和案例_getters_mapState_mapGetters

4.1:界面效果图

image

image


4.1:main.js

//引入Vue
import Vue from 'vue'
//引入App
import App from './App.vue'

// 引入 vue插件: vue-recource
import vueResource from 'vue-resource'
// 引入 Vuex 
import Vuex from 'vuex'
// 引入 Store 对象
import store from './store/index'


//关闭Vue生产提示
Vue.config.productionTip=false;

// 使用插件
Vue.use(vueResource);
Vue.use(Vuex);

// 创建Vm
 new Vue(  {
        el:'#app',
        render: (h) => h(App),
       /*  store:store, // 完整编写方式 */
         store, //简写方式
        //添加全局事件总线对象
        beforeCreate(){
             Vue.prototype.$bus=this;
        }
   });

4.3:vue.config.js

const { defineConfig } = require('@vue/cli-service')
module.exports = defineConfig({
  pages:{
    index:{
      // 入口
      entry:'src/main.js',
    },
  },
  //配置vue脚手架的代理服务器:开启代理服务器  此处代理服务器默认与 该脚手架启动的模拟的前端服务器 端口相同:8080
  // 方式一
  /*
   devServer:{
     proxy:'http://localhost:5000/'
  },
 */
  // 方式二 
   devServer:{
      proxy:{
           //  '/api': 请求前缀 
          '/api':{
                    target:'http://localhost:5000/',
                    // 将请求过来的url信息里的 请求前缀  格式化去除掉
                    pathRewrite:{'^/api':''},
                    // ws:true,  //用于支持 websocket
                    // chageOrigin:true  // 用于控制请求头中的host值
                  } ,
           //  '/api': 请求前缀 
          '/demo':{
                    target:'http://localhost:5001/',
                    // 将请求过来的url信息里的 请求前缀  格式化去除掉
                    pathRewrite:{'^/demo':''},
                    // ws:true,  //用于支持 websocket
                    // chageOrigin:true  // 用于控制请求头中的host值
                  }
      }
   },
   transpileDependencies: true,
   lintOnSave:false, /*关闭语法检查*/


})

module.exports = {
  devServer: {
    disableHostCheck: true
  }
}

4.4:App.vue

<template> <div > <Count /> </div> </template>

<script>
import Count from './components/Count.vue'


export default {
  /* 组件名 */
  name: 'App',
  /* mixin(混入)  */
  mixins: [],
  /* 配置声明子组件  */
  components: {Count},
  /* 组件间数据、方法传值接收区  */
  props: [],
  /* 数据对象:数据赋值声明  */
  data() {
    return {

    }
  },
  /* 计算属性:计算区  */
  computed: {},
  /* 检测区  */
  watch: {},
  /*   */
  created() { },
  /*  挂载区 */
  mounted() {
    console.log('App',this)

   },
  /*  方法区 */
  methods: {

  }
}
</script>

<style scoped lang="css">
    .container,.foot{
      display:flex;/* div 浮动 */
      justify-content: space-around; /* 主轴对齐 */
    }
    img{
      width:100%;
    }
    h4{
      text-align:center;
    }
    video{
       width:100%;
    }
</style>



4.5:  Count.vue

<template> <div > <hr/> <select v-model.number="number"> <option :value="1">1</option> <option :value="2">2</option> <option :value="3">3</option> </select> <button @click="increment">+</button> <button @click="decrement">-</button> <button @click="incrementOdd">当前求和为奇数再加</button> <button @click="incrementWait">等一等再加</button> <hr/> <span>插值方式实现</span><!-- 直接计算方式:--> <h1>当前求和为:{{sumFunction }}</h1> <h1>当前求和为:{{sum }}</h1> <h1>当前求和为:{{sumByMapState }}</h1> <hr/> <span>插值方式实现</span><!-- 直接计算方式:--> <h1>当前求和放大10倍为:{{ $store.state.sum*10 }}</h1> <hr/> <span>计算属性实现方式</span><!-- 计算属性实现方式 --> <h1>当前求和放大10倍为:{{tenSum }}</h1> <hr/> <span>Vuex Getters 实现方式</span><!-- Vuex Getters 实现方式 --> <h1>当前求和放大10倍为:{{SumToTenFunction }}</h1> <h1>当前求和放大10倍为:{{SumToTen }}</h1> <h1>当前求和放大10倍为:{{SumToTenByMapGetters }}</h1> <hr/> <span>Vuex Getters 实现方式</span><!-- Vuex Getters 实现方式 --> <h1> {{titileFunction }}课程有:例如--》 {{subTitleFunction }} </h1> <h1> {{Title }}课程有:例如--》 {{subTitle }} </h1> <h1> {{titileByMapState }}课程有:例如--》 {{subTitleByMapState }} </h1> <hr/> </div> </template>

<script>
//引入Vuex 的 mapState 对象
import {mapState, mapGetters} from 'vuex';

export default {
/* 组件名 */
  name: 'Count',
/* mixin(混入)  */
  mixins: [],
/* 配置声明子组件  */
  components: {

  },
/* 组件间数据、方法传值接收区  */
  props: [

  ],
/* 数据对象:数据赋值声明  */
  data () {
    return {
       number:1//用户选择的数字
    }
  },
/* 计算属性:计算区  */
  computed: {
    //调用mapState 方法生成计算属性,从state中读取数据。(对象写法)
    ...mapState({sumByMapState:'sum',titileByMapState:'Title',subTitleByMapState:'subTitle'}),
    //调用mapState 方法生成计算属性,从state中读取数据。(数组写法)
    ...mapState(['sum','Title','subTitle']),
    //靠程序员自己亲自去写计算属性
    tenSum(){
        return this.$store.state.sum*10;
      },
      sumFunction(){
        return  this. $store.state.sum;
      },
      titileFunction(){
        return  this.$store.state.Title ;
      },
      subTitleFunction(){
        return this.$store.state.subTitle;
      },

      /* ************************************************************************************************************************************************************************************************************************************************************** */
      SumToTenFunction(){
       return this.$store.getters.SumToTen;
      },
       //调用 mapGetters 方法生成计算属性,从getters中读取数据。(对象写法)
    ...mapGetters({SumToTenByMapGetters:'SumToTen'}),
    //调用 mapGetmapGetters 方法生成计算属性,从getters中读取数据。(数组写法)
    ...mapGetters(['SumToTen']),
  },
/* 检测区  */
  watch: {

  },
/*   */
  created () {

  },
/*  挂载区 */
  mounted () {
    console.log('Count',this)
    const x= mapState({sumByMapState:'sum',titileByMapState:'Title',subTitleByMapState:'subTitle'});
    console.log('Count',x)
  },
/*  方法区 */
  methods: {
      increment(){
         this.$store.commit('incrementStore',this.number);
      },
      decrement(){
        this.$store.commit('decrementStore',this.number);
      },
      incrementOdd(){
            this.$store.dispatch('incrementOddStoreActions',this.number);
      },
      incrementWait(){
            this.$store.dispatch('incrementWaitStoreActions',this.number);
      },
  }
}
</script>
<style  lang="css" scoped>
 button{
   margin-left:30px;
 }

</style>


4.6:index.js

//该文件用于创建Vuex中最为核心的store
//引入vue
import Vue from "vue";

//引入Vuex组件
import Vuex from  'vuex'

Vue.use(Vuex)
//准备actions--用于相应组件中的动作
const actions= {
    /* incrementStoreActions:function(){  }   //原写方式:*/

    //简写方式:加
    incrementOddStoreActions(storeContextMiniFunctions,values){
        if(storeContextMiniFunctions.state.sum % 2 ){
            storeContextMiniFunctions.commit('incrementStore',values);
        }
    },
    //简写方式:加
    incrementWaitStoreActions(storeContextMiniFunctions,values){
        setTimeout(()=>{
            storeContextMiniFunctions.commit('incrementStore',values);
        },500);
    },

} ;

//准备mutations--用于操作数据:state
const mutations= {
    //新增
    incrementStore(stateObject,values){
        stateObject.sum += values;  //赋值
    },
    //减
    decrementStore(stateObject,values){
        stateObject.sum -= values;  //赋值
    },



} ;

//准备 state--用于储存数据
const state = {
    sum:0,//当前的和
    Title:"前端学习:",
    subTitle:"Vuex",
} ;
//准备getters 用于state中的数据进行加工
const getters={
    SumToTen(state){
        return state.sum*10; //大十倍数
    },
};

//创建 store  并导出 store
export default new Vuex.Store({
    //简写
    actions,
    mutations,
    state,
    getters
});








5:求和案例_mapMutations_mapActions

5.1:界面效果图

image

5.2image



5.2:vue.config.js


const { defineConfig } = require('@vue/cli-service')
module.exports = defineConfig({
  pages:{
    index:{
      // 入口
      entry:'src/main.js',
    },
  },
  //配置vue脚手架的代理服务器:开启代理服务器  此处代理服务器默认与 该脚手架启动的模拟的前端服务器 端口相同:8080
  // 方式一
  /*
   devServer:{
     proxy:'http://localhost:5000/'
  },
 */
  // 方式二 
   devServer:{
      proxy:{
           //  '/api': 请求前缀 
          '/api':{
                    target:'http://localhost:5000/',
                    // 将请求过来的url信息里的 请求前缀  格式化去除掉
                    pathRewrite:{'^/api':''},
                    // ws:true,  //用于支持 websocket
                    // chageOrigin:true  // 用于控制请求头中的host值
                  } ,
           //  '/api': 请求前缀 
          '/demo':{
                    target:'http://localhost:5001/',
                    // 将请求过来的url信息里的 请求前缀  格式化去除掉
                    pathRewrite:{'^/demo':''},
                    // ws:true,  //用于支持 websocket
                    // chageOrigin:true  // 用于控制请求头中的host值
                  }
      }
   },
   transpileDependencies: true,
   lintOnSave:false, /*关闭语法检查*/


})

module.exports = {
  devServer: {
    disableHostCheck: true
  }
}


5.3:main.js


//引入Vue
import Vue from 'vue'
//引入App
import App from './App.vue'

// 引入 vue插件: vue-recource
import vueResource from 'vue-resource'
// 引入 Vuex 
import Vuex from 'vuex'
// 引入 Store 对象
import store from './store/index'


//关闭Vue生产提示
Vue.config.productionTip=false;

// 使用插件
Vue.use(vueResource);
Vue.use(Vuex);

// 创建Vm
 new Vue(  {
        el:'#app',
        render: (h) => h(App),
       /*  store:store, // 完整编写方式 */
         store, //简写方式
        //添加全局事件总线对象
        beforeCreate(){
             Vue.prototype.$bus=this;
        }
   });



5.4 App.vue

<template>
  <div  >
      <Count />
</div>
</template>

<script>
import Count from './components/Count.vue'


export default {
  /* 组件名 */
  name: 'App',
  /* mixin(混入)  */
  mixins: [],
  /* 配置声明子组件  */
  components: {Count},
  /* 组件间数据、方法传值接收区  */
  props: [],
  /* 数据对象:数据赋值声明  */
  data() {
    return {

    }
  },
  /* 计算属性:计算区  */
  computed: {},
  /* 检测区  */
  watch: {},
  /*   */
  created() { },
  /*  挂载区 */
  mounted() {
    console.log('App',this)

   },
  /*  方法区 */
  methods: {

  }
}
</script>



<style scoped lang="css">
    .container,.foot{
      display:flex;/* div 浮动 */
      justify-content: space-around; /* 主轴对齐 */
    }
    img{
      width:100%;
    }
    h4{
      text-align:center;
    }
    video{
       width:100%;
    }
</style>



5.5:Count.vue


<template>
  <div  >
    <hr/>
    <select v-model.number="number">
          <option  :value="1">1</option>
          <option  :value="2">2</option>
          <option  :value="3">3</option>
      </select>
      <button  @click="increment(number)">+</button>
      <button  @click="decrement(number)">-</button>
      <button  @click="incrementOdd(number)">当前求和为奇数再加</button>
      <button  @click="incrementWait(number)">等一等再加</button>
      <hr/>
      <span>插值方式实现</span><!-- 直接计算方式:-->
      <h1>当前求和为:{{sum }}</h1>
      <h1>当前求和为:{{sumByMapState }}</h1>
      <hr/>
      <span>插值方式实现</span><!-- 直接计算方式:-->
      <h1>当前求和放大10倍为:{{ $store.state.sum*10 }}</h1>
      <hr/>
      <span>计算属性实现方式</span><!-- 计算属性实现方式 -->
      <h1>当前求和放大10倍为:{{tenSum }}</h1>
      <hr/>
      <span>Vuex Getters 实现方式</span><!-- Vuex Getters 实现方式 -->
      <h1>当前求和放大10倍为:{{SumToTen }}</h1>
      <h1>当前求和放大10倍为:{{SumToTenByMapGetters }}</h1>
      <hr/>
      <span>Vuex Getters 实现方式</span><!-- Vuex Getters 实现方式 -->
      <h1> {{Title }}课程有:例如--》 {{subTitle }} </h1>
      <h1> {{titileByMapState }}课程有:例如--》 {{subTitleByMapState }} </h1>
      <hr/>

  </div>
</template>

<script>
//引入Vuex 的 mapState 对象
import {mapState, mapGetters,mapMutations,mapActions} from 'vuex';

export default {
/* 组件名 */
  name: 'Count',
/* mixin(混入)  */
  mixins: [],
/* 配置声明子组件  */
  components: {

  },
/* 组件间数据、方法传值接收区  */
  props: [

  ],
/* 数据对象:数据赋值声明  */
  data () {
    return {
       number:1//用户选择的数字
    }
  },
/* 计算属性:计算区  */
  computed: {
    //调用mapState 方法生成计算属性,从state中读取数据。(对象写法)
    ...mapState({sumByMapState:'sum',titileByMapState:'Title',subTitleByMapState:'subTitle'}),
    //调用mapState 方法生成计算属性,从state中读取数据。(数组写法)
    ...mapState(['sum','Title','subTitle']),
    //靠程序员自己亲自去写计算属性
    tenSum(){
        return this.$store.state.sum*10;
      },
      /* ************************************************************************************************************************************************************************************************************************************************************** */
       //调用 mapGetters 方法生成计算属性,从getters中读取数据。(对象写法)
    ...mapGetters({SumToTenByMapGetters:'SumToTen'}),
    //调用 mapGetmapGetters 方法生成计算属性,从getters中读取数据。(数组写法)
    ...mapGetters(['SumToTen']),
  },
/* 检测区  */
  watch: {

  },
/*   */
  created () {

  },
/*  挂载区 */
  mounted () {
    console.log('Count',this)
  },
/*  方法区 */
  methods: {
    //借助 mapMutations 生成对应的方法,方法中会调用commit 去联系mutations(对象写法)
    ...mapMutations({increment:'incrementStore',decrement:'decrementStore'}),
   /*
      //靠程序员自己亲自去写计算属性
      increment(){
         this.$store.commit('incrementStore',this.number);
      },
      decrement(){
        this.$store.commit('decrementStore',this.number);
      }, */

      /* ********************************************************************** */
      //借助 mapActions 生成对应的方法,方法中会调用commit 去联系 mapActions(对象写法)
    ...mapActions({incrementOdd:'incrementOddStoreActions',incrementWait:'incrementWaitStoreActions'}),
    /*
        //靠程序员自己亲自去写计算属性
        incrementOdd(){
              this.$store.dispatch('incrementOddStoreActions',this.number);
        },
        incrementWait(){
              this.$store.dispatch('incrementWaitStoreActions',this.number);
        },
      */
  }
}
</script>


<style  lang="css" scoped>
 button{
   margin-left:30px;
 }

</style>


5.6:index.js


//该文件用于创建Vuex中最为核心的store
//引入vue
import Vue from "vue";

//引入Vuex组件
import Vuex from  'vuex'

Vue.use(Vuex)
//准备actions--用于相应组件中的动作
const actions= {
    /* incrementStoreActions:function(){  }   //原写方式:*/

    //简写方式:加
    incrementOddStoreActions(storeContextMiniFunctions,values){
        if(storeContextMiniFunctions.state.sum % 2 ){
            storeContextMiniFunctions.commit('incrementStore',values);
        }
    },
    //简写方式:加
    incrementWaitStoreActions(storeContextMiniFunctions,values){
        setTimeout(()=>{
            storeContextMiniFunctions.commit('incrementStore',values);
        },500);
    },

} ;

//准备mutations--用于操作数据:state
const mutations= {
    //新增
    incrementStore(stateObject,values){
        stateObject.sum += values;  //赋值
    },
    //减
    decrementStore(stateObject,values){
        stateObject.sum -= values;  //赋值
    },



} ;

//准备 state--用于储存数据
const state = {
    sum:0,//当前的和
    Title:"前端学习:",
    subTitle:"Vuex",
} ;
//准备getters 用于state中的数据进行加工
const getters={
    SumToTen(state){
        return state.sum*10; //大十倍数
    },
};

//创建 store  并导出 store
export default new Vuex.Store({
    //简写
    actions,
    mutations,
    state,
    getters
});
























posted @ 2023-03-21 23:53  一品堂.技术学习笔记  阅读(34)  评论(0编辑  收藏  举报