【5.0】vue请求函数和路由

devtools/2024/9/20 7:24:52/ 标签: vue.js, 前端, javascript

【5.0】vue请求函数和路由

  • 此处是与后端交互发送请求拿到数据,和vue自己中的页面跳转路由

【一】axios使用

【1】安装

  • 终端命令

    npm install axios -S
    

【2】基本语法

  • axios.get('后端地址(django)').then(res => {console.log(res.data.results)if (res.data.code == 0) {//请求成功,执行这里} else {alert('失败')}
    })
    

【3】axios请求成功,取数据

  • 数据位置

    .then(res => {console.log(res.data.results)...
    #真正有效的数据在res.data.results中
    
  • 赋值方法

    • 只要利用了结构数据的对应性
    const film_list = reactive({'results': []})
    const getfilm=()=>{axios.get('http://127.0.0.1:8000/films/films/').then(res => {console.log(res.data)// film_list.results=res.data.results//解构赋值// Object.assign(film_list.results, res.data.results)//解构赋值// let {results,code,msg}=res.data// Object.assign(film_list.results, results)//解构赋值// let {data:{results}}=res// Object.assign(film_list.results, results)//解构赋值// let {data}=res// Object.assign(film_list, data)})}
    

【二】async和await

【1】介绍

  • 两者搭配,定义了一个携程函数,如果函数中有io操作,就写await,之前then中的值,可以直接复制给一个变量
  • 其实就是并发的操作,先去发送请求,这边也在等着接收数据,如果成功了就把数据拿过来,不成功就提示错误,而不是一步等一步执行

【2】使用

  • async function load() {//将需要执行一会的函数变成waitlet res = await axios.get('http://127.0.0.1:8000/films/films/')Object.assign(film_list.results, res.data.results)
    }
    load()
    

【3】使用二:有正确和错误两个路

  • 下面的例子是套娃,func2是根据func1的结果进行走的,同样可以定义func3接收func2的结果

  • 		async function fun1(){return 10}async function fun2(){try{let res = await fun1()//let res = await Promise.reject("something wrong")}catch(e){console.log("catch got:"+e)   }console.log("await got:"+res)}fun2()
    

【三】promise语法

【1】介绍

  • # 前端中的异步编程技术,多线程+线程结果回调!# Promise 是异步编程的一种解决方案,比传统的解决方案——回调函数和事件——更合理和更强大。它由社区最早提出和实现,ES6将其写进了语言标准,统一了用法,原生提供了Promise对象。# 所谓Promise,简单说就是一个容器,里面保存着某个未来才会结束的事件(通常是一个异步操作)的结果。从语法上说,Promise 是一个对象,从它可以获取异步操作的消息。Promise 提供统一的 API,各种异步操作都可以用同样的方法进行处理。# Promise对象有以下两个特点。(1)Promise对象代表一个异步操作,有三种状态:`Pending`(进行中)、`Resolved`(已完成,又称 Fulfilled)和`Rejected`(已失败)。只有异步操作的结果,可以决定当前是哪一种状态,任何其他操作都无法改变这个状态。这也是`Promise`这个名字的由来,它的英语意思就是“承诺”,表示其他手段无法改变。(2)一旦状态改变,就不会再变,任何时候都可以得到这个结果。Promise对象的状态改变,只有两种可能:从`Pending`变为`Resolved`和从`Pending`变为`Rejected`。只要这两种情况发生,状态就凝固了,不会再变了,会一直保持这个结果。# 生活中案例
    你跟你女朋友说,5年后等我赚够500w就结婚--》定义函数​ -1 进行中(努力赚钱,其他代码继续执行)​ -2 成功(赚够500w---》结婚)​ -3 失败(没赚够---》分手)
    
  • 总结:一个请求要转一小会,请求回来只有成功和不成功两条路,我们可以预判,并给出两条路,成功了resolve走一个代码,失败了reject和err走另一个代码

【2】promise运行的两个结果

  • 1.实例化promise对象,并且执行(类似Java创建线程对象,并且start)
    参数: resolve,reject随意命名,但是一般这么叫!
    参数: resolve,reject分别处理成功和失败的两个函数! 成功resolve(结果)  失败reject(结果)
    参数: 在function中调用这里两个方法,那么promise会处于两个不同的状态
    状态: promise有三个状态
    pending   正在运行
    resolved  内部调用了resolve方法
    rejected  内部调用了reject方法
    参数: 在第二步回调函数中就可以获取对应的结果 
    
    2.获取回调函数结果  then在这里会等待promise中的运行结果,但是不会阻塞代码继续运行
    

【3】promise代码

  •  <script>//【1】函数编程了promise函数,开始初步执行let promise =new Promise(function(resolve,reject){console.log("promise 开始执行")//执行后的三个结果(此处可以放代码,其运行结果也就下面三种)throw new Error("error message")resolve("promise 执行成功")reject("promise 执行失败")})//【2】请求过去了,开始等,并走下一步console.log('11111')//【3】这边是门口等待结果的promise.then(function(value){console.log(`promise中执行了resolve:${value}`)},function(error){console.log(`promise中执行了reject:${error}`)})//【4】其他代码console.log('222222')</script>
    
    1 console.log("promise 开始执行")
    2 console.log('11111')
    3 console.log('222222')
    4 promise执行成功或失败打印的代码
    

【4】catch情况

  • 就是将上面then中成功和不成功的结果分开,then只走成功的,catch走不成功的

    ...
    promise.then(function(resolveValue){console.log(`promise中执行了resolve:${resolveValue}`)}).catch(function(error){console.log(error)} )
    

【三】async和promise搭配

【1】介绍

  • async函数的结果会变成promise对象,通过promise可以对两种情况进行接收
  • 成功了就走promise的then,不成功走promise的catch

【2】使用

  • 先定义async类的函数,在将函数赋给一个promise对象,接收它的执行情况

  •     	async function fun1(){//return 10   // 成功状态,走then//throw new Error("异常状态,走catch")//let promise = Promise.resolve("成功状态,走then")let promise = Promise.reject("失败状态,走catch")return promise--(其实就是return正确和错误的结果)}//将async对象赋值给promise对象let promise =fun1()promise.then(function(value){console.log("success:"+value)}).catch(function(value){console.log("fail:"+value)})
    

【四】vue-router插件

  • 如果在创建的时候没有选择router,可以安装vue-router插件

    安装插件--创建router->index.js-->导入插件-->在main.js中使用
    

【1】安装

  • # 1 需要使用 vue-router 4版本及以上npm install -S vue-router@4
    

【2】路由跳转

  • 需要从vue-router导入,拿到这个类,然后实例化出router和route,可以对跳转路径和当前路径操作

    import {useRouter, useRoute} from 'vue-router'
    let router=useRouter() --控制路径跳转
    let route=useRoute() --控制当前的路径
    
  • 使用

    router.push('path名')
    

【3】前置路由守卫

  • router.beforeEach((to, from, next) => {//to 是目标地包装对象  .path属性可以获取地址//from 是来源地包装对象 .path属性可以获取地址//next是方法,不调用默认拦截! next() 放行,直接到达目标组件//next('/地址')可以转发到其他地址,到达目标组件前会再次经过前置路由守卫console.log(to.path, from.path, next)//需要判断,注意避免无限重定向if (to.name == 'home' || to.name == 'login') {next()} else {let token = localStorage.getItem('token')if (token) {next()} else {next('/login')}}
    })
    

【五】pinia任务管理器

【1】介绍

  • 和vuex一样,相当于一个大容器和任务分配
  • 有专门存放数据的地方,有真正执行函数的地方,和vuex相比少了一个任务分配的过程

【2】管理器语法

  • import {defineStore} from 'pinia'export const definedStore = defineStore({id: 'storePinia', //必须唯一state: () => { // state中用于定义数据return {....}},getters: {// 用于定义一些通过数据计算而得到结果的一些方法 一般在此处不做对数据的修改操作 },actions: { // 用于定义一些对数据修改的方法 }} })
    
  • definedStore和id名字相关联,就类似一类人(用户/商品这种),数据就可以分类存放在不同的任务管理器中了

【3】创建pinia对象

  • #### 2 main.js
    import {createApp} from 'vue'
    import './style.css'
    import App from './App.vue'
    import router from "./router";// 导pinia
    import {createPinia} from 'pinia'
    // 创建pinia对象
    let pinia = createPinia()
    createApp(App).use(router).use(pinia).mount('#app')
    
  • 创建store文件夹

    store--definedStore--definedGoods
    #不同的文件夹,是不同的任务管理器
    
    #文件中,创造一个任务管理器
    import {defineStore} from 'pinia'export const definedStore = defineStore({id: 'storePinia', //必须唯一state: () => { // state中用于定义数据return {....}},getters: {// 用于定义一些通过数据计算而得到结果的一些方法 一般在此处不做对数据的修改操作 },actions: { // 用于定义一些对数据修改的方法 }} })
    

【六】elementui-plus

  • 安装

    npm install element-plus -S
    
  • 配置

    import ElementPlus from 'element-plus'
    import 'element-plus/dist/index.css'createApp(App).use(router).use(pinia).use(ElementPlus).mount('#app')
    
  • 使用

    https://element-plus.org/zh-CN/component/popover.html
    #直接从该地址复制粘贴即可
    

http://www.ppmy.cn/devtools/97220.html

相关文章

ArrayList详解

简介 【概述】 List的主要实现类&#xff0c;底层使用Object[]存储&#xff0c;适用于频繁的查找工作&#xff0c;线程不安全。 【特点】 增删慢&#xff1a;每次删除元素&#xff0c;都需要更改数组长度、拷贝以及移动元素位置&#xff1b;查询快&#xff1a;由于数组在内…

SSM学生社团管理系统—计算机毕业设计源码20360

目 录 摘要 1 绪论 1.1 研究背景 1.2 研究意义 1.3论文结构与章节安排 2 学生社团管理系统系统分析 2.1 可行性分析 2.2 系统流程分析 2.2.1 数据增加流程 2.2.2 数据修改流程 2.2.3 数据删除流程 2.3 系统功能分析 2.3.1 功能性分析 2.3.2 非功能性分析 2.4 系…

YouTube最好用的翻译插件

相信很多同学和我一样&#xff0c;想看YouTube视频时发现基本上都说英文&#xff0c;以我的英文水平&#x1f923;去观看真是一言难尽&#xff0c;所以就想着看能不能在谷歌浏览器上找一个插件来进行翻译&#xff0c;结果还真让我找到了一个不错的Youtube翻译插件&#xff0c;它…

AI大模型高效题库生成:业务人效提升的强大助力

一 现状问题 1、培训考核涉及的文件数量较多 当前&#xff0c;京东航空公司维修部门面临着人员规模的快速增长和持续的培训需求。根据民航局的规定&#xff0c;维修培训必须确保所有维修人员都能够完成对飞机维修相关文件的学习&#xff0c;这包括维修方案、维修工程管理手册…

Anaconda环境迁移之conda pack

目录 1. conda pack安装2. 环境打包3. 拷贝环境包到目标电脑4. 激活环境5. 大功告成 1. conda pack安装 源电脑安装conda pack conda install conda-pack2. 环境打包 假如环境名为test&#xff0c;那么打包命令如下&#xff1a; conda pack -n test -o test.tar.gz打包后的…

使用Python+MoviePy给视频添加字幕或水印

一、使用CompositeVideoClip将使用TextClip创建文字类与视频叠加在一起&#xff0c;给视频添加字幕或水印 from moviepy.editor import *# 从本地载入视频myHolidays.mp4&#xff0c;并截取00:00:50 - 00:00:60部分 clip VideoFileClip("/home/Download/Mojito.mp4"…

如果忘记了 Apple ID 密码,如何重设

“我忘记了我的 Apple ID 密码&#xff0c;如何恢复我的帐户&#xff1f;”为了方便用户&#xff0c;Apple 允许每个人使用唯一的 Apple ID 和密码激活设备并访问所有 Apple 服务。然而&#xff0c;实际上&#xff0c;手动选择某项并忘记它似乎很容易。例如&#xff0c;许多 Ap…

带你速通C语言——指针(10)

指针是C语言中最强大但也最容易引起困惑的概念之一。它们直接关联内存管理&#xff0c;使得程序员可以高效地操作数据和内存。下面我将尽量以简单明了的方式介绍指针的基本概念。 1.指针基础 指针本质上是存储内存地址的变量&#xff0c;这个地址指向一个值。通过指针&#xf…

Vue中调整组件的高度及其他样式

在Vue组件中&#xff0c;如果想让一个组件如<MapContainer />变长&#xff0c;你可以使用CSS来调整它的高度。以下是一些可能的方法&#xff1a; 设置固定高度&#xff1a;直接给<MapContainer />组件设置一个高度值。 .MapContainer {height: 300px; /* 你可以根据…

论文中绘制神经网络工具汇总

论文中绘制神经网络工具汇总_convnetdraw-CSDN博客 这哥们总结的还是比较全面的&#xff01;

MongoDB如何实现大于小于查询

MongoDB是一个高性能、开源、无模式的文档型数据库&#xff0c;它使用BSON&#xff08;Binary JSON&#xff09;作为存储格式&#xff0c;支持丰富的查询语法&#xff0c;包括大于&#xff08; g t &#xff09;、小于&#xff08; gt&#xff09;、小于&#xff08; gt&#x…

RabbitMQ-消息队列延迟队列二

1、安装rabbitmq 怎么安装rabbitmq请查看之前课程&#xff0c;如果已经安装&#xff0c;请略过此步。 2、创建vendor文件夹或是直接采用PHP框架 mkdir vendor 3、进入文件 cd vendor 4、安装php扩展 composer require php-amqplib/php-amqplib 5、进入上级创建delay文件…

豆瓣评分8.6!Python社区出版的Python故事教程,太强了!

Python 是活力四射的语言&#xff0c;是不断发展中的语言。就连使用 Python 多年的行者也不敢说对 Python 的方方面面都了解并可以自由运用&#xff0c;想必读者可能更加无法快速掌握所有重点技巧了。 今天给小伙伴们分享的这份手册是用互动的开发故事来探讨Pyfhonic开发的故事…

Spring之@Bean注解

1. 使用方式 1.1 Configuration Bean 1.1.1 创建实体类 User Data NoArgsConstructor public class User {private String name;public User(String name) {this.name name;} } 1.1.2 创建配置类 UserConfig Configuration public class UserConfig {Beanpublic User us…

图片加载的区域显示

问题描述: 一个imageview 控件宽高 640*280 ,通过glide加载要显示的图片,,图片始终显示在imageview 的右边和下边,图片的宽高可能小于或者大于imageview 控件的宽高,如何在imageview 显示图片:如果图片的宽高大于imageview 的宽高可以只显示图片对应的右下部分(此时imageview …

C++:list类(迭代器)

目录 前言 数据结构 push_back push_front 默认构造函数 拷贝构造函数 list迭代器 结构 构造函数 *运算符重载 ->运算符重载 前置运算符重载 后置运算符重载 前置--运算符重载 后置--运算符重载 !运算符重载 运算符重载 list迭代器完整代码 begin和end …

【Leetcode 1189 】 “气球” 的最大数量 —— 数组模拟哈希表

给你一个字符串 text&#xff0c;你需要使用 text 中的字母来拼凑尽可能多的单词 "balloon"&#xff08;气球&#xff09;。 字符串 text 中的每个字母最多只能被使用一次。请你返回最多可以拼凑出多少个单词 "balloon"。 示例 1&#xff1a; 输入&#…

mysql:表的约束(空属性,默认值,comment,zerofill,主键,唯一键,外键)

目录 表的约束 空属性 默认值(defualut) comment:列描述 zerofill &#xff1a;显示约束 主键 自增长&#xff1a;auto_increment 唯一键 外键 查询数据 表的约束 真正约束字段的是数据类型&#xff0c;但是数据类型约束很单一&#xff0c;需要有一些额外的约束&…

第22天笔记

C语言编译步骤 预处理 编译 汇编 链接 什么是预处理 预处理就是在源文件&#xff08;如.c文件&#xff09;编译之前&#xff0c;所进行的一部分预备操作&#xff0c;这部分操作是由预处理 程序自动来完成&#xff1b;当源文件在编译时&#xff0c;编译器会自动调用预处理程…

[游戏开发] LuaTable转string存读二进制文件

UE5和Unity通用此方案&#xff0c;只不过读写文件的接口略有不同&#xff0c;lua代码的处理是相同的。 下面两个方法是 LuaTable和字符串互相转换的代码 function XUtils.luaTableToString(tab, sp)sp sp or ""local s ""for k,v in pairs(tab) doif t…