阻止事件冒泡
- .prevent
阻止事件默认行为
- .once
只触发一次回调
- .native
监听组件根元素的原生事件
很重要!有些第三方组件可能内部并没有设置原生的事件 就可以通过.native来触发事件
面试问及
之前在使用饿了么UI的时候给一个组件添加一个原生的事件
但是一直触发不了
后面查阅文档发现这个组件内部并没有注册我使用的原生事件
事件修饰符.native就可以直接监听并触发组件的原生事件
- .capture
添加事件侦听器时使用 capture 模式
- .{keyCode | keyAlias}
只当事件是从特定键触发时才触发回调
- .left
(2.2.0版本) 只当点击鼠标左键时才触发
- .right
(2.2.0版本) 只当点击鼠标右键时才触发
- .middle
(2.2.0版本) 只当点击鼠标中键时才触发
- .self
只当事件使用侦听器绑定的元素本身触发时才触发回调
- .passive
(2.3.0版本)以{ passive:true } 模式添加侦听器
️4⃣️.️4⃣️ v-bind
说明: 属性绑定(行内属性)
用法: v-bind:属性名="Vue实例中的数据" => 简写 :属性名="Vue实例中的数据"
当Vue实例中的数据改变之后 页面会同步更新
️4⃣️.️4⃣️.1⃣️ 属性绑定修饰符
- .prop
被用于绑定 DOM 属性 (property)
- .camel
(2.1.0+) 将 kebab-case 特性名转换为 camelCase. (从 2.1.0 开始支持)
- .sync
(2.3.0+) 语法糖,会扩展成一个更新父组件绑定值的 v-on 侦听器
️4⃣️.️4⃣️.2⃣️ 对象的方式绑定class
:class = "{'red' : isRed}"
isRed = true 就有red这个类
isRed = false 就没有red这个类
isRed 在 Vue 实例data中声明
- 默认的class 和 :class(绑定的class) 一起使用不会冲突 后面的会作为追加或者移除来解析
class = “red” :class = “{‘yellow’ : isYellow}”
️4⃣️.️4⃣️.3⃣️ 对象的方式绑定style
-
:style = "{fontSize : mySize + 'px'}"
-
样式名需要使用驼峰命名法
-
后面的mySize需要在Vue实例data中定义
️4⃣️.️5⃣️ v-model
说明: 双向数据绑定
用法: v-model = "Vue实例中的数据"
️4⃣️.️5⃣️.️1⃣️ 双向
-
视图层
-
数据层
数据能够自动的从内存中显示到页面上去
️4⃣️.️5⃣️.️2⃣️ 双向绑定修饰符
- .lazy
懒载入 当表单属性失去光标或按下回车键后 再将页面中的数据和Vue实例中的数据双向绑定
- .trim
输入的数据首位空格过滤
- .number
输入字符串转为有效的数字
注意: v-model 只能设置给from表单属性
️4⃣️.️6⃣️ v-for
说明: 循环渲染
用法: v-for = "(item,index) in items" :key = "index"
items是源数据数组
item是被迭代的数组元素的别名
index是被迭代的数组元素的下标(索引)
️4⃣️.️6⃣️.️1⃣️ :key
-
数据唯一标识绑定
-
v-for默认行为试着不改变整体 而是替换元素 迫使其重新排序的元素需要提供一个key(用户删除数据后 数据需重新排列序号 就可以使用key来实现)
-
数据实现重用和重新排序现有的元素
-
值最好为字符串或数值类型(唯一的)
️4⃣️.️6⃣️.️2⃣️ 遍历数组注意点
-
Vue本身只是监视了Vue实例Data中数组的改变(监视内存地址) 没有监视数组内部数据的改变
-
(变异方法)Vue重写了数组中的一系列改变数组内部数据的方法(先调用原生的方法 再更新页面) 所以实现了使用数组提供的方法 数组内部改变 界面自动改变
push()
pop()
shift()
unshift()
splice()
sort()
reverse()
…
- this.arr[index] = 新值
这种修改数组中的元素是无法实现数据改变后页面会同步改变(只会修改data中的数据 但是页面不会同步改变)
- splice()的增删改
增 this.arr.splice(index,0,新值)
删 this.arr.splice(index,1)
改 this.arr.splice(index,1,新值)
️4⃣️.️7⃣️ v-if,v-else,v-else-if
说明: 条件(表达式或布尔值)判断渲染
用法:
v-if = "表达式或布尔值"
v-else-if = "表达式或布尔值"
v-else
️4⃣️.️7⃣️.️1⃣️ 注意
v-if 和 v-else-if 后面必须跟表达式或布尔值
v-else-if 和 v-else 不能独立使用 必须跟在 v-if 后面
️4⃣️.️8⃣️ v-show
说明: 条件渲染
用法: v-show = "表达式或布尔值"
根据表达式或布尔值的真假切换元素的display属性
️4⃣️.️8⃣️.️1⃣️ 注意
v-show 不支持 元素 也不支持
v-else
️4⃣️.️9⃣️ v-if vs v-show
都是用来判断渲染数据的
- v-if
1.有较高的切换性能消耗
2.惰性渲染 第一次如果条件为false 则不会渲染到页面 需要等后面条件切换后才会进行第一次渲染
3.条件切换是切换DOM数中这个元素的移除或添加
4.如果运行时条件很少改变则使用v-if
- v-show
1.有较高的初始渲染消耗
2.初始渲染 不管条件 第一次加载页面的时候都会渲染到页面
3.条件切换只是切换元素的display属性
4.如果运行时条件会非常频繁的切换则使用v-show
️4⃣️.️️1⃣️0⃣️ v-cloak
说明: 这个指令保存在这个元素上 直到关联实例结束编译
️4⃣️.️️1⃣️0⃣️.️1⃣️ 详细说明
插值表达式在网络较满的情况下可能会出现数据闪烁问题
可以通过给实例(#app)盒子添加一个
v-cloak
指令
通过这个指令的特性(如页面中还有插值表达式就会存在这个指令 如果页面的插值表达式都被替换成数据 就会自动移除这个标签)
配合css
[v-cloak]{display:none|opacity:0}
来解决数据闪烁的问题
️4⃣️.️️1⃣️1⃣️ v-once
说明: 这个指令添加的元素 内部的胡子语法只会在第一次渲染的时候执行解析一次 后面数据发生改变后也不会触发更新
️4⃣️.️️1⃣️1⃣️.️1⃣️ 用途
某些元素只需要解析一次 后续不需要更新 就可以使用这个指令 提升性能
️5⃣️、Vue实例
️5⃣️.️1⃣️ el
-
与页面中的元素绑定
-
指定根element(选择器)
-
可以写id、class、标签选择器
建议使用id 因为id是唯一的 一个Vue实例绑定一个页面元素
- 注意: 不支持绑定body和html
️5⃣️.️2⃣️ data
-
数据对象
-
初始化数据(页面可以访问)
-
可以在里面写对象、字符串、数值、数组、…
️5⃣️.️3⃣️ methods
-
方法对象
-
可以在里面声明一些方法
可以通过this.xxx 获取Vue实例上的数据或方法
- 注意: 不要使用箭头函数 会改变this指向
️5⃣️.️4⃣️ computed
-
计算属性
-
可以在里面声明一些函数
必须要有 return 值
- 计算属性函数中如果使用到了data中的数据 这些数据发生改变后 就会重新执行这个计算属性函数 将最新的计算结果返回出去
执行时机:
初始化显示执行和函数中用到了data中的数据变化后会执行
-
在页面中直接用插值表达式使用计算属性
{{计算属性函数名}}
计算属性本质就是一个方法 但是使用的时候是将这些方法的方法名当作属性使用 计算属性的值就是return
出来的值 -
getter 和 setter
1.使用get和set函数 需要把计算属性函数改成计算属性对象
2.计算属性默认执行get方法(根据相关的数据计算返回当前属性的值)
3.当计算数学值自身改变后执行set方法
4.可以用来计算税前和税后的互推算
- 计算属性存在缓存 多次读取只执行一次getter函数
缓存 => {计算属性名:"数据结果"} 键值对
️5⃣️.️5⃣️ watch
-
侦听属性
-
可以侦听data中的属性和一些非DOM元素的改变
-
可以获取数据改变前的值和改变后的值
形参(newVal,oldVal) => (改变后的值,改变前的值)
- 深度侦听
watch默认无法侦听复杂数据类型 需要侦听复杂数据类型 得使用深度侦听
watch:{
XXX:{
deep:true,
handler(newVal,oldVal){
// 处理代码
}
}
}
- 侦听路由 hash
watch: {
// watch里面的 $router 这些对象前面不要带this
“$route.path”(newVal, oldVal) {
if (newVal.indexOf(“/login”) >= 0) {
this.welcom = “欢迎登陆”;
}
if (newVal.indexOf(“/register”) >= 0) {
this.welcom = “欢迎注册”;
}
}
}
- 子组件侦听路由的变化
watch: {
$route: function(newVal,oldVal) {
console.log(this.$route.path);
}
}
- 面试问及:
使用或侦听器吗 在Vue中碰到过什么bug
1.侦听器用来检测数据的改变
2.当侦听的那个数据发生改变后就会触发侦听器中的对应函数
3.一般我更多的使用是用侦听路由的变化 => 重新获取数据(如搜索在对应的router-view中显示对应的数据)
4.之前碰到过一个坑点 侦听器默认无法侦听复杂数据类型
5.后面使用深度侦听 depp:true 来解决了这个问题
6.或者侦听精确到对象中的那个值也可
️5⃣️.️6⃣️ computed和watch的区别
-
watch里面的方法只能对那个方法名的属性名做侦听
-
computed里面可以对那个方法中所有使用到了的data中的属性名做侦听
-
watch里面无须return
-
computed需要return
️5⃣️.️7⃣️ components
-
私有组件
-
后面会有全局组件 更详细
️5⃣️.️8⃣️ filters
- 过滤器
声明全局过滤器 一定要在实例化Vue之前声明
- 全局过滤器
Vue.filter(“formatData”, (形参=管道符前面的数据,形参=想要传入的数据…) => {
处理数据; 返回
处理之后的数据
});
- 局部过滤器
filters:{
formatTime(形参=管道符前面的数据,形参=想要传入的数据…){
处理数据; 返回
处理之后的数据 }
}
- 在页面中使用
{{data | formatTime | formatTime1 | ...}}
-
一个过滤器是一个函数 需要接收一个参数 参数就是处理的数据 (可以不传 默认是 管道符前面的数据) 可以做一些逻辑处理后 再将处理好的数据返回出去
-
不修改数据的情况下 修改数据的显示效果 过滤器不会修改源数据
️6⃣️、Vue实例中的this
-
this就是当前实例化出来的Vue对象(Vue实例)
-
Vue构造函数内部解析时 会把data、methods等中的值直接设置给这个实例化出来的Vue实例对象
-
最终直接通过这个Vue实例对象即可访问data中的数据以及methods中的方法等
️7⃣️、Vue实例属性
️7⃣️.️1⃣️ vm.$data
获取data中的所有数据
️7⃣️.️2⃣️ vm.$options
用于当前Vue实例的初始化选项 可以获取自定义选项
new Vue({
customOption: ‘foo’,
created: function () {
console.log(this.$options.customOption) // => ‘foo’
}
})
️7⃣️.️3⃣️ vm.$refs
-
通过给元素设定ref属性在Vue实例中获取这个元素
-
页面元素 ref=“jack”
-
Vue实例获取 this.$refs.jack
返回的是一个DOM对象
- 如果ref重名后面的会把前面的覆盖
️8⃣️、Vue组件
️8⃣️.️1⃣️ 什么是组件
组件的出现就是为了拆分Vue实例的代码量 能够让我们以不同的组件来划分不同的功能模块 需要什么功能就去调用对应的模块即可
局部功能界面
️8⃣️.️2⃣️ 组件化和模块化的区别
- 模块化
是从代码的逻辑角度去划分的 方便代码分层开发 保证每个功能模块的职能单一
- 组件化
是从UI界面的角度进行划分的 前端的组件化方便UI组件的重用
️8⃣️.️3⃣️ 全局组件
️8⃣️.️3⃣️.️1⃣️ 用法
Vue.component('组件名',{参数})
️8⃣️.️3⃣️.️2⃣️ 注意
组件名请使用小写
大写需要驼峰命名法
Vue.component(‘sayHiBaby’,{参数})
页面中标签使用
️8⃣️.️3⃣️.️3⃣️ 组件参数
- props:[‘xxx’]
父向子传参
通过 props 向子组件传递数据
可以在组件实例中通过 this.xxx 拿到传递过来的值
高级写法(props验证)
props:{
xxx:{
// 数据类型
type:“String”,
// 必须传递
required:“true”,
// 默认值
default:“mystring”
…
}
}
props可以传递任何数据类型 包括函数
- data(){ return{ } }
组件中的数据data是一个函数 将数据写在返回出去的对象中即可
为什么组件的data是一个函数 而Vue实例的data是一个对象?
1.每一个Vue组件都是一个Vue实例
2.都是通过new Vue() 创建出来的
3.如果data是一个对象的话 那么这些组件的引用指向就会相同
4.一个的值修改后 其他的值也会修改(这是JavaScript语法的特性)
5.如果data是一个函数 函数中再返回一个对象
6.那么每个Vue组件都有了自己的作用域 互不干扰
- template
模版
动态的HTML页面 包括一些JavaScript语法代码
注意: 如果模版中包含多个标签 需要在最外层加一个div 作为根标签
- 其他参数和Vue实例的一致
️9⃣️、Vue生命周期钩子
Vue生命周期钩子 || Vue生命周期函数
Vue提供给开发者一系列的回调函数 让我们可以在Vue的各个阶段添加自定义的逻辑处理
️9⃣️.️1⃣️ 三大阶段
️9⃣️.️1⃣️.️1⃣️ 初始化显示
创建期间的生命周期函数(1次)
- beforeCreate()
Vue实例被创建 但date和methods数据中的数据还没有被设置上去(未初始化)
- created()
data和methods以及被初始化(已被设置在Vue实例上)但是还未开始模版编译
常用
如果要操作data中的数据和methods中的方法 最早只能在created中调用
- beforeMount()
开始解析模版编译 把数据和结构(模版)关联起来 但现在页面上还不能看到数据
- mounted()
数据挂载完毕 页面中可以看到数据 当这个钩子函数执行完毕 创建期间的所有的生命钩子全部执行完
常用
发送ajax请求 启动定时器等异步任务 操作DOM中的节点
Vue渲染解析插值表达式 并不是在页面中直接渲染解析 而是将整个挂载在Vue实例的模版 拿到内存中去解析 等全部解析完成后 再一次性的渲染到页面(批量) (因为有可能页面中有很多一样的data中的值 如果是在页面中直接渲染解析会很耗性能)
️9⃣️.️1⃣️.️2⃣️ 更新显示
运行期间的生命周期函数(0次-多次)
- beforeUpdate()
页面中的数据还是旧的 但Vue实例中的数据已经被更新 数据还未同步
- updated()
页面和Vue实例中的数据已同步
️9⃣️.️1⃣️.️3⃣️ 销毁
销毁期间的生命周期函数(1次)
- beforeDestory()
开始进入销毁阶段 Vue实例中的方法和数据还能使用 还未真正销毁
常用
做收尾工作 如:清除定时器…
- destoryed()
已被完全销毁 Vue实例中的数据和方法不能再使用
想要销毁Vue实例 调用 vm.$destroy() 即可
注意: 这个方法方法并不会销毁Vue实例的一些如 定时器或计时器等方法
会造成 ‘内存泄漏’ 所以在完全销毁之前 需要在 beforeDestory 钩子中清除定时器等…
️️1⃣️0⃣️、父子组件传参
️️1⃣️0⃣️.️1⃣️ 父传子
-
子组件中定义 props 属性 props:[‘num’,‘max’,‘min’]
-
父组件中使用子组件时
<comSon num='xxx' max='xx' :min='x'></comSon>
️️1⃣️0⃣️.️2⃣️ 子传父
-
子组件中 特定的时候 触发
this.$emit('事件名A','参数')
-
父组件中
<com @事件名A="自己methods中的方法"></com>
️️1⃣️1⃣️、VueRouter
️️1⃣️1⃣️.️1⃣️ 前端路由
url地址和组件之间的关系
️️1⃣️1⃣️.️2⃣️ 如果是模块工程化(VueCLI)中使用VueRouter
必须添加 Vue.use(VueRouter)
import Vue from ‘vue’
import VueRouter from ‘vue-router’
Vue.use(VueRouter)
️️1⃣️1⃣️.️3⃣️ 路由起步代码
️️1⃣️1⃣️.️3⃣️.️1⃣️ HTML
- router-link
使用 router-link 来导航 最后会被渲染成a标签
可以通过 tag属性
来设置最后被渲染的标签
to属性
指定跳转的链接
登陆
注册
- router-view
router-view 路由出口 路由匹配到的组件将渲染到这里
️️1⃣️1⃣️.️3⃣️.️2⃣️ JavaScript
- 定义组件
const login = { template: “#tempLogin” };
const logout = { template: “#tempLogout” };
- 定义路由
const routes = [
{ path: “/login”, component: login },
{ path: “/logout”, component: logout }
];
- 创建路由
const router = new VueRouter({
routes
});
- 绑定路由
在Vue实例中 绑定router
new Vue({
el:“xxx”,
router
})
️️1⃣️1⃣️.️4⃣️ 路由高亮
设置路由匹配成功后 router-link 的样式属性
- active-class 模糊匹配
to设置的路由和url上面的路由只要前面的/xxx 匹配成功就会添加样式
/login => /login/user
触发 添加样式
- exact-active-class 全部匹配
to设置的路由和url上的路由必须全部匹配才会添加样式
/login/user => /login/user
触发 添加样式
️️1⃣️1⃣️.️5⃣️ 声明式导航
点了跳转 没有任何逻辑 类似于(a标签设置了href)
<router-link to="地址">XXX</router-link>
️️1⃣️1⃣️.️6⃣️ 编程式导航
跳转的同时执行其他需要执行的逻辑
router.push('地址')
️️1⃣️1⃣️.️7⃣️ 动态路由匹配
- 将原本 router-link to 中的地址
/user
=>/user/:id
:id
只是一个占位
-
切换路由
/user
=>/user/123
-
可以在组件中通过
this.$route.params.(id)
获取传递过来的数据
️️1⃣️1⃣️.️8⃣️ 路由重定向
-
redirect : “跳转的新地址”
-
{path:"地址1",redirect:"跳转到的新地址2"}
-
能够实现 匹配到地址1之后 立刻跳转到地址2
️️1⃣️1⃣️.️9⃣️ 前置导航守卫
- 导航<路由> 当路由发生改变后 就会触发导航守卫再进行路由跳转
const router = new VueRouter({ … })
router.beforeEach((to, from, next) => {
// …
next()
})
to
去哪个路由
一般通过to来判断对应路由做对应处理
from
来自哪个路由
next()
必须next()才可以继续跳转页面(像node"express"里面的中间件)
- 执行时机 比组件的beforeCreate还要早
1.判断登陆状态 如判断token…
2.可以在跳转路由时先判断这个页面这个用户是否有权限访问…
3.可以每次路由跳转前都提示用户跳转至什么页面…
️️1⃣️1⃣️.️️1⃣️0⃣️ 路由元信息
-
给路由配置一个标示 配合导航守卫定位到这个路由 做一些对这个路由的逻辑处理
-
给路由规则中配置一个meta对象
meta: { requiresAuth: true }
- 在导航守卫中就可以通过 to.meta.requiresAuth 是否为true 来判断是否是对应路由
️️1⃣️1⃣️.️️1⃣️1⃣️ 嵌套路由
- 在需要使用嵌套路由的组件中 找到需要动态替换的位置
<router-view></router-view>
- 修改路由规则
在需要嵌套路由的组件的路由规则中添加 children:[ ]
注意
嵌套路由的path不要加 /
{ path: ‘/user’, component: User,
children: [
{
path: ‘index’,
component: Index
}
]
}
️️1⃣️1⃣️.️1⃣️2⃣️ 统一404页面
配置错误路由规则
- 错误路由
{path:"/NotFound",component:NotFound}
- 配置404
{path:"*",redirect:'.NotFound'}
注意 :这个匹配必须写在路由规则的最下面 (当上面的路由匹配规则都不成功就会执行这个路由 然后跳转到404错误页面)
️️1⃣️1⃣️.️1⃣️3⃣️ 路由懒加载
-
当打包构建应用是 JavaScript 包会变得非常大 影响页面加载 路由懒加载 把不同路由对应的组件分割成不同的代码块 当路由被访问的时候才加载对应组件
-
将原先 在router.js 中的
import Foo from "./Foo.vue";
修改成const Foo = () => import('./Foo.vue')
其他不变 即可 -
路由懒加载并不能提速 只是把时间分开了 总时间没变
️️1⃣️2⃣️、资源请求
️️1⃣️2⃣️.️1⃣️ Axios
️️1⃣️2⃣️.️1⃣️.️1⃣️ Axios是什么?
Axios是一个基于 promise(实现了链式调用)
的 HTTP 库 可以用在浏览器和 Node.js 中 专注于发请求 专注于网络请求的一个库`
️️1⃣️2⃣️.️1⃣️.️2⃣️ CDN
<script src="https://unpkg.com/axios/dist/axios.min.js"></script>
️️1⃣️2⃣️.️1⃣️.️3⃣️ .then
成功回调
️️1⃣️2⃣️.️1⃣️.️4⃣️ .catch
失败回调
️️1⃣️2⃣️.️1⃣️.️5⃣️ get请求
// 为给定 ID 的 user 创建请求
axios.get(‘/user?ID=12345’)
.then(function (response) {
console.log(response);
})
.catch(function (error) {
console.log(error);
});
// 可选地,上面的请求可以这样做
axios.get(‘/user’, {
params: {
ID: 12345
}
})
.then(function (response) {
console.log(response);
})
.catch(function (error) {
console.log(error);
});
️️1⃣️2⃣️.️1⃣️.️6⃣️ post请求
axios.post(‘/user’, {
firstName: ‘Fred’,
lastName: ‘Flintstone’
})
.then(function (response) {
console.log(response);
})
.catch(function (error) {
console.log(error);
});
️️1⃣️2⃣️.️1⃣️.️7⃣️ 基地址
基础的地址应用 没有必要每次都写 可以直接抽离出来
axios.defaults.baseURL = ‘设置的基地址’
Vue.prototype.$axios = axios
axios填写路径时后面直接写对应的路径即可
前面的公共部分不需在写(写了也不会影响)
️️1⃣️2⃣️.️1⃣️.️8⃣️ 设置跨域携带cookie
axios.defaults.withCredentials = true
️️1⃣️2⃣️.️1⃣️.️8⃣️.️1⃣️ 面试问及
-
坑点 axios 跨域默认不携带cookie
-
某个项目 登陆状态的判断 后端用的是cookie
-
登陆成功之后 服务器返回了cookie 标记登陆
-
但axios在请求不同源的接口时 默认不会携带cookie
-
所以后端接口后续一直无法获取登陆状态
-
抓包后检测网络请求 发现浏览器并没有把服务器返回的cookie给保留
-
所以导致每次都没设置成功cookie (set-cookie)
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数前端工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加V获取:vip1024c (备注前端)
性能优化
1.webpack打包文件体积过大?(最终打包为一个js文件)
2.如何优化webpack构建的性能
3.移动端的性能优化
4.Vue的SPA 如何优化加载速度
5.移动端300ms延迟
6.页面的重构
所有的知识点都有详细的解答,我整理成了280页PDF《前端校招面试真题精编解析》。
一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
cookie
-
登陆成功之后 服务器返回了cookie 标记登陆
-
但axios在请求不同源的接口时 默认不会携带cookie
-
所以后端接口后续一直无法获取登陆状态
-
抓包后检测网络请求 发现浏览器并没有把服务器返回的cookie给保留
-
所以导致每次都没设置成功cookie (set-cookie)
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数前端工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
[外链图片转存中…(img-lSbrG99j-1712717024383)]
[外链图片转存中…(img-QYM619v5-1712717024384)]
[外链图片转存中…(img-QrEl9gjQ-1712717024385)]
[外链图片转存中…(img-9NKoo94t-1712717024385)]
[外链图片转存中…(img-QZDckzP4-1712717024385)]
[外链图片转存中…(img-lIc7lsqn-1712717024385)]
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加V获取:vip1024c (备注前端)
[外链图片转存中…(img-FIi05EHb-1712717024386)]
性能优化
1.webpack打包文件体积过大?(最终打包为一个js文件)
2.如何优化webpack构建的性能
3.移动端的性能优化
4.Vue的SPA 如何优化加载速度
5.移动端300ms延迟
6.页面的重构
所有的知识点都有详细的解答,我整理成了280页PDF《前端校招面试真题精编解析》。
一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
[外链图片转存中…(img-QIO0BLUh-1712717024386)]