之前负责过大小十几个项目,负责过浙里办的整套上架流程,负责过数据大屏统计,后台管理系统文书生成表单生成等,浙政钉应用内嵌开发,搜索表单统一配置化,移动端form配置。遇到的问题,在一次html转pdf时,中文转出乱码的问题,最后是因为不支持中文格式,只支持英文,最后把.ttf字体引入才得以解决。
本地存储比如localStorage、sessionStorage,
语义化标签,如header、footer、nav等,
flex,reba,transition,媒体查询,shadow,border-radius,渐变linear-gradient
父beforeCreate->父created->父beforeMount->子beforeCreate->子created->子beforeMount->子mounted->父mounted
VUE2.0通过object.defineProperty来劫持对象属性的getter和setter操作,VUE3.0通过Proxy来劫持数据
props,$emit,ref,Vuex,bus,LocalStorage/SessionStorage
计算属性和监听 计算是多合一 例如购物车,监听是一控制多 例如搜索框
Vue组件可以同时存在多个实例,如果直接使用对象形式的data选项,实例将会共享同一个data对象,会造成数据互相干扰的问题。设置为函数可以让每个实例都拥有自己独立的data对象。当组件被创建多次时,每个实例都会调用该函数并返回一个新的data对象
当你在对组件的反复切换的时候,去复用缓存的v-node,可以提高页面的渲染效率,include ,exclude
var asyncRouteMenu = asyncRouetes.filter((item,index)=>{
return item.meta.roles.includes(userRole)
})
//将新路由添加到路由中, 如果不加组件component不能正确渲染
VueRouter.addRoutes(asyncRouteMenu);
//为了正确渲染导航,将对应的新的路由添加到VueRouter中
state,mutations,actions-dispatch
mapState, mapMutations, mapActions, mapGetters
用过,不利于阅读,命名冲突
可以在DOM更新完毕之后执行一个回调,简单的理解是:当数据更新了,在dom中渲染后,⾃动执⾏该函数
1.加 CDN,图片。js\css文件用cdn加载。
2.图片懒加载,按需加载。压缩图片,webpp格式的图片。组件懒加载,组件按需引入;(页面滚动之后再加载首屏下面的数据)
3.减少公共自定义组件。减少全局的混入
4.减少http请求。
5.前端、服务端开启gzip。
6.删除mock.js.
7.删除无效代码。
8.检测后端接口,性能测试。
9.使用浏览器强缓存策略。
10.延迟调用一些方法,减少js主进程(比如埋点方法。fastclick,vconsole的加载)
11.路由懒加载。
12.需要设置的样式很多时,设置className,不要设置style;减少重绘和回流;
13.避免在页面的主体布局中使用table,table要等其中的内容完全下载之后才会显示出来;要比div+css慢;
14.编码优化:缓存对象成员值,将对象成员值缓存到局部变量中会加快访问速度。(局部变量比全局变量读取快、对象嵌套的越深,读取越慢、原型链中的位置越深,读取的越慢)
const HelloWorld = ()=>import('需要加载的模块地址')
< component :is=“item.meta.icon” />
Vue.directive
一个组件无非就是我传入了什么,和你抛出了什么
不允许直接使用slot
正确格式为 v-slot
将v-if当作v-for大的一个判断语句,不会相互冲突
数据双向绑定原理不同
生命周期函数钩子不同
diff算法不同
vue2 比较每一个节点,而对于一些不参与更新的元素,进行比较是有点消耗性能的。
vue3在初始化的时候会给每一个虚拟节点添加一个patchFlags,是一种优化的标识。只会比较patchFlags发生变化的节点,进行识图更新。而对于patchFlags没有变化的元素作静态标记,在渲染的时候直接复用。
.env文件
let,const,promise,()=>{},模板字符串,结构赋值,includes
[…new Set(array)],filter()和indexOf
Object.keys()返回空数组,JSON.stringify(data) == “{}”,for in报错
call(window,‘global’)
apply(window,[‘global’])
bind(window,‘global’)
原型是一个对象,是函数的一个属性prototype;比如this
每一个protoType都有一个proto,顺着proto来找对象的protoType链路就叫原型链
就是在这个范围内,变量是可以使用的,超过这个范围,变量就无法使用,这个范围就是作用域
先局部=>全局这个查找过程形成的链条叫做作用域链
箭头函数的this指向不能被改变,()=>{} 一个表达式时 {} return 可以省略,箭头函数没有原型
this永远指向,调用它的对象,默认指向window/全局对象。
函数防抖,节流的时候会return一个函数出去
深拷贝会另外创造一个一模一样的对象,新对象跟原对象不共享内存,修改新对象不会改到原对象
协议、域名、端口 jsonp
服务器设置Access-Control-Allow-Origin将可允许的访问请求
是es6新增的一个构造函数 里面放的是一个异步操作,解决了地狱回调的问题,是一种链式调动的方式
防抖:比如输入框的input事件,每输一个文字就会触发一次,只执行最后一次得触发
节流:游戏中的技能,释放一个技能后会有技能CD,控制多久能触发一次
小程序通过wx.login()获取登录凭证code=>通过wx.request()将code,appid ,secret发送到开发者服务器=>返回服务器自定义登录信息
公众号 判断有没有code,有换取token,没有就获取授权
https://open.weixin.qq.com/connect/oauth2/authorize?appid=wxaf05346ece6ae430&redirect_uri=${href}&response_type=code&scope=snsapi_userinfo&state=#wechat_redirect判断有没有code,有换取token,没有就获取授权
https://open.weixin.qq.com/connect/oauth2/authorize?appid=wxaf05346ece6ae430&redirect_uri=${href}&response_type=code&scope=snsapi_userinfo&state=#wechat_redirect
弹出授权类型 scope
组合式api
reactive 只能是对象
ref 对象,基本数据类型,数组
props 接收
<script setup lang="ts">
defineProps<{
title?: string
likes?: number
}>()
</script>
props 抛出
<script setup lang="ts">
const emit = defineEmits<{
(e: 'change', id: number): void
(e: 'update', value: string): void
}>()
</script>
计算属性没什么变化
const double = computed(() => count.value * 2)
watch(() => data.name, (newVal, oldVal)=> {
console.log('watch监听data.name的变化 newVal ------>', newVal);
console.log('watch监听data.name的变化 oldVal ------>', oldVal);
});
view icon text
页面的生命周期
1.onInit——监听页面初始化,其参数同 onLoad 参数,为上个页面传递的数据,参数类型为 Object(用于页面传参),触发时机早于 onLoad2.onLoad——监听页面加载,其参数为上个页面传递的数据,参数类型为 Object(用于页面传参),参考示例
3.onShow——监听页面显示。页面每次出现在屏幕上都触发,包括从下级页面点返回露出当前页面
4.onReady——监听页面初次渲染完成。注意如果渲染速度快,会在页面进入动画完成前触发
5.onHide——监听页面隐藏
6.onUnload——监听页面卸载
7.onResize——监听窗口尺寸变化
页面跳转
uni.navigateTo({url: “/路径?参数=参数值”}) 只能打开非 tabBar 页面
uni.switchTab 只能打开 tabBar 页面
DNS查询-把域名转换为ip
TCP连接-三次握手
发送HTTP请求
服务器处理HTTP请求
浏览器解析并渲染页面