vueX总结

Posted 奥特曼 

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了vueX总结相关的知识,希望对你有一定的参考价值。

目录

1.什么是vuex

          使用场景: 例如更换头像

2.安装vuex

3.学习vuex的五类

         (1)state 定义公共数据

(2)mutations

demo 

在组件中调用

         修改时携带参数

(3)getters派生状态

         调用getters

(4) actions 发送异步请求 

         (5) modules

4. vuex辅助函数

1. mapState

2.mapGetters 

3.mapMutation

4.mapAction


1.什么是vuex

我们除了父传子和子传父之间的通信方便些,但是也有可能出现兄弟关系等没有直接关系的组件,vuex就可以用来解决组件之间的通信。

vuex官方定义:应用程序开发的状态管理模式 

使用场景: 例如更换头像

我们更换头像后 资料左侧和顶部的头像也要随时更新,这时候除了父子之间传递的关系 我们就可以用vuex来解决

2.安装vuex

两种情况

1. 我们创建vue-cli的时候如果没有自定义安装vuex 就需要自己手动安装

1.安装vuex     npm i vuex

2. 配置 

  1.  在src目录 创建store文件夹  创建index.js 方便直接引入/store
  2.  导入一个vuex 实例对象
  3. 在main.js入口文件中 引入 vuex组件并使用
//store/index.js
import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex) // 当做插件使
// 默认导出一个对象
export default new Vuex.Store({
})
//main.js
import store from './store'

new Vue({
  store,
  render: h => h(App)
}).$mount('#app')

2. 在新新项目中配置vue-cli 我们可以自定义安装 可以勾选 vuex

3.学习vuex的五类

(1)state 定义公共数据

state类似于vue里的data   并且是响应式的  用来保存公共的数据

就像 超市里有仓库管理员一样,所有的商品都是数量随时更新的,随时都有买货进货的数量,我们引入数据也一样 在state里定义的数据改变 其他引入的数据都会发生改变

export default new Vuex.Store({
  state:{
   name: '奥特曼',
   num:1,
})

我们定义了数据 肯定要在 组件中使用  这些是直接定义在全局上的  所以任何组件都可以使用

//组件中获取
this.$store.state.name
// 模板中 this省略
<p>{{$store.state.name}}</p>

(2)mutations

用来修改state里面 数据   第一个参数代表当前的state  (参数写什么都行,只不过通常写state)

语法:

new Vue.store({
  // 省略其他...
  mutations:{
  	mutation名1:function(state [, 载荷]) {
  
    },
    mutation名2:function(state [, 载荷]) {
  
    },
	}
})

demo 

new Vue.store({
   state:{
   num:1,
}
  mutations:{
    add:function(state) {
    state.num++
        }
	}
})

在组件中调用

methods:{
     add(){
  this.$store.commit('add')
}
}

修改时携带参数

new Vue.store({
   state:{
   num:1,
}
  mutations:{
    add:function(state,step) {
    state.num+=step
        }
	}
})
methods:{
     add(){
  this.$store.commit('add',5)
//第一个参数就是定义的mutation名 
//第二个参数就是要传过去的参数 只能传一个 如果多个则取不到,如果非要传过个用数组
}
}

(3)getters派生状态

与vue中的computed计算属性一样,通过自动计算得到新的数据

语法:

new Vuex.store({
  getters: {
    getter的名字1: function(state) {
      return 要返回的值
    }
  }
})

demo 

export default new Vuex.Store({
  state: {
    list: [1,5,8,6,8,7,8],
  },
 getters:{
   getName(state){
    // 箭头函数不写{ } return 可以省略
  return state.list.reduce((sum,item)=>(sum+=item),0)
   }
}

调用getters

模板

  {{ $store.getters.sum }}
  $store.getters['模块名/getters名']

普通发送axios流程图

(4) actions 发送异步请求 

export default new Vuex.Store({
 state: {
    list: [1, 5, 8, 9, 8, 7],
    msg: []
  },
  mutations: {
    getMsg (state, msg) {
      state.msg = msg
    }
  },
 actions: {  
    getList (context) {     //context是$store的实例对象
      axios({
        url: 'https://www.fastmock.site/mock/37d3b9f13a48d528a9339fbed1b81bd5/book/api/books'
      }).then(res =>
        //发送异步请求 回来的数据 去钓鱼 mutations来保存数据 
        context.commit('getMsg', res.data.data)
      )
    }
  },


}

好处: 1.组件可复用  2.在vue文件中调用的逻辑更加清晰简单

调用actions    this.$store.dispatch('actions名', 实参)

                     `this.$store.dispatch('模块名/action名', 参数)`

  (5) modules

上面写了很多代码也定义了很多 如果都写在一起 代码会很乱

用modules来划分模块 

export default new Vuex.Store({
  // state: 用来保存所有的公共数据
  state: {},
  getters: {},
  mutations: {},
  actions: {},
  modules: {
  	模块名1: {
    		// 这个为true,则在使用mutations时,就必须要加上模块名
            //  namespaced翻译 命名空间
      	namespaced: true, 
  		  state: {},
  			getters: {},
  			mutations: {},
  			actions: {},
  			modules: {}
  	},
    模块名2: {
  		  state: {},
  			getters: {},
  			mutations: {},
  			actions: {},
         modules: {}
  	}  
  }
})

获取小vuex数据里面的内容 

$store.state.模块名.数据名

如果在模块中加入了namespaced 命名空间 并且为true 获取getters时 

获取getters: {{$store.getters['模块名/getters名']}}   
 {{ $store.getters["getMsg/getMath"] }}

4. vuex辅助函数

我们每次 访问获取数据 一直在一层一层的取翻 很麻烦  可以利用mapState 映射到计算属性

每个 state mutations getters actions 都有对应的mapState、 mapTations、mapGetters、mapActions 在访问之前 先列出在那个钩子函数或方法中使用

state:{  }  —————— computed:{ ...mapState()  }

getters:{ } —————— computed{ ...mapGetters() }

mutations:{ }——————methods:{ ...mapMutations() }

actions:{ }——————methods{ ...mapActions()  }

1. mapState

<template>
  <div>
    <p>使用map</p>
    <h2>mapState: {{ str }} {{ gender }}</h2>
  </div>
</template>

<script>
import { mapState } from 'vuex'
export default {
  computed: {
    // 取全局
    // ...mapState(['name']),
    // 解决冲突
    ...mapState({ str: 'name' }),

    // 取modules里的数据  模块名  数据名
    // ...mapState('getMsg', ['sex'])
    // 如果 sex和当前页面中有冲突
    ...mapState('getMsg', { gender: 'sex' })
  }
}
</script>

2.mapGetters 

<template>
  <div>
    <p>使用map</p>
    <h2>mapState: {{ str }} {{ gender }}</h2>
  </div>
</template>

<script>
import { mapState } from 'vuex'
export default {
  computed: {
    // getters
    // 全局
    // ...mapGetters(['sum'])
    // 解决冲突
    ...mapGetters({ add: 'sum' }),
    // modules
    ...mapGetters('getMsg', ['getMath'])
  }
}
</script>

3.mapMutation

 methods: {
    // 全局 mutations
    ...mapMutations(['getName']),
    // modules
    ...mapMutations('getMsg', ['setSex']),
    edit () {
      this.getName('安琪拉')
      this.setSex('女')
    },
  }

4.mapAction

methods: {
    // actions
    ...mapActions(['getList']),
    btn () {
      // this.getList()
      this.get()
    },
    // module
    ...mapActions('getMsg', ['get'])

  }

以上是关于vueX总结的主要内容,如果未能解决你的问题,请参考以下文章

VSCode自定义代码片段13——Vue的状态大管家

VUEX 总结

项目集成 vue-router 和 vuex

python常用代码片段总结

Vue 学习总结笔记

BootStrap有用代码片段(持续总结)