module.exports = ({ file }) => {
const designWidth = file.includes('node_modules\\vant') ? 375 : 750
return {
plugins: {
'postcss-px-to-viewport': {
viewportWidth: designWidth
}
}
}
}
不封装组件:iconfont.com上生成字体图标js文件,public下的index.html引入js文件,使用svg标签
指定类名来指定图标,并在使用svg标签的组件中加入通用css代码
封装组件:将html与css封装在一个组件中,暴露props属性来指定类名从而指定标签
当用户登录成功,后端会返回token和refresh_token,前者只能保存2小时,后者可以保存14天,当token过期,
用户发送ajax请求,后台返回401错误,拦截器截获401,使用refresh_token访问刷新token的接口,
返回新的token(保质期仍旧是2h),请求成功,则用新token继续之前失败的请求,请求失败,说明用户未登录,
则带着当前路由完整地址跳转登录,重新登录后返回当前
注意:用refresh_token请求新token时,要用axios,不要用实例request,请求拦截器中会覆盖请求头
<template>
<div>
//下拉刷新:
<van-pull-refresh
v-model="refreshing"
@refresh="onRefresh"
success-text="刷新成功"
>
//上拉加载:
<van-list
v-model="loading"
:finished="finished"
@load="onLoad"
finished-text="没有更多了"
>
//列表渲染
<div v-for="item in list" :key="item.id"></div>
</van-list>
</div>
</template>
export default {
data(){
return {
list:[]
loading:false,
finished:true,
refreshing:false
}
},
methods:{
onLoad(){
const [err,res] = await to(ajax返回的Promise)
this.loading = false
this.list.push(res.data.results)
if(判断list的长度>=后台数据的总数){
this.finished = true
}
}
},
onRefresh(){
const [err,res] = await to(ajax返回的Promise)
this.list=res.data.results
this.finished = false
}
}
7. vant实现移动端骨架效果
<van-skeleton title avatar :row="3" :loading="loading">
<div>子组件</div>
</van-skeleton>
8.使用dayjs将时间字符串以指定格式返回
const date = dayjs(this.birthday).format('YYYY-MM-DDTHH:mm:ss')
9.keep-alive针对具体组件缓存
<keep-alive :include="['componenName']"><router-view /></keep-alive>
10. 保存缓存组件的阅读位置
缓存组件会自动生成两个钩子,activated与deactivated,缓存组件定义data变量scrollTop保存位置,
template的根元素设置ref与scroll事件,当根元素滚动触发事件,将根元素的scrollTop赋值给变量
scrollTop,当组件重新激活执行activated,将scrollTop赋值给根元素的scrollTop
11.文本高亮
export default {
install(Vue){
Vue.directive('highlight',el=>{
const codeList = el.queryselectorAll('pre code')
codeList.forEach(code=>{
hljs.highlightElement(code)
})
})
}
}
import useComponents from '@/plugins/useComponents'
Vue.use(useComponents)
12.tab栏管理支持线上与本地
13.实现评论与回复功能
14.使用socket.io-client完成双向通讯