状态管理与导航守卫

为什么要用vuex?

进行统一的状态管理,解决不同组件共享数据的问题。

如何使用vuex?

1.安装引入 npm install vuex --save
2.注册到vue中

import Vue from 'vue'
import Vuex from 'vuex'Vue.use(Vuex)

3.实例化vuex的store

export default new Vuex.Store({state: {},getters: {},mutations: {},actions: {},modules: {}
})

4.挂载在vue实例上

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

5.在组件中就可以通过this.$store对vuex进行操作。

state 存放初始数据

 state: {count: 1 },
  1. 组件中去取state的值,通过this.$store.state
  2. 或者可以通过计算属性取得,mapState辅助函数,可以简化操作:
import {mapState} from "vuex";
computed: {...mapState({// 传字符串参数 'count' 等同于 `state => state.count`count: 'count',// 箭头函数可使代码更简练count: state => state.count,})
},

getters 对state中的数据进行初加工(派生),类似vue中的computed,进行缓存

 state: {arr: [1, 2, 3, 4]},getters: {// 参数一:state 参数二:其他 getterchangeArr(state,getters) {return state.arr.map(item => item + 1)}},注意,getter 在通过属性访问时是作为 Vue 的响应式系统的一部分缓存其中的。
  1. 取getters中的值,通过this.$store.getters,
  2. 或者通过计算属性取,getters也有辅助函数mapGetters, 用法和mapState一致。
import {mapGetters} from 'vuex'
// 1、
...mapGetters(['changeCount',// ...
])
// 2、
...mapGetters({changeCount: 'changeCount'// ...
})

mutations 更改 Vuex 的 store 中的状态的唯一方法是提交 mutation 同步修改

//定义mutation
state: {count: 1,
},
mutations: {// 参数一:state 参数二:传入额外的参数increment(state, payload) {state.count = payload.count},
},
//调用mutation
// 1、普通方式
this.$store.commit('increment', {count: 10})
// 2、对象风格的提交方式this.$store.commit({type: 'increment',count: 10
})
  1. 在组件中提交 Mutation
    你可以在组件中使用 this.$store.commit(‘xxx’) 提交 mutation,或者使用 mapMutations 辅助函数将组件中的 methods 映射为 store.commit 调用(需要在根节点注入 store)。
import { mapMutations } from 'vuex'
methods:{...mapMutations(['increment', // 将 `this.increment()` 映射为 `this.$store.commit('increment', {count: 10})`]),...mapMutations({add: 'increment' // 将 `this.add()` 映射为 `this.$store.commit('increment')`}),
},
this.increment({count: 10})
this.add({count: 10})

actions action类似于mutation,不同的是action可以包含异步操作 action不能直接修改state,如果想修改state的话,需要触发mutation

//定义actionstate: {count: 0},mutations: {increment (state,payload) {state.count = payload.count }},actions: {// 第一个参数通过context(上下文环境)可以触发mutation,触发action,获取state、getter等操作// 第二个参数就是我们传递过来的参数incrementAsync(context, payload) {setTimeout(() => {context.commit('increment', payload)}, 1000);}}
//调用action
//  1、普通方式
this.$store.dispatch('incrementAsync', {count: 10})
// 以对象形式分发
this.$store.dispatch({type: 'incrementAsync',count: 10
})

在组件中提交 action
你在组件中使用 this.$store.dispatch(‘xxx’) 分发 action,或者使用 mapActions 辅助函数将组件的 methods 映射为 store.dispatch 调用(需要先在根节点注入 store):

import { mapActions } from 'vuex'
methods: {...mapActions(['incrementAsync', // 将 `this.increment()` 映射为 `this.$store.dispatch('increment', {count: 10})`]),...mapActions({add: 'incrementAsync' // 将 `this.add()` 映射为 `this.$store.dispatch('increment')`}),
},
this.incrementAsync({count: 10})
this.add({count: 10})

modules

定义module
// index.js中手动引入modules
import app from './modules/app'
modules: {app
}
<!--   app.js -->const app = {state: {num: 10},// 默认state就是有命名空间,// 如果想给mutation和action也加上命名空间的话,这里设置模块的namespaced:truegetters: {},mutations: {changeNum(state, payload) {state.num = payload.num}},actions: {}
}export  default  app
调用module
// 使用命名空间
this.$store.commit("app/changeNum", {num: 10})
// 未使用
this.$store.commit("changeNum", {num: 10})

vuex持久化存储

在开发的过程中, vuex数据刷新页面会初始化。像用户信息(名字,头像,token)需要vuex中存储且需要浏览器本地存储来实现持久化存储。

安装 npm install vuex-persistedstate --save

引入 import createPersistedState from ‘vuex-persistedstate’

使用

export default new Vuex.Store({plugins: [createPersistedState(),],
// 默认存储到localStorage,如果想要存储到sessionStorage,配置如下
plugins: [    // 把vuex的数据存储到sessionStorage    createPersistedState({      storage: window.sessionStorage,    }),  ],
// 持久化所有的state,如果想要存储指定的state,配置如下
plugins: [    // 把vuex的数据存储到sessionStorage    createPersistedState({      storage: window.sessionStorage,      reducer(val) {        return {          // 只存储state中的count          count: val.count       }      }    }),  ],
})

导航守卫(路由守卫)

什么是导航守卫

vue-router 提供的导航守卫主要用来通过跳转或取消的方式守卫导航。这里有很多方式植入路由导航中:全局的,单个路由独享的,或者组件级的。

全局前置守卫

const routes = [{path: '/',name: 'home',component: HomeView},{path: '/about',name: 'about',// route level code-splitting// this generates a separate chunk (about.[hash].js) for this route// which is lazy-loaded when the route is visited.component: () => import(/* webpackChunkName: "about" */ '../views/AboutView.vue')}
]const router = new VueRouter({mode: 'history',base: process.env.BASE_URL,routes
})router.beforeEach((to, from,next) => {// ...// 返回 false 以取消导航return false
})

当一个导航触发时,全局前置守卫按照创建顺序调用。守卫是异步解析执行,此时导航在所有守卫 resolve 完之前一直处于等待中。
每个守卫方法接收三个参数:
to: 即将要进入的目标
from: 当前导航正要离开的路由
next:next 是函数
注意:确保 next 函数在任何给定的导航守卫中都被严格调用一次。它可以出现多于一次,但是只能在所有的逻辑路径都不重叠的情况下,否则钩子永远都不会被解析或报错

全局后置钩子

你也可以注册全局后置钩子,然而和守卫不同的是,这些钩子不会接受 next 函数也不会改变导航本身:

router.afterEach((to, from, failure) => {// console.log(failure)console.log(to,from,failure)
})
// 它们对于分析、更改页面标题、声明页面等辅助功能以及许多其他事情都很有用。

路由独享的守卫

你可以在路由配置上直接定义 beforeEnter 守卫:这些守卫与全局前置守卫的方法参数是一样的。

const router = new VueRouter({routes: [{path: '/about',component: About,beforeEnter: (to, from, next) => {// ...}}]
})

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/654967.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

算法训练营总结

目录 收获思考感悟后续 收获 不知不觉&#xff0c;已经跟着训练营刷了两个月的题。 之前也跟着代码随想录刷了一大半&#xff0c;因为出差中断没有坚持下来&#xff0c;仅有的基础也扔下了不少。 而这两个月跟着训练营最大的收获就是坚持&#xff0c;不会的题硬啃几天也要搞…

Java 与 JavaScript的区别

Java 与 JavaScript的区别 Java 与 JavaScript&#xff1a;概述Java的特点JavaScript 的起源JavaScript 的特点Java 与 JavaScript&#xff0c;哪个更好&#xff1f;JavaScript 与 Java 相似吗&#xff1f;Java 与 JavaScript 的区别JavaScript 在服务器端的运行方式是怎样的&a…

网络防御安全知识(第二版)

安全策略 传统的包过滤防火墙 --- 其本质为ACL列表&#xff0c;根据数据报中的特征进行过滤&#xff0c;之后对比规制&#xff0c; 执行动作。 五元组 --- 源IP&#xff0c; 目标IP&#xff0c;源端口&#xff0c; 目标端口&#xff0c;协议 安全策略 --- 相较于ACL的改进之…

网站打不开怎么办?高防IP弹性防护更省心

不管你是什么网站&#xff0c;商城网站、游戏网站或者支付网站都有可能存在被攻击的情况&#xff0c;超过防护就会被打死&#xff0c;网站随即而来就打不开了。网站打不开怎么办&#xff1f;看看是不是网站主机或者服务器被攻击了。攻击的大小不可控&#xff0c;选择高防服务器…

Linux/Delivery

Enumeration nmap 首先扫描目标端口对外开放情况&#xff0c;第一轮扫描发现对外开放了22,80,8065三个端口&#xff0c;端口详细信息如下 nmap -sC -sV -p 22,80,8065 10.10.10.222 nmap显示22端口运行着ssh服务&#xff0c;80端口运行着http服务&#xff0c;8065端口运行的…

微信小程序 如何调用微信支付接口

前提&#xff1a; 小程序为企业小程序 并开通了 微信打款认证 例子&#x1f330;&#xff1a; 我们这里以订单为例子 1.创建订单 朝后端发送订单id 或信息 2.后端生成 时间戳/随机字符/id/后端算法签名 3.将获取到的数据 塞入 wx.requestPayment然后就可以掉起为微信支付…

基于go mod模式创建项目最佳实践

希望能带给你成功的喜悦&#xff01; 除go get、vendor这两种方式外&#xff0c;Go版本在1.11之后推出了go module模式来管理依赖&#xff0c;使用go mod时下载的依赖文件在$GOPATH/pkg/mod/下。本文以两种办法介绍如何创建go mod项目。 目录 goland开启玩法 本地手动创建项目…

【Linux】Linux下多线程

需要云服务器等云产品来学习Linux的同学可以移步/–>腾讯云<–/官网&#xff0c;轻量型云服务器低至112元/年&#xff0c;优惠多多。&#xff08;联系我有折扣哦&#xff09; 文章目录 1. 前置&#xff1a;进程地址空间和页表1.1 如何看待进程地址空间和页表1.2 虚拟地址…

MIAOYUN获评OpenCloudOS社区2023年度优秀贡献企业

近日&#xff0c;OpenCloudOS社区发布了社区年度贡献企业榜单&#xff0c;成都元来云志科技有限公司&#xff08;简称“MIAOYUN”&#xff09;凭借对国产开源的热情&#xff0c;及对操作系统产业的支持&#xff0c;通过兼容适配互认证&#xff0c;为推动OpenCloudOS规模化应用&…

python数据类型-数字类型

1. 整型 整型即整数类型&#xff0c;对应于python中的int类型&#xff0c;包含&#xff1a;0&#xff0c;正整数&#xff0c;负整数 数字前面加上进制修饰符代表该数字是几进制&#xff0c;如0b1010则代表二进制&#xff0c;其输出结果为十进制10。默认不加任何进制修饰符为十…

使用IP爬虫代理提取数据的步骤是什么?爬虫代理IP怎么提高采集效率?

​​​​​ 一、使用IP爬虫代理提取数据的步骤 在使用爬虫代理IP提取数据之前&#xff0c;需要先了解数据来源和目标网站的结构。以下是一个基本的步骤&#xff1a;1.确定数据来源 首先需要确定要提取数据的网站或数据源&#xff0c;了解网站的结构、数据存储方式以及数据更新…

Qt应用软件【协议篇】Modbus详细介绍

文章目录 概述Modbus 485协议概述在工业自动化中的应用 通信模式数据模型功能码 Modbus RTU示例 1&#xff1a;读取保持寄存器示例 2&#xff1a;写入单个线圈示例 3&#xff1a;写入多个保持寄存器报文传输 Modbus ASCII报文示例报文传输 Modbus TCP报文示例报文传输 概述 在…

如何将iPad连接到USB设备?这里提供了详细步骤

本文介绍了如何将iPad连接到USB设备。说明适用于所有版本的iPad。 将USB设备与带USB-C端口的iPad一起使用 以下iPad具有USB-C端口: 自2018年第三代以来的iPad Pro机型 自2020年第四代以来的iPad Air机型 自2021年第六代以来的iPad迷你机型 自2022年以来的第十代iPad机型 这些…

PINN物理信息网络 | 混合变量PINN求解纳维-斯托克斯方程

混合变量物理神经网络(Mixed Variable Physics-Informed Neural Network,PINN)是一种将物理知识与神经网络相结合的方法,用于求解偏微分方程(Partial Differential Equations,PDEs)的数值解。纳维-斯托克斯方程是一种描述流体运动的PDE,可以通过混合变量PINN方法进行求…

nltk关键字抽取与轻量级搜索引擎(Whoosh, ElasticSearcher)

背景 有时候你想用一句完整的话或一个文本在基于关键字的搜索引擎里搜索&#xff0c;但是如果把整个文本放进去搜索的话&#xff0c;效果不是很好&#xff0c;因为你的搜索引擎是基于关键字而不是sematic search。那怎么抽取关键字呢&#xff1f; 利用NLTK抽取关键的代码 imp…

动手学深度学习(一)深度学习介绍2

目录 二、起源 三、深度学习的成功案例&#xff1a; 四、特点&#xff1a; 五、小结&#xff1a; 二、起源 为了解决各种各样的机器学习问题&#xff0c;深度学习提供了强大的工具。 虽然许多深度学习方法都是最近才有重大突破&#xff0c;但使用数据和神经网络编程的核心思…

Day53 动态规划part14 1143. 最长公共子序列 1035. 不相交的线 53. 最大子数组和

Day53 动态规划part14 1143. 最长公共子序列 1035. 不相交的线 53. 最大子数组和 1143. 最长公共子序列 class Solution { public:int longestCommonSubsequence(string text1, string text2) {vector<vector<int>> dp(text1.size()1,vector<int>(text2.si…

Redis学习——高级篇①

Redis学习——高级篇① Redis7高级之单线程和多线程&#xff08;一&#xff09; 一、Redis单线程VS多线程1.Redis的单线程部分1.1 Redis为什么是单线程&#xff1f;1.2 Redis所谓的“单线程”1.3 Redis演进变化1.3.1 Redis 3.x 单线程时代性能很快的原因1.3.2…

python实例100第47例:两个变量值互换

题目&#xff1a;两个变量值互换。 程序分析&#xff1a;无 程序源代码&#xff1a; 实例 #!/usr/bin/python # -*- coding: UTF-8 -*- def exchange(a,b): a,b b,a return (a,b) if __name__ __main__: x 10 y 20 print (x %d,y %d % (x,y))…