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的原理吗?有看过它的源码吗?
这篇文章主要讨论了axios的使用、原理以及源码分析。 文章中首先回顾了axios的基本用法,包括发送请求、请求拦截器和响应拦截器的使用,以及如何取消请求。接着,作者实现了一个简易版的axios,包括构造函数、请求方法、拦截器的实现等。最后,文章对axios的源码进行了分析,包括目录结构、核心文件axios.js的内容,以及axios实例化过程中的配置合并、拦截器的使用等。
【Vue面试题二十五】、你了解axios的原理吗?有看过它的源码吗?
|
1月前
|
JavaScript 前端开发
【Vue面试题二十七】、你了解axios的原理吗?有看过它的源码吗?
文章讨论了Vue项目目录结构的设计原则和实践,强调了项目结构清晰的重要性,提出了包括语义一致性、单一入口/出口、就近原则、公共文件的绝对路径引用等原则,并展示了单页面和多页面Vue项目的目录结构示例。
|
2月前
|
JavaScript
Vue中ref创建_基本类型的响应式数据,在Vue2的年代,数据配在data里,Vue3的区别是不把响应数据写在data里,那个数据是响应式的用ref包一下,let name = ref(“张三“)
Vue中ref创建_基本类型的响应式数据,在Vue2的年代,数据配在data里,Vue3的区别是不把响应数据写在data里,那个数据是响应式的用ref包一下,let name = ref(“张三“)
|
2月前
|
前端开发
Vue2和Vue3的区别,在setup中定义的数据,在data(){return中能否定义到},在setup我们不能用this,写在return中可以用this,但是不能在setup否则会报错
Vue2和Vue3的区别,在setup中定义的数据,在data(){return中能否定义到},在setup我们不能用this,写在return中可以用this,但是不能在setup否则会报错
|
6天前
|
JavaScript 索引
Vue 2和Vue 3的区别以及实现原理
Vue 2 的响应式系统通过Object.defineProperty来实现,它为对象的每个属性添加 getter 和 setter,以便追踪依赖并响应数据变化。
22 9
|
1月前
|
JSON JavaScript 前端开发
【Vue面试题二十四】、Vue项目中有封装过axios吗?主要是封装哪方面的?
这篇文章讨论了在Vue项目中封装axios的最佳实践,包括设置接口请求前缀、请求头、状态码、请求方法的封装,以及如何使用请求和响应拦截器来处理token和响应状态,从而简化HTTP请求的配置和错误处理,提高代码的可维护性。
【Vue面试题二十四】、Vue项目中有封装过axios吗?主要是封装哪方面的?
|
1月前
|
JavaScript 前端开发 搜索推荐
Vue 路由的hash模式和history模式有什么区别?
在Vue.js框架中,路由管理是单页面应用(SPA)不可或缺的功能。Vue 路由提供了两种模式:hash模式和history模式,这两种模式主要负责处理URL的变更而无需重新加载整个页面,实现前端路由的功能。
96 19
|
1月前
|
存储 JavaScript
在vue中_this和this的区别
这篇文章解释了在Vue框架中使用普通函数和箭头函数定义组件方法时`this`指向的区别,指出普通函数中的`this`指向Vue实例,而箭头函数中的`this`则指向其父级作用域,通常是`window`。
|
1月前
|
JavaScript 前端开发 安全
Vue学习之--------内置指令的使用【v-bind、v-model、v-for、v-on、v-if 、v-else、v-show、v-text。。。】(2022/7/19)
这篇文章详细介绍了Vue中常见的内置指令,如v-bind、v-model、v-for、v-on、v-if、v-else、v-show、v-text和v-html等,并通过代码示例演示了它们的使用和效果。
Vue学习之--------内置指令的使用【v-bind、v-model、v-for、v-on、v-if 、v-else、v-show、v-text。。。】(2022/7/19)
|
1月前
|
JavaScript 前端开发
Vue学习之--------绑定样式、条件渲染、v-show和v-if的区别(2022/7/12)
这篇博客文章讲解了Vue中绑定样式和条件渲染的方法,包括类样式绑定的不同写法、`v-show`和`v-if`的条件渲染区别以及它们的使用场景和特点,并通过代码实例和测试效果来展示具体应用。
Vue学习之--------绑定样式、条件渲染、v-show和v-if的区别(2022/7/12)