⑦vue-移动端项目记录(上)
1、css 基础样式集
浏览器支持和理解的CSS规范不同,导致渲染页面时效果不一致,会出现很多兼容性问题。有两种解决方案。
1.1、一种是 css reset
1 | /* KISSY CSS Reset |
1.2、一种是 Normalize.css
对于普通的 H5 项目,我们可以到其官网下载最新的 Normalize.css,然后在页面中引入使用。
对于 Vue.js 项目,可以先进入项目文件夹中执行如下命令安装:
1 | npm install --save normalize.css |
- 然后在 vue 的主文件中引入即可:
1 | import 'normalize.css/normalize.css' |
2、rem和em总结
rem 单位翻译为像素值的时候是由 html 元素的字体大小决定的。此字体大小会被浏览器中字体大小的设置影响,除非显式的在 html 为 font-size 重写一个单位;
em 单位转换为像素值的时候,取决于使用它们的元素的 font-size 的大小,但是有因为继承关系,所以比较复杂;
- 优缺点
- em 可以让我们的页面更灵活,更健壮,比起到处写死的 px 值,em 似乎更有张力,改动父元素的字体大小,子元素会等比例变化,这一变化似乎预示了无限可能;
- em 做弹性布局的缺点还在于牵一发而动全身,一旦某个节点的字体大小发生变化,那么其后代元素都得重新计算。
- 优缺点
3、css BEM(block__element--modifier
)命名规则
1 | <div class="docker__item--active"></div> |
4、如何设置fantasize值为10px
- 横向纵向均缩放50%;
- center top为缩放中心,最终缩放位置为正确位置;
1 | &__title { |
5、页面加载抖动问题
在web开发中,经常会遇到这样一个问题,比如一个宽度百分百,高度自适应的图片,在网速慢的情况下加载过程中会出现抖动的问题(未加载图片前容器的高度为0,图片加载完成后下面的内容会被挤下去);
这种问题如果是图片有固定高度,就不会出现加载抖动。但一般情况下,为了使图片不被拉伸,高度一般设为自适应,那么为了防止加载抖动,我们需要给图片提前占个位,这里使用css的padding-bottom百分比进行占位;
示例代码如下
1 | .banner { |
- padding-bottom实际上是提前占位了,这个容器的高度始终是0,高度为0还之所以能够显示内容是因为内容溢出在了padding-bottom上,这里的25.4%是图片的高/宽比例,切记是相对于父元素宽度的25.4%(此处即.banner的上一级),不是相对于自己的width。
6、vue/style的scoped属性(坑)
scoped原理:https://blog.csdn.net/qq_39043923/article/details/88687046
1
2<style lang="scss" scoped>
</style>scoped
属性达到了css作用域约束的目的;给HTML的DOM节点加一个不重复data属性(形如:data-v-2311c06a)来表示他的唯一性;
在每句css选择器的末尾(编译后的生成的css语句)加一个当前组件的data属性选择器(如[data-v-2311c06a])来私有化样式;
如果组件内部包含有其他组件,只会给其他组件的最外层标签加上当前组件的data属性
7、 beforeEach/beforeEnter实现路由校验
- beforeEach 的使用
- 可以整体对每个路由进行权限校验后跳转;
- 点击登陆并成功登陆,localStorage 中种下 isLogin:
localStorage.isLogin = true;
; router/index
中使用beforeEach
且判断 localStorage 中 isLogin 状态,达到校验路由是否切换的目的;1
2
3
4
5
6router.beforeEach((to, from ,next) => {
const { isLogin } = localStorage;
const { name } = to;
const isLoginOrRegister = (name === "Login" || name === "Register");
(isLogin || isLoginOrRegister) ? next() : next({ name: 'Login'});
})
- beforeEnter 的使用
- 可以精确到对哪一个路由进行权限校验后跳转
- 点击登陆并成功登陆,localStorage 中种下 isLogin:
localStorage.isLogin = true;
; - router 配置中直接使用
1
2
3
4
5
6
7
8
9
10
11const routes = [{
{
path: '/login',
name: 'Login',
component: () => import(/* webpackChunkName: "login" */ '../views/login/Login'),
beforeEnter(to, from, next) {
const { isLogin } = localStorage;
isLogin ? next({ name: 'Home'}): next();
}
},
}]
8、?.
optional chaining语法
9、axios普通封装/创建一次实例封装
9.1、普通封装
1 | import axios from 'axios' |
- 使用
1 | const useLoginEffect = (showToast) => { |
9.2、只创建一次实例封装
封装
1 | import axios from 'axios' |
在根目录下的
main.js
中全局引入
1 | import Http from '@/utils/http' |
在普通组件中使用
1 | let result = await this.$http.get({ |
10、setup函数主调度功能
- setup函数的主调度功能,具体的业务实现都应摘出去封装;
1 | export default { |
11、图片未加载完成时避免出现裂图展示的优化
v-show="item.imgUrl"
:其中item.imgUrl
为图片地址
1 | <ShopInfo :item="item" :hideBorder="true" v-show="item.imgUrl"/> |