1.代码规范
缩进一般为4个空格,前端一般情况下缩进两个空格,不同的公司不一样,超过50%的公司的缩进规定是两个空格。故本文及之后的代码缩进都用2个空格。
其他地方可以参考CLI 中editconfig 也是2个空格。
2.WebStorm中Vue模板的设置
下图是模板的一个例子:
3.mustache的简单语法
3.1.mustache语法可以实现简单的文字和数字呈现,如下:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<div id="app">
<h2>{{message}}</h2>
<h2>{{firstName+lastName}}</h2>
// mustache语法语句长度过长时也可以用options中的computed来实现
<h2>{{firstName+' '+lastName}}</h2>
<h2>{{firstName}} {{lastName}}</h2>
<h2>{{counter * 2}}</h2>
</div>
<script src="../js/vue.js"></script>
<script type="text/javascript">
const app = new Vue({
el: '#app',
data: {
message: 'Hello, world!',
firstName: 'Kobe',
lastName: 'Bryant',
counter: 100
}
})
</script>
</body>
</html>
3.2.v-once指令
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<div id="app">
<h2>{{message}}</h2>
<!-- v-once指令用于应对这样需求:在服务器端更改数据或者控制台更改页面响应内容时,对应的DOM不会跟随改变,也就是非响应模式-->
<h2 v-once>{{message}}</h2>
</div>
<script src="../js/vue.js"></script>
<script type="text/javascript">
const app = new Vue({
el: '#app',
data: {
message: 'Hello, world!'
}
})
</script>
</body>
</html>
对应效果图和console操作显示:
3.3.v-html指令
全部代码示例:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<div id="app">
<h2>{{url}}</h2>
<h2 v-html = "url">{{}}</h2>
</div>
<script src="../js/vue.js"></script>
<script type="text/javascript">
const app = new Vue({
el: '#app',
data: {
message: 'Hello, world!',
url: '<a href="http://www.baidu.com">百度一下</a>'
}
})
</script>
</body>
</html>
对应效果图:
3.4.v-text指令
全部代码示例:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<div id="app">
<h2>{{message}} I am Wei Chun.</h2>
<!-- div中的内容会被message所覆盖-->
<h2 v-text="message"> I am Wei Chun.</h2>
</div>
<script src="../js/vue.js"></script>
<script type="text/javascript">
const app = new Vue({
el: '#app',
data: {
message: 'Hello, world!'
}
})
</script>
</body>
</html>
3.5.v-pre指令
全部代码示例:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<div id="app">
<h2>{{message}}</h2>
<!-- 原封不动的显示元素中的内容-->
<h2 v-pre>{{message}}</h2>
</div>
<script src="../js/vue.js"></script>
<script type="text/javascript">
const app = new Vue({
el: '#app',
data: {
message: 'Hello, world!'
}
})
</script>
</body>
</html>
3.6.v-cloak指令
在没有style演示控制和v-cloak指令修饰之前,在页面显示之初,会呈现出mustache原始标签,在延时之后才会显示出要显示的内容
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style>
[v-cloak] {
display: none;
}
</style>
</head>
<body>
<!-- -->
<div id="app" v-cloak>
<h2>{{message}}</h2>
</div>
<script src="../js/vue.js"></script>
<script type="text/javascript">
// 在vue解析之前,div中有一个属性v-cloak
// 在vue解析之后,div中没有一个属性v-cloak
// 掩饰显示内容,但是不会显示原mustache语法标签,达到用户显示友好的目的,但几乎不常用
setTimeout(function(){
const app = new Vue({
el: '#app',
data: {
message: 'Hello, world!'
}
})
}, 1000)
</script>
</body>
</html>
3.7.v-bind指令
前面学的指令主要作用是将值插入到我们模板的内容当中。
但是除了内容需要动态来决定外,某些属性我们也希望动态来绑定。比如:
① 动态绑定a元素的href属性;
② 动态绑定img元素的src属性。
这时,可以使用v-bind指令↓
作用:动态绑定属性
缩写::
预期:any(with argument) | Object(without argument)
参数:attrOrProp(optional)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<div id="app">
<!-- mustache语法是直接使用在标签内部的(content),不能放在图片源-->
<!-- <img src="{{message}}" alt="">-->
<!-- 这个做法同上面mustache语法的错误用法没有本质区别-->
<!-- <img src="imgURL" alt="">-->
<!-- 动态绑定图片源:当图片源改变的时候,浏览器端也会自动更改-->
<img v-bind:src="imageURL" alt="">
<img :src="imageURL" alt="">
<a v-bind:href="aHref">百度一下</a>
<!-- v-bind的语法糖-->
<a :href="aHref">百度两下</a>
</div>
<script src="../js/vue.js"></script>
<script type="text/javascript">
const app = new Vue({
el: '#app',
data: {
message: 'Hello, world!',
imageURL: 'https://img14.360buyimg.com/img/s100x100_jfs/t1/165712/18/9083/56369/603f3fa7E94c2bc8e/063831e5edec7f4d.jpg!cc_100x100.webp',
aHref: 'http://www.baidu.com',
}
})
</script>
</body>
</html>
3.7.1.v-bind动态绑定class(1)
通过鼠标监听事件监听鼠标点击,并执行动作。
前端常会用到鼠标点击切换某一个按钮或者div的样式显示,例如:
某个元素标签有一个默认样式,当点击时切换到指定给的样式,再次点击时样式回复默认,如此反复切换。
绑定class有两种方式:① 对象语法;② 数组语法
对象语法:class后面跟的是一个对象。
对象语法有以下几种常见的用法:
用法①:直接通过{}绑定一个类
<h2 :class="{'active': isActive}">Hello World</h2>
用法②:也可以通过判断,传入多个值
<h2 :class="{'active': isActive, 'line': isLine}">Hello World</h2>
用法③:和普通的类同时存在,并不冲突
注:如果isActive和isLine都为true,那么会有title/active/line三个类
<h2 class="title" :class="{'active': isActive, 'line': isLine}">Hello World</h2>
用法④:如果过于复杂,可以放在一个methods或者computed中
注:classes是一个计算属性
<h2 class="title" :class="classes">Hello World</h2>
对象语法的综合使用:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style>
.active{
color: #ff0000;
}
</style>
</head>
<body>
<div id="app">
<!-- <h2 class="active">{{message}}</h2>-->
<!-- <h2 :class="active">{{message}}</h2>-->
<!-- {}代表的是对象,不是mustache语法-->
<!-- 通过控制true和false来控制标签的active属性的添加(true)和移除(false)-->
<!-- <h2 :class="{类名1: true, 类名2: false}">{{message}}</h2>-->
<!-- 下面这种情况并不会将属性覆盖掉,而是合并共存-->
<h2 class="title" :class="{active: isActive, line: isLine}">{{message}}</h2>
<!-- 函数的调用实际上应该带小括号的,e.g.leftBtnClick()-->
<h2 class="title" :class="getClasses()">{{message}}</h2>
<button @click="leftBtnClick">change color</button>
<button @click="rightBtnClick">change property</button>
</div>
<script src="../js/vue.js"></script>
<script type="text/javascript">
const app = new Vue({
el: '#app',
data: {
message: 'Hello, world!',
isActive: 'true',
isLine: 'true',
},
methods: {
leftBtnClick: function () {
this.isActive = !this.isActive
},
rightBtnClick: function () {
this.isLine = !this.isLine
},
getClasses: function () {
return {active: this.isActive, line: this.isLine}
}
}
})
</script>
</body>
</html>
3.7.2.v-bind绑定class(2)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<div id="app">
<!-- 单引号将会被当做字符串去解析,不带单引号则作为变量去解析-->
<h2 class="title" :class="['active', 'line']">{{message}}</h2>
<h2 class="title" :class="[active, line]">{{message}}</h2>
<h2 class="title" :class="getClasses()">{{message}}</h2>
</div>
<script src="../js/vue.js"></script>
<script type="text/javascript">
const app = new Vue({
el: '#app',
data: {
message: 'Hello, world!',
active: 'aaa',
line: 'lll',
},
methods: {
getClasses: function () {
return [this.active, this.line]
}
},
})
</script>
</body>
</html>