vue之导航守卫,vuex

朱雀 2022-12-20 06:29 253阅读 0赞

vue之导航守卫

首先在这里说明一下导航守卫是个什么东西
其实就好比一个门卫你带有工作证我就让你进去,没有的话就不让你进去,常用于登录购物车之类需要用户信息的页面

直接上代码

如果Vue是在生产环境下面,则不提示相关的代码信息
Vue.config.productionTip = false

  1. //在main.js下面添加
  2. router.beforeEach({ to,from,next}=>{ //to去向,from来源,next下一步
  3. //此处写逻辑代码
  4. if(){
  5. next()
  6. }else{ }
  7. })

实现页面左滑右滑的效果,比如说用户页面跳转首页应该是左滑的效果,购物车跳转到商品详情就应该是右滑的效果,在app.vue中添加
首先上个效果基于动画库实现的要在入口文件中加入

  1. //导入动画插件库
  2. import "animate.css"
  3. watch: {
  4. //在每个页面监控路由的变化
  5. $route(to, from) {
  6. // to代表去哪里,from代表从哪里来 meta代表在路由页面的可以携带一些第三方信息,属性中自定义一个index,通过判断index大小来实现
  7. if (to.meta.index > from.meta.index) {
  8. this.slideDir = "slide-right";
  9. } else {
  10. this.slideDir = "slide-left";
  11. }
  12. },
  13. },

上面的代码中slideDir是transition中绑定的name值,
<transition :name="slideDir">transition是vue自带的

vuex

vuex是什么?
vuex是全局状态管理,存储数据的地方,通俗来说就是存放公共数据的一个仓库

store文件下面的代码

  1. import Vue from 'vue'
  2. import Vuex from 'vuex'
  3. import createPersistedState from "vuex-persistedstate" //这是vue的持久化插件保存到本地缓存中,这是因为虽然vuex是个全局状态管理但是一刷新就初始化了
  4. //全局状态管理
  5. Vue.use(Vuex)
  6. const store = new Vuex.Store({
  7. })
  8. export default store;

actions(commit提交mutations,异步操作)

store里面的代码

  1. actions(){
  2. setUserInfo({ commit }, userInfo) {
  3. commit("setUserInfo", userInfo)
  4. },
  5. }

在组件中获取vuex当中actions方法时

第一种方式

  1. methods:{
  2. getUserInfo(){
  3. this.$store.dispatch('getUserInfo') //注意这里使用的是this.$store.dispatch
  4. }
  5. }

第二种方式

  1. //借助辅助函数Vuex.mapActions
  2. import { mapActions} from 'vuex'
  3. //这种方式也有三种写法
  4. methods:{
  5. ...mapActions(["getUserInfo"]),
  6. this.getUserInfo()
  7. }

mutations(用来改变state,同步操作)

store里面的代码

  1. mutations: {
  2. setUserInfo(state, userInfo) {
  3. state.userInfo = userInfo;
  4. },
  5. }

在路由中获取vuex当中mutations的方法时

第一种方式

  1. methods:{
  2. getUserInfo(){
  3. this.$store.commit('getUserInfo')
  4. }
  5. }

第二种方式

  1. //借助辅助函数Vuex.mapMutations
  2. import { mapMutations} from 'vuex'
  3. //这种方式也有三种写法
  4. methods:{
  5. ...mapMutations(["getUserInfo"]),
  6. this.getUserInfo()
  7. }

state(数据)

store里面的代码

  1. state:{
  2. userInfo: null,
  3. }

想在路由里面获取vuex里面的数据时都必须写在计算属性computed当中

第一种获取方式

  1. computed:{
  2. getUserInfo(){
  3. return this.$store.state.userInfo
  4. }
  5. }

第二种获取方式

  1. //借助辅助函数Vuex.mapState
  2. import { mapState} from 'vuex'
  3. //这种方式也有三种写法
  4. computed:mapState({
  5. //箭头函数
  6. userInfo:state=>state.userInfo,
  7. //传字符串参数‘userInfo’等同于state=>state.userInfo
  8. userInfo:'userInfo'
  9. })

第中获取方式的第三种写法

  1. //借助辅助函数Vuex.mapState
  2. import { mapState} from 'vuex'
  3. //这种方式也有三种写法
  4. computed:{ ...mapState({
  5. //传字符串参数‘userInfo’等同于state=>state.userInfo
  6. userInfo:'userInfo' //当属性名跟属性值一样时可以使用数组的形式如下面简写方式,当不一样时就要使用对象
  7. })
  8. //简写方式
  9. computed:{ ...mapState(["userInfo"])}

vuex的计算属性getters

  1. getters: {
  2. shopCartTotalMoney(state) {
  3. let money = 0;
  4. state.shopCartList.forEach(item => {
  5. money += item.price * item.count
  6. })
  7. return money.toFixed(2)
  8. },
  9. },

组件中获取vuex当中的getters数据

  1. computed:{
  2. totalMoney(){
  3. return this.$store.getters.shopCartTotalMoney
  4. }
  5. }

使用辅助函数来获取

  1. //借助辅助函数Vuex.mapGetters
  2. import { mapGetters} from 'vuex'
  3. computed:{ ...mapGetters(["shopCartTotalMoney"])
  4. //这里就可以使用方法了
  5. }

vue数据持久化(vuex-persistedstate)

为甚需要数据持久化这个插件的
每次刷新页面,数据就初始化因此我们需要这个插件把数据存储到本地中

plugins(持久化)

引入及配置
在store下的index.js中

  1. import createPersistedState from "vuex-persistedstate"
  2. const store = new Vuex.Store({
  3. // ...
  4. plugins: [createPersistedState()]
  5. })

默认存储到localStorage

想要存储到sessionStorage,配置如下

  1. import createPersistedState from "vuex-persistedstate"
  2. const store = new Vuex.Store({
  3. // ...
  4. plugins: [createPersistedState({
  5. storage: window.sessionStorage
  6. })]
  7. })

想使用cookie同理

默认持久化所有state

指定需要持久化的state,配置如下

  1. import createPersistedState from "vuex-persistedstate"
  2. const store = new Vuex.Store({
  3. // ...
  4. plugins: [createPersistedState({
  5. storage: window.sessionStorage,
  6. reducer(val) {
  7. return {
  8. // 只储存state中的assessmentData
  9. assessmentData: val.assessmentData
  10. }
  11. }
  12. })]

vuex当中的模块化(module)

由于全部代码写在store里面非常冗余所以就要借助模块化,一个文件下面需要数据写在对应要引用的vuex里面
首先主vuex里面的代码

  1. import Vue from 'vue'
  2. import Vuex from 'vuex'
  3. import login from './login' //导入分支login的vuex
  4. Vue.use(Vuex)
  5. export default new Vuex.Store({
  6. modules:{
  7. loginlogin //相同可以省略
  8. }
  9. })

分支vuex代码起个名字login.js

  1. export default{
  2. state:{ }
  3. getters:{ }
  4. mutations:{ }
  5. actions:{ }
  6. }

使用模块之后注意几个点
1.main.js下面导入vuex的路径记得改一下’/store’改成’/store/index’
2.此时在组件中获取vuex的数据就不能用字符串的方式获取了,因为此时所对应的是一个模块所以要使用箭头函数的写法

  1. computed:{
  2. ...mapGetters({
  3. userInfo:state=>state.login.userInfo
  4. })
  5. }

或者

  1. methods:{
  2. ...mapGetters("Login", [
  3. //Login是指modules文件夹下的Login.js
  4. "submitFormCode" //Login.js文件中的actions里的方法,在上面的@click中执行并传入实参
  5. ]),
  6. }

发表评论

表情:
评论列表 (有 0 条评论,253人围观)

还没有评论,来说两句吧...

相关阅读

    相关 VUE导航守卫

    为了阻止非法用户对受限资源的访问,Web服务器通过过滤器和拦截器,进行客户端请求的拦截。在身份验证通过后,才能继续访问目标资源,否则跳转登录或错误页面。 但是,这种方式只能限

    相关 vue 路由--- 导航守卫

    个人理解:路由跳转是一个大的过程,就跟组件的创建一样,不是涉及组件的创建 -- 销毁,那么路由的跳转也同样涉及到这个过程。(对接springmvc里面的拦截器,spring的a

    相关 vue导航守卫,vuex

    vue之导航守卫 首先在这里说明一下导航守卫是个什么东西 其实就好比一个门卫你带有工作证我就让你进去,没有的话就不让你进去,常用于登录购物车之类需要用户信息的页面