课程目标
1.插值
2.指令
3.过滤器
4.计算属性&监听器
1.1 插值
1.1.1 文本
{{msg}}:通过“{{...}}”拿值
<body>
<!-- 定义边界 -->
<div id="app">
<h3>{{msg}}</h3>
{{msg}}
</div>
</body>
<script type="text/javascript">
// 绑定边界 ES6具体体现
new Vue({
el:'#app',
data(){
return {msg:'hello vue'};
}
})
</script>
运行结果为:
1.1.2 html
使用v-html指令用于输出html代码
<body>
<!-- 定义边界 -->
<div id="app">
<p>文本转义</p>
<div v-html="msg"></div>
</div>
</body>
<script type="text/javascript">
// 绑定边界 ES6具体体现
new Vue({
el:'#app',
data(){
return {
msg:'<span style="color: red;">hello vue</span>',
};
}
})
</script>
运行结果为:
可以看出CSS样式已经加载
1.1.3 属性
HTML属性中的值应使用v-bind指令
<body>
<!-- 定义边界 -->
<div id="app">
<p>vue的属性</p>
<input value="msg"/>
<input v-bind:value="msg"/>
</div>
</body>
<script type="text/javascript">
// 绑定边界 ES6具体体现
new Vue({
el:'#app',
data(){
return {
msg:'hello vue',
};
}
})
</script>
运行结果为:
1.1.4 表达式
Vue提供了完全的JavaScript表达式支持
<body>
<!-- 定义边界 -->
<div id="app">
<p>vue中的js支持</p>
{{str}}<br/>
{{str.substr(0,5)}}
</div>
</body>
<script type="text/javascript">
// 绑定边界 ES6具体体现
new Vue({
el:'#app',
data(){
return {
str:'hello vue js'
};
}
})
</script>
结果:
1.2 指令
指的是带有“v-”前缀的特殊属性
1.2.1 核心指令
(v-if|v-else|v-else-if)/v-show/v-for/v-bind/v-on/v-model
v-if|v-else|v-else-if:根据其后表达式的bool值进行判断是否渲染该元素
他们只能是兄弟元素
v-else-if上一个兄弟元素必须是v-if
v-else上一个兄弟元素必须是v-if或者是v-else-if
<body>
<!-- 定义边界 -->
<div id="app">
<p>v-if|v-else|v-else-if</p>
<input v-model="score"/>
<span v-if="score>90">优秀</span>
<span v-else-if="score>80">优秀</span>
<span v-else-if="score>70">中等</span>
<span v-else-if="score>60">良好</span>
<span v-else="">不及格</span>
</div>
</body>
<script type="text/javascript">
// 绑定边界 ES6具体体现
new Vue({
el:'#app',
data(){
return {
score:89
};
}
})
</script>
可以通过改变值来改变结果
v-show:与v-if类似,只是会渲染其身后表达式为false的元素,而且会给这样的元素添加css代码:style="display:none"
<body>
<!-- 定义边界 -->
<div id="app">
<p>v-show</p>
<span v-if="score>100">不存在</span>
<span v-show="score>100">不存在</span>
</div>
</body>
<script type="text/javascript">
// 绑定边界 ES6具体体现
new Vue({
el:'#app',
data(){
return {
score:110
};
}
})
</script>
v-if与v-show的区别:
v-if是真的不存在,而v-show是存在只是被css样式隐藏了
v-for:类似JS的遍历,
遍历数组: v-for="item in items", items是数组,item为数组中的数组元素
遍历对象: v-for="(value,key,index) in stu", value属性值,key属性名,index下标
<body>
<!-- 定义边界 -->
<div id="app">
<p>v-for</p>
<div v-for="n in arr">
{{n}}<br />
</div>
<div v-for="n in likes">
{{n}}<br />
</div>
</div>
</body>
<script type="text/javascript">
// 绑定边界 ES6具体体现
new Vue({
el:'#app',
data(){
return {
arr:['篮球','足球','乒乓球'],
likes:[
{id:1,name:'spa'},
{id:2,name:'拔火罐'},
{id:3,name:'大宝剑'}
]
};
}
})
</script>
v-bind
v-on
<body>
<!-- 定义边界 -->
<div id="app">
<p>v-on</p>
<button type="button" v-on:click="do_spa">点我</button>
</div>
</body>
<script type="text/javascript">
// 绑定边界 ES6具体体现
new Vue({
el:'#app',
data(){
methods:{
do_spa(){
alert('叫了一个spa服务')
}
}
})
</script>
点击“点我”按钮后会执行methods里面的方法alert
v-model:用来在 input、select、textarea、checkbox、radio 等表单控件元素上创建双向数据绑定,根据表单上的值,自动更新绑定的元素的值
v-for/v-model一起绑定[多选]复选框和单选框
1.2.2 参数
一些指令能够接收一个“参数”,在指令名称之后以冒号表示,例如:
<a v-bind:href="url">...</a>
在这里href是参数,告知v-bind指令将该元素的href属性与表达式url的值绑定
<a v-on:click="doSomething">...</a>
在这里click参数是监听的事件名。
1.2.3 动态参数
从2.6.0开始,可以用方括号括起来的JavaScript表达式作为一个指令的参数
<a v-bind:[attrname]="url"> ... </a>
同样地,你可以使用动态参数为一个动态的事件名绑定处理函数
<a v-on:[evname]="doSomething"> ... </a>
注1:动态参数表达式有一些语法约束,evName无效,evname有效,回避大写
<body>
<!-- 定义边界 -->
<div id="app">
<input v-model="envname"/><br />
<button type="button" v-on:[envname]="do_spa">魔法按钮</button><br />
</div>
</body>
<script type="text/javascript">
// 绑定边界 ES6具体体现
new Vue({
el:'#app',
data(){
return {
envname:'click'
};
},
methods:{
do_spa(){
alert('叫了一个spa服务')
}
}
})
</script>
## 初学者了解下即可
1.2.4 修饰符
修饰符 (modifier) 是以半角句号 . 指明的特殊后缀,用于指出一个指令应该以特殊方式绑定。
例如:.prevent 修饰符告诉 v-on 指令对于触发的事件调用 event.preventDefault()
<form v-on:submit.prevent="onSubmit">...</form>
注1:event.preventDefault()方法的作用?
该方法将通知Web浏览器不要执行与事件关联的默认动作(如果存在这样的动作)
1.2.5 简写
Vue为v-bind和v-on这两个最常用的指令,提供了特定简写
<a v-bind:href="url">...</a>
<a :href="url">...</a>
<a v-on:click="doSomething">...</a>
<a @click="doSomething">...
3. 过滤器
<div id="app">
<h2>基本过滤器</h2>
{{str}}
<br>
{{str|filterA}}
<h2>过滤器串联</h2>
{{str|filterA|filterB}}
<h2>过滤器传参</h2>
{{str|filterC(2,8)}}
<h2>引用外部js</h2>
{{curtime}}
<br>
{{curtime|format}}
</div>
<script>
Vue.filter('format', function(v) {
return fmtDate(v, 'yyyy-mm-dd hh:MM:ss');
})
// 绑定边界
new Vue({
el: '#app',
filters: {
filterA: function(v) {
return v.substring(0, 5);
},
filterB: function(v) {
return v.substring(1, 2);
},
filterC: function(v, begin, end) {
return v.substring(begin, end);
}
},
data() {
return {
str: 'hello vue',
curtime: new Date()
}
}
})
</script>
date.js
//给Date类添加了一个新的实例方法format
Date.prototype.format = function (fmt) {
//debugger;
var o = {
"M+": this.getMonth() + 1, //月份
"d+": this.getDate(), //日
"h+": this.getHours(), //小时
"m+": this.getMinutes(), //分
"s+": this.getSeconds(), //秒
"q+": Math.floor((this.getMonth() + 3) / 3), //季度
"S": this.getMilliseconds() //毫秒
};
if (/(y+)/.test(fmt))
fmt = fmt.replace(RegExp.$1, (this.getFullYear() + "").substr(4 - RegExp.$1.length));
for (var k in o)
if (new RegExp("(" + k + ")").test(fmt))
fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (("00" + o[k]).substr(("" + o[k]).length)));
return fmt;
};
function fmtDate(date, pattern) {
var ts = date.getTime();
var d = new Date(ts).format("yyyy-MM-dd hh:mm:ss");
if (pattern) {
d = new Date(ts).format(pattern);
}
return d.toLocaleString();
};
4. 计算属性
计算属性可用于快速计算视图(View)中显示的属性。这些计算将被缓存,并且只在需要时更新
computed:{}
计算属性单向绑定
修改单价和数量时, 小计会变化
<table>
<tr>
<td>单价</td>
<td>数量</td>
<td>小计</td>
</tr>
<tr>
<td><input v-model="danjia"></td>
<td><input v-model="count"></td>
<td>{{xiaoji}}</td>
</tr>
</table>
computed: {
xiaoji: function(v) {
return this.danjia * this.count;
}
}
5. 监听属性
监听属性 watch,我们可以通过 watch 来响应数据的变化
watch:{}
监听属性双向绑定
修改m时, km的值会发生变化
修改km时, m的值会发生变化
<h2>监听属性</h2>
m: <input v-model="m">
km: <input v-model="km">
watch: {
m: function(v) {
// 此时的v指的是被监听的属性
this.km = parseInt(v) / 1000;
},
km: function(v) {
this.m = parseInt(v) * 1000;
}
},
小结:计算属性和监听属性的区别
自己的理解
computed用来监控自己定义的变量,该变量不在data里面声明,直接在computed里面定义,然后就可以在页面上进行双向数据绑定展示出结果或者用作其他处理;
computed比较适合对多个变量或者对象进行处理后返回一个结果值,也就是数多个变量中的某一个值发生了变化则我们监控的这个值也就会发生变化,
举例:购物车里面的商品列表和总金额之间的关系,只要商品列表里面的商品数量发生变化,或减少或增多或删除商品,总金额都应该发生变化。这里的这个总金额使用computed属性来进行计算是最好的选择
与watch之间的区别:
刚开始总是傻傻分不清到底在什么时候使用watch,什么时候使用computed。这里大致说一下自己的理解:
watch主要用于监控vue实例的变化,它监控的变量当然必须在data里面声明才可以,它可以监控一个变量,也可以是一个对象
那么对比一下,我们很容易得出computed(计算属性)和watch(监听属性)都存在缓存机制的,性能都处优先选择,那么这两者哪个更好呢?
上述很容易得出监听属性比计算属性复杂的多!因此在一个项目同时可以使用计算属性,methods和监听属性实现时候我们优先使用计算属性其次是监听属性,最后选择methods!