当前位置: 首页 > article >正文

Vue的路由守卫与Store

路由守卫

全局路由守卫

router.beforeEach((to, from, next) => {
    console.log("去哪:", to, "那来:", from);
    // sessionStorage.getItem()
    //是否运行放行
    next();
})
//后置路由守卫
router.afterEach((to, from)=>{
    console.log("后置路由守卫:去哪:", to, "那来:", from);
})

独享路由守卫

beforeEnter: (to: any, from: any, next: any) => {
console.log("独享路由守卫:去哪:", to, "那来:", from);
//是否放行
next();
}

组件路由守卫

<script lang="ts">
export default {
  name: "Detail",
  beforeRouteEnter(to, from) {
    console.log("在渲染该组件的对应路由被验证前调用")
    // 不能获取组件实例 `this` !
    // 因为当守卫执行时,组件实例还没被创建!
  }
}
</script>
//组件路由守卫
onBeforeRouteUpdate((to, from) => {
  // console.log(to,from)
  console.log("当前路由被改变,如果同一个路径,但是参数不同 也可以重复触发");
})

onBeforeRouteLeave((to, from, next) => {
  console.log("通过路由规则,离开该组件时被调用:", to, from);
  //是否允许 离开
  next();
})

Pinia

Pinia 起始于 2019 年 11 月左右的一次实验,其目的是设计一个拥有组合式 API 的 Vue 状态管理库。从那时起,我们就倾向于同时支持 Vue 2 和 Vue 3,并且不强制要求开发者使用组合式 API,我们的初心至今没有改变。除了安装SSR 两章之外,其余章节中提到的 API 均支持 Vue 2 和 Vue 3。虽然本文档主要是面向 Vue 3 的用户,但在必要时会标注出 Vue 2 的内容,因此 Vue 2 和 Vue 3 的用户都可以阅读本文档。

安装:npm install pinia

配置:src/main.ts

//引入 pinia 的 createPinia 创建 pinia
import {createPinia} from "pinia";

//创建 pinia实例
const pinia = createPinia();

//载入pinia到vue中
app.use(pinia);

使用:

准备案例

Count.vue


<template>
  <div class="count">
    <h2>当前求和为:{{ sum }}</h2>
    <select v-model.number="n">
      <option value="1">1</option>
      <option value="2">2</option>
      <option value="3">3</option>
    </select>
    <button @click="add">+</button>
    <button @click="minus">-</button>
  </div>
</template>

<script setup lang="ts" name="Count">
import {ref} from "vue";

//当前求和
let sum = ref(1);
//当前用户选择的数字
let n = ref(1);
const add = () => {
  sum.value += n.value;
}
const minus = () => {
  sum.value -= n.value;
}


</script>

<style scoped lang="css">
.count {
  background-color: skyblue;
  padding: 10px;
  border-radius: 10px;
  box-shadow: 0 0 10px;
}

select, button {
  margin: 0 5px;
  height: 25px;
}

</style>

Joke.vue

<template>
  <button @click="getJoke">获取笑话</button>
  <div class="joke" v-for="joke in jokeList" :key="joke.id">
    {{ joke.title }}
    <br/>
    {{ joke.content }}
  </div>

</template>

<script setup lang="ts" name="Joke">
import {reactive} from "vue";
import axios from "axios";

let jokeList = reactive([]);

const getJoke = async () => {
  let {data: {data: {content, title, id}}} = await axios.get("https://api.vvhan.com/api/text/joke?type=json");
  console.log(content, title, id)
  jokeList.unshift({id, title, content});
}
</script>

<style scoped>

.joke {
  margin-top:20px ;
  background-color: orange;
  padding: 10px;
  border-radius: 10px;
  box-shadow: 0 0 10px;
}
</style>

存储 + 读取数据

1.Store 是一个保存:状态、业务逻辑的实体,每个组件都可以读取、写入它。

它有三个概念:

state action getter 想等于组件中的:

data methods computed

1.创建Store配置文件

src/store/count.ts

import {defineStore} from 'pinia'



//创建并暴露 一个 Store
export const useCountStore = defineStore('count', {
    //状态
    state() {
        return {
            sum: 8,
            school: '猿究院',
            address: "北大街"
        }
    },
    //动作
    actions: {
        //定义方法  加
        increment(value: number) {
            // 定义业务逻辑
            if (this.sum < 10) {
                this.sum += value;
            }
        },
        decrement(value: number) {
            if (this.sum > 1) {
                this.sum -= value;
            }
        },
        changeData(sum: number, address: string) {
            this.sum = sum;
            this.address = address;
        }


    },
    //计算
    getters: {}
})




storeToRefs

作用:借用storeToRefs将store中的数据转换为ref对象,方便在模板中使用。

注意:

pinia提供storeToRefs只会将数据转换,而Vue的toRefs会转换store中的数据。

import {storeToRefs} from "pinia";

const jokeStore = useJokeStore()

let {jokeList} = storeToRefs(jokeStore);

 <div class="joke" v-for="joke in jokeList" :key="joke.id">
    {{ joke.title }}
    <br/>
    {{ joke.content }}
  </div>

getters

当state中的数据 ,需要经过处理在使用时,可以使用getters配置

//计算
getters: {
	bigSum: (state): number => state.sum * 10
}

使用
countStore.bigSum
let {bigSum} = storeToRefs(countStore);

$subscribe

通过 store的$subscribe() 方法侦听state的改变。

jokeStore.$subscribe((mutation, state) => {
  console.log("$subscribe",mutation, state);
})

store组合式写法

import {defineStore} from "pinia";
import {reactive} from "vue";
import axios from "axios";

export const useTalkStore = defineStore("talk", () => {

    const jokeList = reactive([]);

    async function getJoke() {
        let {data: {data: {content, title, id}}} = await axios.get("https://api.vvhan.com/api/text/joke?type=json");
        console.log(content, title, id)
        jokeList.unshift({id, title, content});
    }

    return {
        jokeList, getJoke
    }
});

使用 
// store 组合式写法
import {useTalkStore} from "@/store/joke2";

const talkStore = useTalkStore()

talkStore.getJoke()

console.log("talkStore :",talkStore.jokeList)


http://www.kler.cn/a/301966.html

相关文章:

  • 智能化护士排班系统的设计与实现(文末附源码)
  • 图像处理之cornerdetection(角点检测)综述
  • 释放高级功能:Nexusflows Athene-V2-Agent在工具使用和代理用例方面超越 GPT-4o
  • 论文精读(笔记)
  • 122、java的LambdaQueryWapper的条件拼接实现数据sql中and (column1 =1 or column1 is null)
  • RabbitMQ轻松构建高效可靠的消息队列系统
  • 电商API接口安全:构建稳固的数字防线
  • Web开发之Vue.js
  • 数据结构算法——排序算法
  • Xcode报错:No exact matches in reference to static method ‘buildExpression‘
  • 【C++ 面试 - 新特性】每日 3 题(十)
  • 如何优雅地处理 RabbitMQ 连接中断问题
  • 建筑板材的平整难题:矫平技术的革新解决方案
  • 【高性能】什么是QPS、RT?
  • 正则表达式之grep
  • Golang使用ReverseProxy实现反向代理
  • OpenCV 深度学习模块(DNN)识别手势
  • DevOps -CI/CD 与自动化部署
  • web基础之SSRF
  • 第L6周:机器学习-随机森林(RF)
  • JsonPath全英文文档学习
  • Oracle数据库中的动态SQL(Dynamic SQL)
  • 【python学习】深入掌握 Python RQ 任务队列库:全面处理异步任务的实战指南
  • JavaScript数据类型
  • CentOS 7 最小化安装后如何安装图形化桌面
  • 数据结构修炼——时间复杂度?空间复杂度?教你如何衡量算法的优劣!!