1.事件循环
- js是单线程,
- 看似同时做了多件事,实际上一件件来做的。
- 同步和异步
- setTimeout/setInterval/promise.then.catch nextTick
- 当同步代码和异步代码相遇,总是先把异步线程挂起,先执行完主线程里面的同步代码
- 异步代码推入了–任务队列,按照顺序挨个执行
- setTimeout(1,0)setTimeout(2,10)setTimeout(3,0)
- 宏任务和微任务
- 先执行当下队列的微任务队列中的所有任务,再执行宏任务中的所有任务
1,3,6,4,5,2
2.await和async
- 异步编程的终极解决方案
- 之前有回调函数和链式调用
- 用同步的方式写异步
- 成对出现,
await后边跟一个promise对象
await上的代码是同步代码
1243
export default{
methods:{
async test(){
//await下面的代码是resolve之后才执行的代码,如果进行了reject就会抛出错误,
//要用try-catch 进行捕获
await new Promise(()=>{})
}
}
}
跨域解决方案CORS
1.fetch()是啥
jsonp-多用于新闻类网站,前端和后端配合,不是ajax
script标签获取js的请求地址,返回一段代码,代码里面恰好有数据
代理:生产环境代理,
和开发环境代理:webpack或者是中间件,
目的跨域:避开浏览器的同源策略-只针对浏览器,俩个不同源的后端是不受影响的,自己的前端请求自己的后端,代替我们发起请求到目标服务器,返回出去,再返回前端,
浅拷贝和深拷贝,实现深拷贝的方法
浅拷贝:只是把数据的所有数据引用下来,他引用的是地址,所以拷贝的数据和原来的数据,一个改变,俩个都会改变。
关于登录模块,我使用element-ui来构建页面,当用户输入完账号和密码,点击登陆的时候,就会验证账号和密码是否为空,是否符合规则,如果符合就会发送axios请求,
有一个功能是记住密码:我选择把账号密码存在cookie里面,因为cookie里面接收账号密码和存储时间的参数。
权限管理:首先登录页面和404页面是不需要权限的,
调用登陆的方法,会获取一个token,然后把token存储在localStorage或者是cookie里面,设置路由守卫router.beforeEach,里面接收三个参数to from,next,如果要去的是登陆页面,那么直接放行,否则就判断是否有token,
然后用户登陆的时候,并且会返回一个权限标识
axios是基于promise的ajax封装库。
css面试题
伪类和伪元素:
伪类:单引号,基于dom操作,给选择器添加一些动态效果,
例子: :nth-child: (2n) nth(2n+1)
:first-child
:last-child
伪元素:双引号,创建dom,增加元素,比如在做精灵图或者是小图标的时候用
垂直居中:
设置padding上下内边距
line-height: 子元素和父元素高度相等(p标签自带margin,需要去掉),用于单行文字
弹性布局,flex-direction:column
jsutify-content:center
4.绝对定位 父元素:position:absolute
top:50%
transform
main.js中
1.引入vue
2.引入store文件夹
3.引入路由文件夹
4.引入根组件App
5.引入全局组件
params参数和query参数的区别
params参数不能和path一起使用,需要name:属性
params参数需要占位
Vue.use全局注册
Vuex状态持久化
1.在页面刷新之前,把数据存在localStorage里面,刷新之后从localStorage里面读取它赋给vuex
存在localStorage里面的是字符串,所以要
用JSON.stringIfy()将数据转化为Json字符串
JSON.parse将json字符串转化为js对象
es6新特性
- 新增let和const 是块级作用域 没有变量提升,const只读常量,声明就必须要赋值 如果const是一个对象,那么他里面的值是可以修改的。
- 模板字符串,反引号表示。可以嵌入变量用${}
3.箭头函数,没有自己的this,他的this是离自己最近的函数,如果没有就是window
4.解构赋值
5.拓展运算符
6.Set 数据结构,是一个构造函数,只允许里面的数据是唯一的
7 import和export
Promise
Promise是个构造函数
语法:1.接收一个函数做为参数
2.函数参数是俩个
new promise( (resolev,reject) = {})
Promise对象实例有俩个重要的属性
1.state:状态
2.result:结果
1.state:状态
pedding:等待,待解决
fullfiled:已成功
rejected:已拒绝 失败
2.Promise状态的改变
通过reject和resolve,只能有一种结果
3.promise的结果
4.构造函数的方法
then方法就是函数,参数和返回值
俩参数一个是成功回调,一个是失败回调
then的返回值是promise对象
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zDpdSi2r-1668402578660)(C:/Users/黄婷婷/AppData/Roaming/Typora/typora-user-images/image-20221028071658304.png)]
then方法返回的还是一个promise实例,状态时pedding
.then是同步的,但是.then里面的代码是异步的
用Promise解决回调地狱
系统事件,自定义事件
事件源,事件类型、事件回调
event
在组件里使用其他组件:1.引入 2.注册
axios二次封装
原因:需要一个 请求拦截器和响 应拦截器
首先创建一个axios实例
const requests = axios.create({
baseUrl:'',
timeOut:2000
})
请求拦截器
requests.interceptors.request.use(config) =>{
//config
return config
})
路由:path不可能和params一起使用
//路由传递参数:
//第一种:字符串形式 "/search/" + this.keyword 是params传参 "?k=" + this.keyword是query传参
// this.$router.push("/search/" + this.keyword + "?k=" + this.keyword) //编程式路由跳转
//第二种:模板字符串
// this.$router.push(`/search/${this.keyword}?k=${this.keyword}`)
//第三种:对象
// this.$router.push({ name: 'search', params: { keyword: this.keyword }, query: { k: this.keyword } })
//第二种:模板字符串
// this. r o u t e r . p u s h ( ‘ / s e a r c h / router.push(`/search/ router.push(‘/search/{this.keyword}?k=${this.keyword}`)
//第三种:对象
// this.$router.push({ name: ‘search’, params: { keyword: this.keyword }, query: { k: this.keyword } })