vuex模块化实例
首页->学习资料->web前端->vue教程->vue2 关键词: 发布时间:2024-01-10 22:56:17 浏览次数:148

当多人一同开发一个项目时用到vuex,那大家可能都会在store/index.js中写代码,一是可能代码冲突,二是文件代码量大不方便阅读和管理,模块化就是为了解决这个问题


以下是这个例子的效果

image.png



main.js

//引入Vue

import Vue from 'vue'

//引入组件

import App from './App115.vue'

//引入插件

import plugins from './plugins'

//引入store

import store from './store/index115.js'

//关闭生产提示

Vue.config.productionTip = false

//应用插件

Vue.use(plugins)


//创建vm

const vm = new Vue({

    el: '#app',

    render: h => h(App),

    store: store,//简写store

    //全局事件总线

    beforeCreate() {

        Vue.prototype.$bus = this

    }

})

console.log(vm)



index.js

import Vue from 'vue'

import Vuex from 'vuex'

//这里就是模块化的效果,将各个组件的action,mutation,state,getters分离开

import schoolOptions from "@/store/school115.js";

import studentOptions from "@/store/student115.js";

Vue.use(Vuex)



//创建store

const store = new Vuex.Store({

    modules:{

        schoolOptions,

        studentOptions,

    },

})

export default store


App.vue

<template>

  <div class="app">

    p115-116:vuex模块化实例:<br/>

    将每个组件的配置分离成单独的文件,方便项目管理<br/>

    <hr/>

    <h1>当前求和结果为:{{ $store.state.sum }}</h1>

    <h1>调用mapGetters当前求和*10结果为:{{ bigSum }}</h1>

    <h3>我在:{{ school }},学习:{{ $store.state.schoolOptions.subject }}</h3>

    <h3>我在:{{ school }},学习:{{ xuexiao }}、{{ history }}</h3>

    <select v-model.number="n">

      <option value="1">1</option>

      <option value="2">2</option>

    </select>

    <button @click="increment(n)">加n-不跳过vuex的action环节</button>

    <button @click="increment1(n)">加n-跳过vuex的action环节</button>

    <h3>下方组件共有:{{persons.length}}个学生</h3>

    <hr/>

    <MyStudent></MyStudent>

  </div>

</template>


<script>

//这几个是为了简少computed和methods中代码量

import {mapState, mapGetters, mapActions, mapMutations} from 'vuex'

import MyStudent from "@/components/115/Student";

export default {

  name: 'App',

  components: {MyStudent},

  data() {

    return {

      n: 1,

    }

  },

  computed: {

    //计算属性实现简单的插值语法

    school() {

      return this.$store.state.schoolOptions.school

    },

    //借助mapState生成计算属性,从state中读取数据

    ...mapState('schoolOptions',{xuexiao: 'subjectEnglish'}),

    //名称一样时简写形式

    ...mapState('schoolOptions',['history','persons']),

    //mapGetters读getters,简写形式同mapState

    ...mapGetters('schoolOptions',{bigSum: 'bigSum'})

  },

  methods: {

     ...mapActions('schoolOptions',{increment:'jia'}),

    /************************以下用commit时**********************/

    increment1(){

      //如果action中的方法没有什么逻辑,可以跳转,直接调mutations中的方法

      //注意名称

      this.$store.commit('schoolOptions/JIA',this.n)

    },

    //this.$store.commit可以用这种方式,但注意绑定方法的时候要传参,不然传过去的是个鼠标事件

    // ...mapMutations('schoolOptions',{increment1: 'JIA'})

  }

}

</script>


<style scoped>


</style>


Student.vue


<!--组件的结构-->

<template>

  <div>

    <dl>

      <dt>{{className}}学生信息</dt>

      <!--不用计算属性-->

<!--      <dd v-for="(s) in $store.state.persons" :key="s.id">-->

      <dd v-for="(s) in persons" :key="s.id">

        {{ s.id }}-{{ s.name }}-{{ s.sex }}-{{ s.age }}

        <button @click="showId(s.id)">弹出id</button>

      </dd>

    </dl>

    <button @click="jia(1)">将上面组件的sum+1</button>

    <button @click="requestNetwork">axios发网络请求</button>

  </div>

</template>


<!--组件的交互代码:数据\方法-->

<script>

import {mapActions, mapState} from 'vuex'

export default {

  //组件名称,这个名称仅是给vue插件中显示用的

  name: 'my-student',

  computed:{

    ...mapState('schoolOptions',['persons']),

    ...mapState('studentOptions',['className'])

  },

  //组件方法

  methods: {

    // ...mapActions('schoolOptions',['jia']),

    jia(){

      this.$store.dispatch('schoolOptions/jia', 1)

    },

    ...mapActions('studentOptions',['requestNetwork'])

  },

}


</script>


<!--样式-->

<style scoped>

dt {

  color: red;

}

</style>


Student.js

import axios from "axios";

const studentOptions = {

    namespaced: true,//开启命名空间

    actions: {

        requestNetwork(context, value) {

            axios.get('http://localhost:8080/about/').then(

                response => {

                    context.commit('REQUESTNETWORK', response.data.about)

                },

                error => {

                    alert(error.message)

                }

            )

        }

    },

    mutations: {

        REQUESTNETWORK(state, value) {

            alert('网络请求返回结果为:' + value)

        }

    },

    state: {

        className: '三年级',

    },

    getters: {}

}

export default studentOptions




赞:(0)
踩:(0)
相关文章
初识vue
数据绑定:第一个vue例子
vue模板语法
vue数据绑定
el与data的两种写法/延迟挂载
vue数据代理-Object.definePropert
vue事件及事件修饰符prevent/stop/
vue计算属性computed
vue(深度)监视属性watch
vue绑定样式:class,:style
热门文章
win7中将文件拷贝到虚拟机linux下
phpexcel设置行高及列宽,背景颜色,
rabbitmq无法启动
intellij idea不显示git push按钮
php7中使用mongodb的aggregate进行
centos7.4 64位下swoole安装及配置
laravel页面静态化的方法
navicate连接mycat报1184错误
单点登录sso原理及php实现方式及de
devops-jenkins容器为pending状态
好评文章
phpexcel设置行高及列宽,背景颜色,
php7中使用mongodb的aggregate进行
intellij idea打开文件所在文件夹
windows下使用MongoDB Compass Com
win7中将文件拷贝到虚拟机linux下
laravel 中悲观锁 & 乐观锁的使用
单点登录sso原理及php实现方式及de
navicate连接mycat报1184错误
rabbitmq无法启动
laravel整合dingo/api方法步骤:jwt
标签
rabbitmq mysql备份 elasticsearch golang swoole
我的项目
【github】www.github.com/hurong241
【码云】gitee.com/hu_rong/projects
【docker hub】hub.docker.com/repositories/hurong241
【packagist】packagist.org/users/hurong241/packages
站点信息
建站时间:2011年
文章数:608篇
浏览数:952674
粤ICP备18028092号-1  微信:hurong241