vue相关面试题3:1.v-show和v-if区别;2.常用修饰符;3.axios

简介: 设置请求头与超时时间大部分情况下,请求头都是固定的,只有少部分情况下,会需要一些特殊的请求头,这里将普适性的请求头作为基础配置。当需要特殊请求头时,将特殊请求头作为参数传入,覆盖基础配置

文章目录

Vue中的v-show和v-if有什么区别

Vue常用的修饰符有哪些?分别有什么应用场景?

Vue项目中有封装过axios吗?怎么封装的?

一、axios是什么

基本使用

二、为什么要封装

三、如何封装

Vue中的v-show和v-if有什么区别

一、v-show与v-if的共同点

我们都知道在 vue 中 v-show 与 v-if 的作用效果是相同的(不含v-else),都能控制元素在页面是否显示

在用法上也是相同的


<Model v-show="isShow" />

<Model v-if="isShow" />

1

2

当表达式为true的时候,都会占据页面的位置

当表达式都为false时,都不会占据页面位置


二、v-show与v-if的区别

控制手段:v-show隐藏则是为该元素添加css–display:none,dom元素依旧还在。v-if显示隐藏是将dom元素整个添加或删除


编译过程:v-if切换有一个局部编译/卸载的过程,切换过程中合适地销毁和重建内部的事件监听和子组件;v-show只是简单的基于css切换


编译条件:v-if是真正的条件渲染,它会确保在切换过程中条件块内的事件监听器和子组件适当地被销毁和重建。只有渲染条件为假时,并不做操作,直到为真才渲染


v-show 由false变为true的时候不会触发组件的生命周期

v-if由false变为true的时候,触发组件的beforeCreate、create、beforeMount、mounted钩子,由true变为false的时候触发组件的beforeDestory、destoryed方法

性能消耗:v-if有更高的切换消耗;v-show有更高的初始渲染消耗;


v-show与v-if的使用场景

v-if 与 v-show 都能控制dom元素在页面的显示

v-if 相比 v-show 开销更大的(直接操作dom节点增加与删除)

如果需要非常频繁地切换,则使用 v-show 较好

如果在运行时条件很少改变,则使用 v-if 较好


Vue常用的修饰符有哪些?分别有什么应用场景?

修饰符是用于限定类型以及类型成员的声明的一种符号

在Vue中,修饰符处理了许多DOM事件的细节,让我们不再需要花大量的时间去处理这些烦恼的事情,而能有更多的精力专注于程序的逻辑处理


vue中修饰符分为以下五种:

表单修饰符

事件修饰符

鼠标按键修饰符

键值修饰符

v-bind修饰符


表单修饰符

lazy

在我们填完信息,光标离开标签的时候,才会将值赋予给value,也就是在change事件之后再进行信息同步

trim

自动过滤用户输入的首空格字符,而中间的空格不会过滤

number

自动将用户的输入值转为数值类型,但如果这个值无法被parseFloat解析,则会返回原来的值


事件修饰符

stop

阻止了事件冒泡,相当于调用了event.stopPropagation方法

prevent

阻止了事件的默认行为,相当于调用了event.preventDefault方法

self

只当在 event.target 是当前元素自身时触发处理函数

once

绑定了事件以后只能触发一次,第二次就不会触发

capture

使事件触发从包含这个元素的顶层开始往下触发

passive

在移动端,当我们在监听元素滚动事件的时候,会一直触发onscroll事件会让我们的网页变卡,因此我们使用这个修饰符的时候,相当于给onscroll事件整了一个.lazy修饰符

native

让组件变成像html内置标签那样监听根元素的原生事件,否则组件上使用 v-on 只会监听自定义事件


鼠标按钮修饰符

left 左键点击

right 右键点击

middle 中键点击


Vue项目中有封装过axios吗?怎么封装的?

一、axios是什么

axios 是一个轻量的 HTTP客户端

基于 XMLHttpRequest 服务来执行 HTTP 请求,支持丰富的配置,支持 Promise,支持浏览器端和 Node.js 端。自Vue2.0起,尤大宣布取消对 vue-resource 的官方推荐,转而推荐 axios。现在 axios 已经成为大部分 Vue 开发者的首选


特性

●从浏览器中创建 XMLHttpRequests

●从 node.js 创建 http请求

●支持 Promise API

●拦截请求和响应

●转换请求数据和响应数据

●取消请求

●自动转换 JSON 数据

●客户端支持防御XSRF


基本使用

安装


npm install axios --S

1

导入


import axios from 'axios'

1

发送请求


axios({        

 url:'xxx',    // 设置请求的地址

 method:"GET", // 设置请求方法

 params:{      // get请求使用params进行参数凭借,如果是post请求用data

   type: '',

   page: 1

 }

}).then(res => {  

 // res为后端返回的数据

 console.log(res);  

})

1

2

3

4

5

6

7

8

9

10

11

二、为什么要封装

axios 的 API 很友好,你完全可以很轻松地在项目中直接使用。

不过随着项目规模增大,如果每发起一次HTTP请求,就要把这些比如设置超时时间、设置请求头、根据项目环境判断使用哪个请求地址、错误处理等等操作,都需要写一遍

这种重复劳动不仅浪费时间,而且让代码变得冗余不堪,难以维护。为了提高我们的代码质量,我们应该在项目中二次封装一下 axios 再使用


三、如何封装

设置接口请求前缀

利用node环境变量来作判断,用来区分开发、测试、生产环境


if (process.env.NODE_ENV === 'development') {

 axios.defaults.baseURL = 'http://dev.xxx.com'

} else if (process.env.NODE_ENV === 'production') {

 axios.defaults.baseURL = 'http://prod.xxx.com'

}

1

2

3

4

5

在本地调试的时候,还需要在vue.config.js文件中配置devServer实现代理转发,从而实现跨域


devServer: {

   proxy: {

     '/proxyApi': {

       target: 'http://dev.xxx.com',

       changeOrigin: true,

       pathRewrite: {

         '/proxyApi': ''

       }

     }

   }

 }

1

2

3

4

5

6

7

8

9

10

11

设置请求头与超时时间

大部分情况下,请求头都是固定的,只有少部分情况下,会需要一些特殊的请求头,这里将普适性的请求头作为基础配置。当需要特殊请求头时,将特殊请求头作为参数传入,覆盖基础配置


const service = axios.create({

   ...

   timeout: 30000,  // 请求 30s 超时

     headers: {

       get: {

         'Content-Type': 'application/x-www-form-urlencoded;charset=utf-8'

         // 在开发中,一般还需要单点登录或者其他功能的通用请求头,可以一并配置进来

       },

       post: {

         'Content-Type': 'application/json;charset=utf-8'

         // 在开发中,一般还需要单点登录或者其他功能的通用请求头,可以一并配置进来

       }

 },

})

1

2

3

4

5

6

7

8

9

10

11

12

13

14

封装请求方法

先引入封装好的方法,在要调用的接口重新封装成一个方法暴露出去


// get 请求

export function httpGet({

 url,

 params = {}

}) {

 return new Promise((resolve, reject) => {

   axios.get(url, {

     params

   }).then((res) => {

     resolve(res.data)

   }).catch(err => {

     reject(err)

   })

 })

}


// post

// post请求

export function httpPost({

 url,

 data = {},

 params = {}

}) {

 return new Promise((resolve, reject) => {

   axios({

     url,

     method: 'post',

     transformRequest: [function (data) {

       let ret = ''

       for (let it in data) {

         ret += encodeURIComponent(it) + '=' + encodeURIComponent(data[it]) + '&'

       }

       return ret

     }],

     // 发送的数据

     data,

     // url参数

     params


   }).then(res => {

     resolve(res.data)

   })

 })

}


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

把封装的方法放在一个api.js文件中


import { httpGet, httpPost } from './http'

export const getorglist = (params = {}) => httpGet({ url: 'apps/api/org/list', params })

1

2

页面中就能直接调用


import { getorglist } from '@/assets/js/api'


getorglist({ id: 200 }).then(res => {

 console.log(res)

})

1

2

3

4

5

请求拦截器


axios.interceptors.request.use(

 config => {

   // 每次发送请求之前判断是否存在token

   // 如果存在,则统一在http请求的header都加上token,这样后台根据token判断你的登录情况,此处token一般是用户完成登录后储存到localstorage里的

   hl-&& (config.headers.Authorization = token)

   return config

 },

 error => {

   return Promise.error(error)

 })

1

2

3

4

5

6

7

8

9

10

响应拦截器

响应拦截器可以在接收到响应后先做一层操作,如根据状态码判断登录状态、授权


axios.interceptors.response.use(response => {

 // 如果返回的状态码为200,说明接口请求成功,可以正常拿到数据

 // 否则的话抛出错误

 if (response.status === 200) {

   if (response.data.code === 511) {

     // 未授权调取授权接口

   } else if (response.data.code === 510) {

     // 未登录跳转登录页

   } else {

     return Promise.resolve(response)

   }

 } else {

   return Promise.reject(response)

 }

}, error => {

 // 我们可以在这里对异常状态作统一处理

 if (error.response.status) {

   // 处理请求失败的情况

   // 对不同返回码对相应处理

   return Promise.reject(error.response)

 }

})


目录
相关文章
|
1月前
|
JavaScript
vue封装axios(用interceptors封装)
vue封装axios(用interceptors封装)
13 0
|
1月前
|
JSON 前端开发 JavaScript
3分钟让你学会axios在vue项目中的基本用法(建议收藏)
3分钟让你学会axios在vue项目中的基本用法(建议收藏)
78 0
|
2月前
|
JavaScript
在vue中,v-show 与 v-if 有什么区别?
在vue中,v-show 与 v-if 有什么区别?
25 4
|
19天前
|
JSON JavaScript 前端开发
< 每日份知识快餐:axios是什么?如何在Vue中 封装 axios ? >
本文介绍了前端开发中常用的HTTP客户端库Axios,它基于Promise,支持浏览器和Node.js,特点是功能强大、支持Promise API和并发请求,并能拦截请求和响应。文章强调了理解Axios的内部原理和优化使用的重要性,不仅讲解了基本的安装、导入和使用方法,还阐述了为何选择Axios,包括其丰富的配置选项和良好的浏览器支持。此外,文章探讨了封装Axios的必要性,以减少重复代码和提高代码维护性,并给出了设置接口请求前缀、请求头、超时时间以及封装请求方法和拦截器的示例。通过封装,开发者可以更高效地管理和使用Axios,适应不同项目需求。
|
25天前
|
JSON 前端开发 JavaScript
Vue+Axios+SpringBoot后端同时接收文件和json作为请求参数
Vue+Axios+SpringBoot后端同时接收文件和json作为请求参数
38 0
|
1月前
|
前端开发 应用服务中间件 nginx
Vue+SpringBoot+Axios的跨域问题
Vue+SpringBoot+Axios的跨域问题
20 0
|
1月前
|
JavaScript
vue element upload组件配合axios实现用 “Content-Type“: “multipart/form-data“上传方式导入xls文件
vue element upload组件配合axios实现用 “Content-Type“: “multipart/form-data“上传方式导入xls文件
|
1月前
|
JavaScript 数据格式
Vue axios请求拦截和相应拦截
Vue axios请求拦截和相应拦截
14 2
|
1月前
|
JavaScript API
Vue中axios拦截器怎么使用
Vue中axios拦截器怎么使用
|
2月前
|
Web App开发 前端开发 JavaScript
Spring Boot整合 mybatisplus(后端) Vue+echarts+Element UI+axios(前端)---前后端项目实例demo
Spring Boot整合 mybatisplus(后端) Vue+echarts+Element UI+axios(前端)---前后端项目实例demo
34 1