vue2.0构建全栈项目(前后分离实践,vuex的使用)【2】

367 阅读3分钟

个人网站地址 www.wenghaoping.com

Vue + express + Mongodb构建 请大家多支持一下。

前言

vuex的使用,我一直以来用都发现,自己用错了,这次正好整理下 项目地址 我们在src下创建个目录为store

在store下分别创建4个js文件actions.js,index.js,mutation-types.js,mutations.js 具体文件夹分类,可以看上一篇的最后

看名字也就知道这4个分别是做啥用的了,建议大家多阅读阅读vuex的文档,多姿势多动手实践,慢慢的也就能理解了。

// src/store/index.js

/**
 * Created by Admin on 2017/11/21.
 */
import Vue from 'vue';
import Vuex from 'vuex';
import mutations from './mutations'; //后面会介绍到
import actions from './actions'; //后面会介绍到
Vue.use(Vuex);

const store = new Vuex.Store({
  mutations,
  actions,
  // 先写个初始数据
  state: {
    totalIndex: 0,
    list: [{
      name: 'story',
      avatar: 'https://i.imgur.com/LIvj3YT.jpg',
      date: '2017年11月23日15:34',
      introduce: '请看,这是我女神'
    }]
  }
});

export default store;

不出意外的话,你可以在首页下看见这样的页面

说明,vuex初始数据好啦,下面开始写创建和删除

创建计划列表组件

然后我们需要去创建我们的创建,创建部分很简单,目前只通过名字和内容,时间为获取当前时间,头像固定。

/src/views/creatPlan/creatPlan.vue

<template>
    <div class="creatPlan" v-loading.fullscreen="loading" element-loading-text="拼命加载中">
      <el-form ref="formData" :model="formData" label-width="80px">
        <el-row :span="24" :gutter="32">
          <el-col :span="12">
            <el-form-item
              label="名字">
              <el-input v-model="formData.name" placeholder="名字"></el-input>
            </el-form-item>
          </el-col>
        </el-row>
        <el-row :span="24" :gutter="32">
          <el-col :span="24">
            <el-form-item
              label="内容">
              <el-input v-model="formData.introduce" placeholder="内容"></el-input>
            </el-form-item>
          </el-col>
        </el-row>
        <el-row :span="24" :gutter="32">
          <el-col :span="24">
            <el-button type="primary" round @click="save">保存</el-button>
          </el-col>
        </el-row>
      </el-form>
    </div>
</template>

JS部分

<script type="text/ecmascript-6">
    import { CurentTime } from '@/utils/formData'; // 这是一个获取当前时间的工具,后期会讲到
    export default {
      props: [],
      data () {
        return {
          loading: false,
          formData: {
            name: '',
            introduce: ''
          }
        };
      },
      computed: {},
      mounted () {},
      // 组件
      components: {},
      methods: {
        save () {
          const plan = {
            avatar: 'https://i.imgur.com/LIvj3YT.jpg',
            name: this.formData.name,
            introduce: this.formData.introduce,
            date: CurentTime() // 使用获取当前时间工具
          };
          // 添加计划
          this.$store.dispatch('savePlan', plan);
          this.$router.go(-1);
        }
      },
      // 当dom一创建时
      created () {},
      watch: {}
    };
</script>

这个组件很简单就2个input输入而已,然后就一个按钮,保存我们就把数据push进我们store的列表里

vuex部分

在vue2.0中废除了使用事件的方式进行通信,所以在小项目中我们可以使用Event Bus,其余最好都使用vuex,本文我们使用Vuex来实现数据通信

相信你刚刚已经看见了我写了很多this.$store.dispatch('savePlan', plan) 类似这样的代码,我们再次统一说明。

仔细思考一下,我们需要两个全局数据,一个为所有计划的件数,一个是计划列表的数组。

src/store/index.js 没啥太多可介绍的,其实就是传入我们的state,mutations,actions来初始化我们的Store。如果有需要的话我们还可能需要创建我们的getter在本例中就不用了。

接着我们看mutation-types.js,既然想很明确了解数据,那就应该有什么样的操作看起,当然这也看个人口味哈

// src/store/mutation-types.js

// 新增和删除一条计划
export const SAVE_PLAN = 'SAVE_PLAN';
export const DELETE_PLAN = 'DELETE_PLAN';
// src/store/mutation.js

import * as types from './mutation-types';
export default {
  // 新增计划
  [types.SAVE_PLAN] (state, plan) {
    state.list.push(
      Object.assign({ }, plan)
    );
  },
  // 删除某计划
  [types.DELETE_PLAN] (state, idx) {
    state.list.splice(idx, 1);
  }
};

最后对应看我们的actions就很明白了

// src/store/actions.js

import * as types from './mutation-types';

export default {
  savePlan ({ commit }, plan) {
    commit(types.SAVE_PLAN, plan);
  },
  deletePlan ({ commit }, plan) {
    commit(types.DELETE_PLAN, plan);
  }
};

我们的actions其实就是去触发事件和传入参数啦

this.$store.dispatch('savePlan', plan) 当执行了这样的方法就会调用actions.js里的savePlan方法,而savePlan又会触发 mutations里的 types.SAVE_PLAN最后修改数据视图更新

PS:在这有个技巧就是,在mutations里都是用大写下划线连接,而我们的actions里都用小写驼峰对应。 个人理解这其实就是一个发布订阅的模式

mutation-types 记录我们所有的事件名

mutations 注册我们各种数据变化的方法

actions 则可以编写异步的逻辑或者是一些逻辑,再去commit 我们的事件

如果有getter 我们可以把一些需要处理返回的数据放在这即可,不进行业务操作

开始体验下你自己的计划板吧!

::: hljs-center 来加我啊 :::