Vue学习——Vuex入门

Posted sadoshi

tags:

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

前言

Vue的组件的传值方式通常是这样的:父组件给子组件设定属性,子组件从props中取出;子组件通过$emit给父组件发送消息,父组件处理该消息从而获取传值。这种设计理念在遇到诸如兄弟组件传值、祖父节点给孙子节点传值时,就比较麻烦了。所以这种场景可以考虑使用Vuex。

Vuex是什么?

Vuex被称为是为了vue程序开发的“状态管理模式”。具体的概念可以去看官网。在我看来,它更像一个全局变量的管理模块。使用Vuex定义一些变量,然后定义一些改变这些变量的方法。根组件挂载了Vuex模块之后,其后代的节点都可以获取其变量,并通过定义的方法改变这些变量。

 上图是Vuex的“单向数据流”理念示意图。可以看到,View通过State获取定义的变量。然后View通过Action的方法去改变State中的变量。

快速开始

接下来我们尝试在两个自定义的兄弟组件中通过vuex传递和改变数值。

先创建一个项目

vue create vuex-test

进入项目的目录里面,安装依赖

npm install

然后安装Vuex到这个项目中

npm install vuex --save

在src目录下新建store目录,创建文件src/store/index.js

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

//挂载Vuex
Vue.use(Vuex)

//创建VueX对象
const store = new Vuex.Store(
  state: 
    count: 0
  ,
  mutations: 
    increment (state) 
      state.count++
    
  
)

export default store

这里在state里定义了一个count变量。后续组件就是访问state里面这个count变量。mutations则是用于改变state里面变量值。Vuex是不能在外部直接通过state.count++这样的方式修改值,需要通过mutations里的方法间接修改。

之后要在main.js文件把vuex挂在上去,第7行挂载store。之后在组件及其子组件下都可以通过this.$store访问store实例。

import Vue from 'vue'
import App from './App.vue'
import store from './store'

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

修改主页面App.vue

<template>
  <div id="app">
    <my-button/>
    <my-message/>
  </div>
</template>

<script>
import MyButton from './components/myButton.vue'
import MyMessage from './components/myMessage.vue'


export default 
  name: 'App',
  components: 
    MyButton,
    MyMessage
  

</script>

这里用到了MyButton和MyMessage两个自定义组件,所以我们接下来创建这两个组件。

先讲下这两个组件,我们打算设计MyButton为一个按钮,每次按一下让store.state.count加一,MyMessage则负责显示。如果不使用Vuex,那必须在App.vue内定义一个count属性,MyButton中$emit,然后App.vue定义处理方法,把count加一,然后在传到MyMessage中,MyMessage通过props来获取。这也太麻烦了吧~~~~

在src/components目录下新建myButton.vue

<template>
  <div>
    <button v-on:click="countFun">clicked me</button>
  </div>
</template>
 
<script>

export default 
  name: "MyButton",
  methods: 
    countFun() 
      this.increment();
    ,
    increment() 
      this.$store.commit('increment')
    
  ,
;
</script>

这里很简单,只是单纯每点击一下,则触发this.$store.commit('increment')。this.$store.commit是mutations的触发方式,里面的参数是其方法名。

在src/components目录下新建myMessage.vue

<template>
  <div>
    <p>myMessage的值:  message </p>
  </div>
</template>

<script>
export default 
  name: 'MyMessage',
  data()
    return 
    
  ,
  computed:
    message()
      return this.$store.state.count
    
  

</script>

我们通过this.$store.state.count获取count的值。通常我们会把它放在计算属性中。否则当count的值变化的时候,message的值不会及时更新。

运行项目,打开http://localhost:8080/

我们点击按钮,可以看到myMessage的值不断加一。

小结

本文主要让大家了解Vuex的使用。Vuex使用起来很简单,其内容也不多。state和mutation是最常用的功能,一个用来取数据,一个用来改变数据。Vuex还包括getter、action、module等功能。后面文章再细述。

以上是关于Vue学习——Vuex入门的主要内容,如果未能解决你的问题,请参考以下文章

Vue学习——Vuex入门

如何在 VueJS 中将模板(插槽)从祖父组件传递给孙子?

防止孙子调用其祖父母的方法

[linxu]SUBREAPER 设置祖父进程接管孙子进程

vue从入门到放弃

vue从入门到放弃