vue项目中遇到的一些问题
或访问:https://github.com/littleHiuman/experiences-about-vue
求点star呀~~
欢迎补充!
vuex 状态
vue-cli 命令行
vue vue
vue-router 路由
es6
eslint
Js写法 规范。
eslint常见问题
brace-style?
no-sequences?
block-spacing?
比较时,使用全等号
所有的switch语句都必须要有一个default分支
yoda:yoda条件语句就是对象字面量应该写在比较操作符的左边,而变量应该写在比较操作符的右边(默认的规则要求,变量写在左边而字面量写在右边)
个别符号以及关键字之间需要空格(比如function,逗号,大括号,运算符)
逗号在行尾出现/行首
不以新行开始的块 { 前面要不要有空格
立即调用函数的写法:
(function() {
// body
}());
只能使用单引号
最后必须有一行空行,
不能有多余空行
不能有多余空格
空位/制表符距离为2
可以设置带分号,否则js中不能带分号。
"semi": [2, "always"]
不能 定义了却未使用的变量
alias中定义的简称只能用于js部分。
模块必须有一个根元素
整个页面有切换动画,那么页面的根元素不能有其他样式影响
Vue实例中 最后一个属性末不需要加逗号
对象里的最后一项,不需要加逗号
引入css文件:
1. index.html中引入,
2. <style></style>中引入,需要@import,
或者另外一个<style src=""></style>
3. main.js中引入需要写loader(inport/require)
require('!style-loader!css-loader!less-loader!./assets/css/common_m.less')
PS:在webpack中配置好了loader之后,不需要在引入文件时写loader和文件后缀。
cssloader:
{
test: /\.css$/,
exclude: /node_modules/,
loader: "style-loader!css-loader",
},
{
test: /\.less$/,
exclud: /node_module/,
loader: "style-loader!css-loader!less-loader",
},
// <router-view></router-view>与写的位置无关
path.join(__dirname,'..');
this.$set(this, '属性', '值')
css scoped 仅本组件
对象可以存图片。使用require即可。
images: {
error: require('./toast-error.png'),
success: require('./toast-success.png'),
load: require('./toast-load.gif'),
waiting: require('./toast-hourglass.svg')
}
border。各屏幕分辨率不同出现的粗细问题。
公共部分。写成组件。利用传参改变样式/内容。
Ajax。axios。
跨域问题的解决:1.服务器端协助配置。2.jsonp。3.devServer配置代理。
能用data数据解决的问题,不用方法解决。如取反。长度。是否空/false/true。(Vue是数据驱动而不是结构驱动)
v-bind:style src to ...
路由传参。$route。
历史记录切换。router-link to/:to或者router.push()/router.replace()
#router.push(location) 导航到不同的 URL
// 声明式
<router-link :to="..."> // 编程式
router.push(...) // 字符串
router.push('home') // 对象
router.push({ path: 'home' }) // 命名的路由
router.push({ name: 'user', params: { userId: 123 }}) // 带查询参数,变成 /register?plan=private router.push({ path: 'register', query: { plan: 'private' }})
#router.replace(location) 它不会向 history 添加新记录,而是替换掉当前的 history 记录。
// 声明式
<router-link :to="..." replace> // 编程式
router.replace(...)
#router.go(n) 在 history 记录中向前或者后退多少步,类似 window.history.go(n) 值可以正可以负
#综合使用
const router = new VueRouter({
routes: [
{
path: '/user/:userId',
name: 'user',
component: User
}
]
}) <router-link :to="{ name: 'user', params: { userId: 123 }}">User</router-link> router.push({ name: 'user', params: { userId: 123 }})
这两种方式都会把路由导航到 /user/123 路径。
// 命名视图
// https://router.vuejs.org/zh-cn/essentials/named-views.html
// https://jsfiddle.net/posva/6du90epg/
// 有时候想同时(同级)展示多个视图,而不是嵌套展示,例如创建一个布局,有 sidebar(侧导航) 和 main(主内容) 两个视图,这个时候命名视图就派上用场了。
// 你可以在界面中拥有多个单独命名的视图,而不是只有一个单独的出口。如果 router-view 没有设置名字,那么默认为 default。
<router-view class="view one"></router-view> <router-view class="view two" name="a"></router-view> <router-view class="view three" name="b"></router-view>
// 一个视图使用一个组件渲染,因此对于同个路由,多个视图就需要多个组件。确保正确使用 components 配置(带上 s):
const router = new VueRouter({
routes: [
{
path: '/',
components: {
default: Foo,
a: Bar,
b: Baz
}
}
]
})
重定向 和 别名
切换时清空历史记录。数据丢失。sessionStorage。
相对路径。
append。concat。
渲染成某个标签。tag
可以在router-link内嵌套其他内容。
类型都是Object
$route.params(一个 key/value 对象,包含了 动态片段 和 全匹配片段,如果没有路由参数,就是一个空对象。)
$route.query(一个 key/value 对象,表示 URL 查询参数。例如,对于路径 /foo?user=1,则有 $route.query.user == 1,如果没有查询参数,则是个空对象。)
<div>
<router-link :to="{ name: 'Hello' , params: { userId: 123 }}">
click1
</router-link>
</div> <div>
<router-link :to="{ path: 'hello' , query: {show: 2}}">
click2
</router-link>
</div> console.log(this.$route.params.userId) console.log('top is params, bottom is query') console.log(this.$route.query.show)
watch:
watch: {
'$route' (to, from) {
// 对路由变化作出响应...
}
}
v-show和v-if 。v-if为假直接不渲染。v-show为假display none。
当 v-if 与 v-for 一起使用时,v-for 具有比 v-if 更高的优先级。
个人建议:外容器overflow hidden,内容器overflow scroll。
过渡效果:
<transition name="fade"></transition>
.fade-enter-active, .fade-leave-active {
-webkit-transition: opacity .7s;
transition: opacity .7s;
} .fade-enter, .fade-leave-active {
opacity: 0
}
路由钩子:判断从哪个路由过来,到哪个路由。然后跳转到哪个路由。(全局钩子。局部钩子。)
component页面内也可以监听路由。
滚动行为。历史记录之间切换。页面位置。返回对象。
scrollBehavior (to, from, savedPosition) {
return { x: 0, y: 0 }
}
锚点的实现。通过scrollTop。或滚动行为。
路由元信息。路由嵌套。
懒加载。
4、在异步加载页面中载嵌入异步加载的组件时对页面是否会有渲染延时影响?
答:会, 异步加载的组件将会比页面中其他元素滞后出现, 页面会有瞬间闪跳影响;
解决方案:因为在首次加载组件的时候会有加载时间, 出现页面滞后, 所以需要合理的进行页面结构设计, 避免首次出现跳闪现象;
At all:
1、路由页面以及路由页面中的组件全都使用懒加载
优点:(1)最大化的实现随用随载
(2)团队开发不会因为沟通问题造成资源的重复浪费
缺点:(1)当一个页面中嵌套多个组件时将发送多次的http请求,可能会造成网页显示过慢且渲染参差不齐的问题
2、路由页面使用懒加载, 而路由页面中的组件按需进行懒加载, 即如果组件不大且使用不太频繁, 直接在路由页面中导入组件, 如果组件使用较为频繁使用懒加载
优点:(1)能够减少页面中的http请求,页面显示效果好
缺点:(2)需要团队事先交流, 在框架中分别建立懒加载组件与非懒加载组件文件夹
3、路由页面使用懒加载,在不特别影响首页显示延迟的情况下,根页面合理导入复用组件,再结合方案2
优点:(1)合理解决首页延迟显示问题
(2)能够最大化的减少http请求, 且做其他他路由界面的显示效果最佳
缺点:(1)还是需要团队交流,建立合理区分各种加载方式的组件文件夹
export default new Router({
routes: [
{
path: '/',
component: resolve => require(['components/Hello.vue'], resolve)
},
{
path: '/about',
component: resolve => require(['components/About.vue'], resolve)
}
]
})
// solve:
// components/page
<keep-alive> 包裹动态组件时,会缓存不活动的组件实例,而不是销毁它们。和 <transition> 相似,<keep-alive> 是一个抽象组件:它自身不会渲染一个 DOM 元素,也不会出现在父组件链中。
当组件在 <keep-alive> 内被切换,它的 activated 和 deactivated 这两个生命周期钩子函数将会被对应执行。
主要用于保留组件状态或避免重新渲染。
组件:
当注册组件(或者 props)时,可以使用 kebab-case ,camelCase ,或 TitleCase 。Vue 不关心这个。
// 在组件定义中
components: { // 使用 kebab-case 形式注册
'kebab-cased-component': { }, // register using camelCase
'camelCasedComponent': { }, // register using TitleCase
'TitleCasedComponent': { }
}
在 HTML 模版中,请使用 kebab-case 形式:
<!-- 在HTML模版中始终使用 kebab-case --> <kebab-cased-component></kebab-cased-component> <camel-cased-component></camel-cased-component> <title-cased-component></title-cased-component>
当使用字符串模式时,可以不受 HTML 的 case-insensitive 限制。
<!-- 在字符串模版中可以用任何你喜欢的方式! --> <my-component></my-component> <myComponent></myComponent> <MyComponent></MyComponent>
如果组件未经 slot 元素传递内容,你甚至可以在组件名后使用 / 使其自闭合:
<my-component/>
当然,这只在字符串模版中有效。因为自闭的自定义元素是无效的 HTML ,浏览器原生的解析器也无法识别它。
component命名要求:
1. 检查名称是否与 HTML 元素或者 Vue 保留标签重名,不区分大小写。(常用HTML标签)
2. 检查组件名称是否以字母开头,后面跟字母、数值或下划线。
使用 Virtual DOM 解析模板时,不会将模板中的标签名转成小写,而是保留原始标签名。然后,使用原始的标签名进行匹配组件。
例如, <MyComponent></MyComponent> 不会转为为小写形式,直接以 MyComponent 为基础开始匹配。
当然,匹配的规则依次匹配:原标签名、camelCase化的标签名、PascalCase化的标签名。
//之前在 1.0 不能正常运行的示例代码,在 2.0 中可以正常运行了: Vue.component('MyComponent', {
template: '<div>hello, world</div>'
}) new Vue({
el: '#app',
template: '<MyComponent></MyComponent>'
})
在 Vue 1.0 和 2.0 中还有一种定义组件模板的方式,即使用 DOM 元素。在这种情况下,解析模板时仍然会将标签转为小写形式。所以下面的代码,在 1.0 和 2.0 均不能正常运行。
// index.html
<div id="app">
<MyComponent></MyComponent>
</div> // main.js
Vue.component('MyComponent', {
template: '<div>hello, world</div>'
}) new Vue({
el: '#app'
})
由于 JavaScript 的限制, Vue 不能检测以下变动的数组:
当你利用索引直接设置一个项时,例如:
vm.items[indexOfItem] = newValue
当你修改数组的长度时,例如:
vm.items.length = newLength
为了解决第一类问题,以下两种方式都可以实现和 vm.items[indexOfItem] = newValue 相同的效果, 同时也将触发状态更新:
// Vue.set Vue.set(example1.items, indexOfItem, newValue) // Array.prototype.splice` example1.items.splice(indexOfItem, 1, newValue)
为了解决第二类问题,你也同样可以使用 splice:
example1.items.splice(newLength)
父组件给子组件传参,通过props属性。还可以定义类型
https://cn.vuejs.org/v2/guide/components.html#Prop-验证
除了以下定义一种类型的写法,还有多种类型,必传且是某个类型,某个类型且有默认值,某个类型但默认值由一个工厂函数返回,或者是自定义
props: {
username: String,
} // 全局注册的组件的写法:
props: ['myMessage'],
子组件给父组件传参,通过this.$emit('方法', '内容')
vertical-align: top;
两个span对齐 / 图片和文字对齐 / inline-block元素 .......
字体图标。
一行文字超出省略号:
white-space: nowrap
overflow: hidden
text-overflow: ellipsis
空白间隙去掉的方法:
font-size: 0; // 或者 两个标签之间紧贴着。
filter类似滤镜效果。模糊效果。
filter: blur(10px)
同上类似。模糊效果(仅对背景生效,仅限iOS系统)
backdrop-filter: blur(10px)
type,给参数 / 变量定义类型。
computed,内容变时会更新,否则会缓存起来。
如果是传参等方式得到值,需要判断值是否为空,否则会报值为undefined的错。
使用变量 / 产量拼接内容,而不使用字符串拼接内容。
各子元素不固定宽 / 高,但是整个布局占固定值时,flex布局。尽量用block元素。
flex的默认值为0 1 auto
flex是放大比例(flex-grow) 缩小比例(flex-shrink)占据的空间(flex-basis)的简写属性
可以填auto(相当于 1 1 auto)和none(0 0 auto)
flex: 1(相当于 1 1 0%)
使用flex属性后,该元素最好添加width属性,值为flex-basis定义的值。
vue项目中,不用写CSS的兼容性代码。
因为vue-loader在编译.vue文件的时候,使用了Postcss的工具,它会给有兼容性问题的属性添加兼容性代码。
它是根据can i use官网写的代码。
写在<style></style>内才会生效。在html中添加style属性是不会添加兼容性代码的。
换行问题:
v-html可以直接加<br>进行换行,v-model中无效
例外:textarea标签使用v-model时,可以使用\r进行换行
实现垂直居中的方式:
父元素: display: table,
子元素: display: table-cell;vertical-align: middle;
无论一行或多行。
删除线效果 text-decoration: line-through
iScroll
ref的使用:
在父页面调用子组件的标签:
在父页面中的组件上加ref。然后在子组件中的某个标签加ref。即可。
nextTick
将回调延迟到下次 DOM 更新循环之后执行。
https://cn.vuejs.org/v2/api/#vm-nextTick
new Vue({
// ...
methods: {
// ...
example: function () {
// 修改数据
this.message = 'changed'
// DOM 还没有更新
this.$nextTick(function () {
// DOM 现在更新了
// `this` 绑定到当前实例
this.doSomethingElse()
})
}
}
})
box-sizing: border-box
:disabled="type == '值'"
:class = name
name可以是computed
$dispatch 和 $broadcast在vue2.0中已经弃用,推荐使用一个专用的状态管理层如:Vuex 。
或者子组件和父组件之间 相互传参。
getBoundingClientRect用于获取某个元素相对于视窗的位置集合。集合中有top, right, bottom, left等属性。
点击事件。取消冒泡。
v-on:click.stop="doThis"
阻止默认事件。
v-on:click.prevent="doThis"
https://cn.vuejs.org/v2/guide/events.html#事件修饰符
判断页面来源。
https://router.vuejs.org/zh-cn/advanced/navigation-guards.html
组件内部的方法,命名建议以两个下划线开头
外部传参方法等,不用两个下划线开头。
padding取%值,
> %,规定基于父元素的宽度的百分比的内边距。
给按钮加padding。方便点击
或者整个部分可以点击。
过滤:filter
// 计算属性
computed: {
evenNumbers: function () {
return this.numbers.filter(function (number) {
return number % 2 === 0
})
}
} // 或者,你也可以在计算属性不适用的情况下 (例如,在嵌套 v-for 循环中) 使用 method 方法:
<li v-for="n in even(numbers)">{{ n }}</li> data: {
numbers: [ 1, 2, 3, 4, 5 ]
},
methods: {
even: function (numbers) {
return numbers.filter(function (number) {
return number % 2 === 0
})
}
} // -----------------
// 过滤器函数
<!-- in mustaches -->
{{ message | capitalize }}
<!-- in v-bind -->
<div v-bind:id="rawId | formatId"></div> // PS: 为了在其他指令中实现更复杂的数据变换,你应该使用计算属性。 new Vue({
// ...
filters: {
capitalize: function (value) {
if (!value) return ''
value = value.toString()
return value.charAt(0).toUpperCase() + value.slice(1)
}
}
}) // 过滤器可以串联:
{{ message | filterA | filterB }} // 过滤器是 JavaScript 函数,因此可以接受参数:
{{ message | filterA('arg1', arg2) }} // 这里,字符串 'arg1' 将传给过滤器作为第二个参数, arg2 表达式的值将被求值然后传给过滤器作为第三个参数。
https://cn.vuejs.org/v2/guide/list.html#显示过滤-排序结果
https://cn.vuejs.org/v2/guide/syntax.html#过滤器
export 和 export default
http://es6.ruanyifeng.com/#docs/module#export-命令
http://es6.ruanyifeng.com/#docs/module#export-default-命令
切换组件时,希望保留组件的状态时,加上keep-alive 即可
vue项目中遇到的一些问题的更多相关文章
- vue 项目中实用的小技巧
# 在Vue 项目中引入Bootstrap 有时在vue项目中会根据需求引入Bootstrap,而Bootstrap又是依赖于jQuery的,在使用npm按照时,可能会出现一系列的错误 1.安装jQu ...
- 如何在VUE项目中添加ESLint
如何在VUE项目中添加ESLint 1. 首先在项目的根目录下 新建 .eslintrc.js文件,其配置规则可以如下:(自己小整理了一份),所有的代码如下: // https://eslint.or ...
- 在vue项目中, mock数据
1. 在根目录下创建 test 目录, 用来存放模拟的 json 数据, 在 test 目录下创建模拟的数据 data.json 文件 2.在build目录下的 dev-server.js的文件作如下 ...
- 浅谈 Axios 在 Vue 项目中的使用
介绍 Axios 是一个基于 promise 的 HTTP 库,可以用在浏览器和 node.js 中. 特性 它主要有如下特性: 浏览器端发起XMLHttpRequests请求 Node端发起http ...
- 去除vue项目中的#及其ie9兼容性
一.如何去除vue项目中访问地址的# vue2中在路由配置中添加mode(vue-cli创建的项目在src/router/index.js) export default new Router({ m ...
- vue 项目中当访问路由不存在的时候默认访问404页面
前言: 在Vue项目中,当访问的页面路由不存在或错误时,页面显示为一片空白.然而,通常我们需要对访问url不存在或者错误的情况下添加默认的404页面,即not found页面. 一般的处理方法是: 在 ...
- vue项目中遇到的那些事。
前言 有好几天没更新文章了.这段实际忙着做了一个vue的项目,从 19 天前开始,到今天刚好 20 天,独立完成. 做vue项目做这个项目一方面能为工作做一些准备,一方面也精进一下技术. 技术栈:vu ...
- scss/less语法以及在vue项目中的使用(转载)
1.scss与less都是css的预处理器,首先我们的明白为什么要用scss与less,因为css只是一种标记语言,其中并没有函数变量之类的,所以当写复杂的样式时必然存在局限性,不灵活,而scss与l ...
- Vue项目中GraphQL入门学习与应用
1.GraphQL是什么,能干什么? 正如官网所说,GraphQL是一种用于API查询的语言.Facebook 的移动应用从 2012 年就开始使用 GraphQL.GraphQL 规范于 2015 ...
- 转:如何在Vue项目中使用vw实现移动端适配
https://www.w3cplus.com/mobile/vw-layout-in-vue.html 有关于移动端的适配布局一直以来都是众说纷纭,对应的解决方案也是有很多种.在<使用Flex ...
随机推荐
- 一步步创建第一个Docker App —— 2. 创建 Docker化 主机
原文:https://docs.docker.com/engine/getstarted-voting-app/node-setup/ 部署voting app的第一步,是为集群节点(swarm no ...
- BZOJ2217 [Poi2011]Lollipop 【贪心】
题目链接 BZOJ2217 题解 如果只判定存不存在方案的话,我倒是想到可以将\(2\)拆成两个\(1\),其中一个不能作为区间开头,线段树优化计算补集方案数 但是一看这道题要输出方案啊,,, 怎么办 ...
- 【ZOJ3899】State Reversing 解题报告
[ZOJ3899]State Reversing Description 有\(N\)个不同的怪兽,编号从\(1\) 到\(N\).Yukari有\(M\)个相同的房间,编号为\(1\)到\(M\). ...
- 【bzoj4031】[HEOI2015]小Z的房间 解题报告
[bzoj4031][HEOI2015]小Z的房间 Description 你突然有了一个大房子,房子里面有一些房间.事实上,你的房子可以看做是一个包含\(n*m\)个格子的格状矩形,每个格子是一个房 ...
- HDU.1796 How many integers can you find ( 组合数学 容斥原理 二进制枚举)
HDU.1796 How many integers can you find ( 组合数学 容斥原理 二进制枚举) 题意分析 求在[1,n-1]中,m个整数的倍数共有多少个 与 UVA.10325 ...
- spring管理hibernate,mybatis,一级缓存失效原因
mybatis缓存:一级缓存和二级缓存 hibernate缓存:一级缓存和二级缓存 关于缓存: 缓存是介于物理数据源与应用程序之间,是对数据库中的数据复制一份临时放在内存中的容器, 其作用是为了减少应 ...
- uoj50【UR#3】链式反应
题解: 令$a(x)$为破坏死光的$EFG$,$f(x)$为方案的$EGF$:$f(x) = x + \int \ \frac{1}{2} f^2(x) a(x) \ dt$; 注意到$f(0)= ...
- bzoj2146 Construct
题目描述 随着改革开放的深入推进…… 小T家要拆迁了…… 当对未来生活充满美好憧憬的小T看到拆迁协议书的时候,小T从一位大好的社会主义青年变成了绝望的钉子户. 由于小T的家位于市中心,拆迁工作又难以进 ...
- Centos Python3安装共存
安装python3.6可能使用的依赖 yum install openssl-devel bzip2-devel expat-devel gdbm-devel readline-devel sqlit ...
- 三、Linux学习之命令基本格式篇
一.命令格式 命令 [选项] [参数] 注意: 1.和别命令使用不遵循此格式 2.当有多个选项时,可以写在一起 3.简化选项与完整选项(-a 等价于--all) 4.中括号为可选,意思是可以有可以没有 ...