导航守卫/vuex

导航守卫
全局前置守卫
导航跳转就会触达前置守卫
fn回调接收三个参数,to将要访问的路由 from将要离开的地址 next()是放行的意思
router.beforeEach((to,from,next)=>{
to.path //将要访问的hash地址
from.path //将要离开的hash地址
 next()
})

vuex 项目数据共享的技术方案
数据存取一步到位,不需要层层传递
数据流动清晰
vuex数据都是响应式
安装
npm i vuex@3.6.2
初始化vuex
在src目录下创建store文件夹在创建index.js
import Vue from 'vue'
import Vuex from 'vuex'
vue.use(Vuex)
const store = new Vuex.store({
//开启严格模式
strict:true
//state就是全局的数据 
//想要访问就是this.$store.state.定义的名字
//computed:{...mapState(['定义的值','定义的值'])}
//computed:{...mapState({计算属性的名字:'全局数据的名字'})}
 state:{
   count:0
 }
})
export default store
在main.js中
import store from './store '
new Vue({
  render: h => h(App),
  //router:router
   store
}).$mount('#app')
=============================================
Mutation函数 专门修改store中的数据 只能同步修改state数据
在src/store/index.js
import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
const store = new Vuex.Store({
  //开启严格模式
  strict: true,
  // 全局共享数据
  state: {
    count: 0,
  },
  // 函数专门修改state中的数据
  mutations: {
    // 修改state值
    add(state, n) {
      state.count += n
    }
  },
})
export default store
使用Mutation函数
<template>
  <div class="left-container">
    <p>count 值:{{ count }}</p>
    <button class="btn btn-primary" @click="btnAddhandler">+1</button>
    <button class="btn btn-primary" @click="add(3)">+3</button>
  </div>
</template>

<script>
import { mapState } from 'vuex'
import { mapMutations } from 'vuex'
export default {
  name: 'Left',
  // 结合计算属性调用mapstate辅助函数拿到全局数据
  computed: {
    // ...展开运算符
    ...mapState(['count'])
    // ...mapState({ct:'count'})
  },
  methods: {
    btnAddhandler() {
      // 拿到全局数据mutations函数里面的方法
      // this.$store.commit('调用函数的名字', 参数)
      this.$store.commit('add', 1)
    },
    // mapMutations辅助函数结合methods来使用
    ...mapMutations(['add'])
  }
}
</script>
=============================================
actions 专门负责异步操作
在src/store/index.js
import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
const store = new Vuex.Store({
  strict: true,
  // 全局共享数据
  state: {
    count: 0,
  },
  // 函数专门修改state中的数据
  mutations: {
    // 修改state值
    add(state, n) {
      state.count += n
    }
  },
  actions: {
    // actions里面只有两个参数 ctx固定写法表示new Vuex.Store 
    // {n:自增数字,s:延时的秒数}
    addAsync(ctx, obj) {
      setTimeout(() => {
        ctx.commit('add', obj.n)
      }, obj.s);
    }
  },
})
export default store
使用actions 函
<template>
  <div class="left-container">
    <h3>Left 组件</h3>
    <hr />

    <p>count 值:{{ count }}</p>
    <button class="btn btn-primary" @click="btnAddhandler">+1</button>
    <button class="btn btn-primary" @click="add(3)">+3</button>
    <hr />
    <button class="btn btn-primary" @click="$store.dispatch('addAsync', { n: 1, s: 1000 })">一秒后自动+1</button>
    <button class="btn btn-primary" @click="addAsync({ n: 3, s: 3000 })">三秒后自动+3</button>
  </div>
</template>
<script>
import { mapState, mapMutations, mapActions } from 'vuex'
export default {
  name: 'Left',
  // 结合计算属性调用mapstate辅助函数拿到全局数据
  computed: {
    // ...展开运算符
    ...mapState(['count'])
    // ...mapState({ct:'count'})
  },
  methods: {
    btnAddhandler() {
      // 拿到全局数据mutations函数里面的方法
      // this.$store.commit('调用函数的名字', 参数)
      this.$store.commit('add', 1)
    },
    // mapMutations辅助函数结合methods来使用
    ...mapMutations(['add']),
    ...mapActions(['addAsync'])
  }
}
</script>
=============================================
Getter 就是vuex里面的计算属性
在src/store/index.js
import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
const store = new Vuex.Store({
  strict: true,
  // 全局共享数据
  state: {
    count: 0,
    // 任务列表的数据,已完成的任务,state 为 true;false 表示任务尚未完成
    tasks: [
      { id: 1, name: 'xxxxxx', state: true },
      { id: 2, name: 'xxxxxx', state: false },
      { id: 3, name: 'xxxxxx', state: true }
    ]
  },
  // 函数专门修改state中的数据
  mutations: {
    // 修改state值
    add(state, n) {
      state.count += n
    }
  },
  actions: {
    // actions里面只有两个参数 ctx固定写法表示new Vuex.Store 
    // {n:自增数字,s:延时的秒数}
    addAsync(ctx, obj) {
      setTimeout(() => {
        ctx.commit('add', obj.n)
      }, obj.s);
    }
  },
  getters: {
    isAllDone(state) {
      //every表示每一项都满足条件返回true
      //some表示任何一项满足就返回true
      return state.tasks.every(item => item.state === true)
    }
  }
})
export default store
使用Getter 函数
<template>
  <div class="left-container">
    <h3>Left 组件</h3>
    <hr />

    <p>count 值:{{ count }}</p>
    <button class="btn btn-primary" @click="btnAddhandler">+1</button>
    <button class="btn btn-primary" @click="add(3)">+3</button>
    <hr />
    <button class="btn btn-primary" @click="$store.dispatch('addAsync', { n: 1, s: 1000 })">一秒后自动+1</button>
    <button class="btn btn-primary" @click="addAsync({ n: 3, s: 3000 })">一秒后自动+3</button>
    <hr />
    <p>所有任务的完成状态{{ $store.getters.isAllDone }}</p>
    <p>所有任务的完成状态{{ isAllDone }}</p>
  </div>
</template>

<script>
import { mapState, mapMutations, mapActions, mapGetters } from 'vuex'
export default {
  name: 'Left',
  // 结合计算属性调用mapstate辅助函数拿到全局数据
  computed: {
    // ...展开运算符
    ...mapState(['count']),
    // ...mapState({ct:'count'})
    ...mapGetters(['isAllDone'])
  },
  methods: {
    btnAddhandler() {
      // 拿到全局数据mutations函数里面的方法
      // this.$store.commit('调用函数的名字', 参数)
      this.$store.commit('add', 1)
    },
    // mapMutations辅助函数结合methods来使用
    ...mapMutations(['add']),
    ...mapActions(['addAsync'])
  }
}
</script>
=============================================
Module模块 把不同的数据和方法按照彼此的关联进行封装
定义模块 在src/store/xxxx.js
export default {
 namespaced:true //开启命名空间
//拆了模块的state需要是函数
 state(){
   return{
  }
 } ,
 mutations:{}, //修改数据
 actions:{} //异步
 getters:{}//vuex里面的计算属性
}
组装模块
//导入
import xxxxx from './xxxxx.js'
在moudules下组装
new Vuex.Store({
 moudules:{
  //键:值
  模块注册名称:导入的模块对象
 }
})
在组件内访问模块成员
state:this.$store.state.注册名称.数据名称  ||  computed:{...mapState('注册名称',['数据名称'])}
mutations: this.$store.commit('注册名称/函数名称',传入的参数) || methods:{...mapMutations('注册名称',['函数名称'])}
actions: this.$store.dispatch('注册名称/函数名称',传入的参数) || methods:{...mapActions('注册名称',['函数名称'])}
getters:this.$store.getters('注册名称/getters的名称') || computed:{...mapGetters('注册名称',['getters的名称'])}

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值