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)

 }

})


目录
相关文章
|
22天前
|
JavaScript
Vue中Axios网络请求封装-企业最常用封装模式
本教程介绍如何安装并配置 Axios 实例,包含请求与响应拦截器,实现自动携带 Token、错误提示及登录状态管理,适用于 Vue 项目。
44 1
|
6月前
|
存储 算法 架构师
阿里面试:PS+PO、CMS、G1、ZGC区别在哪?什么是卡表、记忆集、联合表?问懵了,尼恩来一个 图解+秒懂+史上最全的答案
阿里面试:PS+PO、CMS、G1、ZGC区别在哪?什么是卡表、记忆集、联合表?问懵了,尼恩来一个 图解+秒懂+史上最全的答案
|
9月前
|
Java 程序员 调度
Java 高级面试技巧:yield() 与 sleep() 方法的使用场景和区别
本文详细解析了 Java 中 `Thread` 类的 `yield()` 和 `sleep()` 方法,解释了它们的作用、区别及为什么是静态方法。`yield()` 让当前线程释放 CPU 时间片,给其他同等优先级线程运行机会,但不保证暂停;`sleep()` 则让线程进入休眠状态,指定时间后继续执行。两者都是静态方法,因为它们影响线程调度机制而非单一线程行为。这些知识点在面试中常被提及,掌握它们有助于更好地应对多线程编程问题。
351 9
|
9月前
|
安全 Java 程序员
Java面试必问!run() 和 start() 方法到底有啥区别?
在多线程编程中,run和 start方法常常让开发者感到困惑。为什么调用 start 才能启动线程,而直接调用 run只是普通方法调用?这篇文章将通过一个简单的例子,详细解析这两者的区别,帮助你在面试中脱颖而出,理解多线程背后的机制和原理。
367 12
|
9月前
|
编译器 Android开发 开发者
Android经典面试题之Kotlin中Lambda表达式和匿名函数的区别
Lambda表达式和匿名函数都是Kotlin中强大的特性,帮助开发者编写简洁而高效的代码。理解它们的区别和适用场景,有助于选择最合适的方式来解决问题。希望本文的详细讲解和示例能够帮助你在Kotlin开发中更好地运用这些特性。
158 9
|
10月前
|
Java
Java社招面试题:& 和 && 的区别,HR的套路险些让我翻车!
今日分享的主题是如何区分&和&&的区别,提高自身面试的能力。主要分为以下四部分。 1、自我面试经历 2、&amp和&amp&amp的不同之处 3、&对&&的不同用回答逻辑解释 4、彩蛋
|
11月前
|
Java 程序员
Java社招面试题:& 和 && 的区别,HR的套路险些让我翻车!
小米,29岁程序员,分享了一次面试经历,详细解析了Java中&和&&的区别及应用场景,展示了扎实的基础知识和良好的应变能力,最终成功获得Offer。
226 14
|
10月前
|
Java 关系型数据库 数据库
京东面试:聊聊Spring事务?Spring事务的10种失效场景?加入型传播和嵌套型传播有什么区别?
45岁老架构师尼恩分享了Spring事务的核心知识点,包括事务的两种管理方式(编程式和声明式)、@Transactional注解的五大属性(transactionManager、propagation、isolation、timeout、readOnly、rollbackFor)、事务的七种传播行为、事务隔离级别及其与数据库隔离级别的关系,以及Spring事务的10种失效场景。尼恩还强调了面试中如何给出高质量答案,推荐阅读《尼恩Java面试宝典PDF》以提升面试表现。更多技术资料可在公众号【技术自由圈】获取。
|
11月前
|
存储 缓存 网络协议
计算机网络常见面试题(二):浏览器中输入URL返回页面过程、HTTP协议特点,GET、POST的区别,Cookie与Session
计算机网络常见面试题(二):浏览器中输入URL返回页面过程、HTTP协议特点、状态码、报文格式,GET、POST的区别,DNS的解析过程、数字证书、Cookie与Session,对称加密和非对称加密
|
12月前
|
前端开发 JavaScript 安全
在vue前端开发中基于refreshToken和axios拦截器实现token的无感刷新
在vue前端开发中基于refreshToken和axios拦截器实现token的无感刷新
1120 4