【SPA项目的Vuex】

前言

本章我们是要以了解Vuex模块的一个组成来进行的,并且能掌握Vuex下的结构以及用法。

但是其实是对之前的代码做一个优化。


Vuex的概念

说到底就是优化,优化什么呢 ,

一,父子之间的传值

在我们刚开始接触的时候我们是了解了子父之间的传值。

可以了解一下【Vue模板语法下】

二,总线传值
接下来就是一个总线传值的概念
在这里插入图片描述

三,Vuex的使用
在这里插入图片描述
所以我们可以看的出Vuex的性能非常好,总线传值有很大的缺陷存在,所以我们本章才会讲解Vuex这个版块。


搭建Vuex的模块

一,下载Vuex模块

还是一样安装:npm install vuex -S

二,创建对应文件
在这里插入图片描述
需要往里面添加代码的文件:index.js, 其他的根据需要填写

index.js

import Vue from 'vue'
import Vuex from 'vuex'
import state from './state'
import getters from './getters'
import actions from './actions'
import mutations from './mutations'

Vue.use(Vuex)

const store = new Vuex.Store({
 	state,
 	getters,
 	actions,
 	mutations
 })

 export default store

其他的暂时为:

export default{

}

三,挂载到vue实列上
在这里插入图片描述

只要挂载成功了,就代表可以使用Vuex了。


测试

我们先用一个自己搭建的一个测试,VuexPage1.vue
在这里插入图片描述

因为测试的范围比较广,所以就分开测试。


state获取变量两种方法(一个无监听,一个监听)

首先我们先在state里面放入一个变量

export default{
  resturantName:'五星餐馆',
  uname:'张飞'
}

一,用钩子函数给变量赋值

假设我们的html代码为下面所写的。

<template>
  <div>
    <h3 style="margin: 60px;">第一个vuex界面title内容为:{{title}}</h3>
  </div>
</template>

我们在开始的时候就给它定义一个title变量
而且在初始化,也就是钩子函数启动的时候给他从state里面获取到值然后赋值给title

<script>
  export default{
    data() {
      return {
        title:''
      }
    },
    created(){
        //1,直接通过访问state库里面的变量来获取变量值.
         this.title  = this.$store.state.resturantName;
        //2,通过引用getters里面写好的get方法来返回变量。
        // this.title = this.$store.getters.getResturantName;
    }


  }
</script>

当然获取值是有两种方法的:
第一种:直接访问state库获取:this.$store.state.resturantName;
第二种:通过使用getters里面的方法获取:this.$store.getters.getResturantName

那么就看看getters里面的方法又是怎么定义的

export default{
  getResturantName:(state)=>{
    return "这是通过getters方法获取到的数:"+state.resturantName;
  }
}
参数说明
state相对于state库本身

在这里插入图片描述


二,通过具有监听属性的计算方法获取

获取的方式一样,只不过获取后的赋值不一样

假设我们的html代码为下面所写的。

<template>
  <div>
    <h3 style="margin: 60px;">第二个vuex界面title内容为:{{title}}</h3>
  </div>
</template>

就是下面这样,只不过用到的title不再是一个变量,而是一个计算属性
因为只有这个计算属性才能监听,
至于为什么要监听,下面修改的时候就会讲到了

<script>
  export default {
    data() {
      return {

      }
    },
    computed: {
      title() {
        //1,直接通过访问state库里面的变量来获取变量值.
        // return this.$store.state.resturantName;
        //2,通过引用getters里面写好的get方法来返回变量。
        return this.$store.getters.getResturantName;
      }
    }

  }
</script>

获取值方式可以参照上面。

效果图其实也没什么看的:
在这里插入图片描述


state修改变量对有无监听是否有关系

如题,为什么要特意的拿出一个监听的,一个不是监听的呢?

因为这样可以做一个比较,

道理就是,在你需要用到要改变变量的时候,请使用可监听的

第一种:(监听) 在你修改变量值后,仍然可以改变html上面的页面,就是页面上的值会变。
第二种:(不监听) 因为是刚开始的时候,函数赋予的值,可是一改变state库里面的值,也不会改变页面

就会如下:点击无效
在这里插入图片描述


state修改变量值(一个同步,一个异步)

因为同步和异步可以演示,所以就使用一个页面来进行讲解。

如题,下面的html代码如下

<template>
  <div>
    <h3 style="margin: 60px;">第二个vuex界面title内容为:{{title}}</h3>
    <button @click="change">改变title值为四星餐馆</button>
    <button @click="changeAsync">四个月后改变为四星餐馆</button>
    <button @click="doAjax">doAjax</button>
  </div>
</template>

那么,可以看到下面我定义了三个方法,

change (同步方法调用),
changeAsync(异步方法调用),
doAjax (Ajax调用)

<script>
  export default {
    data() {
      return {

      }
    },
    computed: {
      title() {
        //1,直接通过访问state库里面的变量来获取变量值.
        // return this.$store.state.resturantName;
        //2,通过引用getters里面写好的get方法来返回变量。
        return this.$store.getters.getResturantName;
      }
    },
    methods: {

      change() { //用同步方法调用(mutation)
        this.$store.commit('setResturantName', {
          resturantName: '用mutations改变的四星餐馆'
        })
      },
      changeAsync() { //用异步方法调用(actions)
        this.$store.dispatch('setResturantNameByAsync', {
          resturantName: '用actios改变的四星餐馆'
        })
      },
      doAjax() {
        this.$store.dispatch('doAjax', {
          _this: this
        })

      }

    }

  }
</script>

第一种:change :
在使用的调用的方法为:
this.$store.commit('setResturantName', { resturantName: '四星餐馆' })

那么我们先简单查看一下mutations里面是怎么写的

export default{
  setResturantName:(state, payload)=>{
    state.resturantName = payload.resturantName;
  }
}

参数说明
state相对于state库本身
payload参数集合

不过说起来,调用的方法是两个参数,一个是填入调用方法名,一个是填入参数集合

其实没必要去纠结,这应该是内置函数而已。commit


第二种:changeAsync :
在使用的调用的方法为:
this.$store.dispatch('setResturantNameByAsync', { resturantName: '四星餐馆' })

那么我们先简单查看一下actions里面是怎么写的

export default{
  setResturantNameByAsync:(state,payload)=>{
    console.log("aaa");
    setTimeout(()=>{
      console.log("bbb");
      state.commit('setResturantName',payload);
      // state.resturantName = payload.resturantName;//这个是没办法将state容器里面的值改变的
    },3000);
    console.log("ccc");
  }

}


参数说明
state相对于全体Vuex本身!!!
payload参数集合

注意只要在actions里面,第一个参数就是代表其他的所有,名字是可以随便的


第三种:doAjax :
在使用的调用的方法为:
this.$store.dispatch('doAjax', { _this: this })

值得一提的是我们这次传的值不再是单纯的字符串,而是一个this,这代表着我们可以使用VuexPage2.vue里面的axiox这个模块

那么我们先简单查看一下actions里面是怎么写的

export default{

  doAjax: (context, payload) => {
		let _this = payload._this
		let url = _this.axios.urls.SYSTEM_USER_DOLOGIN;
		_this.axios.post(url, {}).then((response)=> {
			console.log(response);
		}).catch(function(error) {
			console.log(error);
		});
	}

}

有了这个模块我们也就可以用到axios了

参数说明
context相对于全体Vuex本身!!!
payload参数集合

注意只要在actions里面,第一个参数就是代表其他的所有,名字是可以随便的

效果图:
在这里插入图片描述
在这里插入图片描述


总结

大部分的内容详细都在上面了,其实异步方法是用来进一步优化的,一般情况下mutaions里面的同步方法就已经够用了。

Thanks♪(・ω・)ノ希望对大家有所帮助

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值