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)

 }

})


目录
相关文章
|
9天前
|
JavaScript
VUE学习二:事件监听(v-on)、条件判断(v-if/v-else-if/v-else)、循环遍历(v-for)
这篇文章是关于Vue.js的学习指南,涵盖了事件监听、条件判断、循环遍历、数组方法响应性、案例分析以及高阶函数的使用。
45 2
VUE学习二:事件监听(v-on)、条件判断(v-if/v-else-if/v-else)、循环遍历(v-for)
|
1月前
|
JavaScript
在 Vue 3 组件通信方式中,Provide / Inject 与 Vuex 的区别是什么?
在 Vue 3 组件通信方式中,Provide / Inject 与 Vuex 的区别是什么?
124 65
|
5天前
|
JavaScript 前端开发 开发者
Vue v-for 进阶指南:in 与 of 的区别及应用场景 | 笔记
Vue.js 中的 v-for 是强大的遍历指令,但其中的 in 和 of 关键字往往被开发者忽视。尽管它们的用法相似,但适用的场景和数据结构却各有不同。本文将详细探讨 v-for 中 in 和 of 的区别、适用场景以及在实际开发中的最佳使用时机。通过理解它们的差异,你将能够编写更加高效、简洁的 Vue.js 代码,灵活应对各种数据结构的遍历需求。
40 6
|
2天前
|
缓存 JavaScript
Vue 中 computed 与 method 的区别
【10月更文挑战第15天】computed 和 method 是 Vue 中两个重要的选项,它们在功能和特点上存在着明显的区别。理解并合理运用它们的区别,可以帮助我们构建更高效、更具可维护性的 Vue 应用。在实际开发中,要根据具体情况灵活选择使用,以满足不同的需求。
5 2
|
4天前
|
JavaScript 前端开发
Vue 2 和 Vue 3 之间响应式区别
10月更文挑战第7天
18 2
|
10天前
|
数据可视化 JavaScript 前端开发
低代码可视化工具--vue条件判断v-if可视化设置-代码生成器
低代码可视化工具--vue条件判断v-if可视化设置-代码生成器
26 2
|
1月前
|
缓存 JavaScript 前端开发
vue-day02计算属性,v-bind,v-if,v-for
文章介绍了Vue.js中的计算属性、class与style的绑定、条件渲染和列表渲染的使用。通过示例代码展示了如何使用计算属性简化模板逻辑、如何通过v-bind动态绑定class和style、如何使用v-if进行条件渲染以及如何使用v-for进行列表渲染。这些特性使得Vue.js在构建动态用户界面时更加灵活和强大。
vue-day02计算属性,v-bind,v-if,v-for
|
19天前
|
编译器
经典面试题:变量的声明和定义有什么区别
在编程领域,变量的“声明”与“定义”是经典面试题之一。声明告诉编译器一个变量的存在,但不分配内存,通常包含变量类型和名称;而定义则为变量分配内存空间,一个变量必须至少被定义一次。简而言之,声明是告知变量形式,定义则是实际创建变量并准备使用。
|
18天前
|
XML 前端开发 Java
Spring,SpringBoot和SpringMVC的关系以及区别 —— 超准确,可当面试题!!!也可供零基础学习
本文阐述了Spring、Spring Boot和Spring MVC的关系与区别,指出Spring是一个轻量级、一站式、模块化的应用程序开发框架,Spring MVC是Spring的一个子框架,专注于Web应用和网络接口开发,而Spring Boot则是对Spring的封装,用于简化Spring应用的开发。
54 0
Spring,SpringBoot和SpringMVC的关系以及区别 —— 超准确,可当面试题!!!也可供零基础学习
|
5天前
|
JavaScript 算法 前端开发
在Vue开发中v-if指令和v-show指令的使用介绍,v-if和v-for的优先级以及使用注意事项的介绍
在Vue开发中v-if指令和v-show指令的使用介绍,v-if和v-for的优先级以及使用注意事项的介绍
8 0