插值
1.文本
2.html
3.属性
4.class、style绑定
5.表达式
双大括号插值(Mustache语法):
双大括号插值是Vue中最常用的插值语法,使用双大括号
{{ }}
将表达式包裹起来,表达式将会被求值后显示在HTML中。
{{msg}}
案列
源码
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <script src="https://cdn.bootcdn.net/ajax/libs/vue/2.7.6/vue.js"></script> <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.7.1/jquery.js"></script> <title>插值</title> <style type="text/css"> .f30{ font-size: 30px; } </style> </head> <body> <div id="app"> <p>文本</p> {{msg}} <p>thml解析</p> {{msg2}}<br> <b :class="msg3" v-html="msg2"></b> <p>表达式</p> {{num+1}} {{warn.substr(0,2)}} <input v-model="ok" /> {{ok==1?'大聪明':'臭傻逼'}} </div> <script type="text/javascript"> new Vue({ el:"#app", data(){ return { msg:'沸洋洋你个臭傻逼', msg2:'<span style="color:yellowgreen">我可是懒大王</span>', msg3:'f30', num:5, warn:'靓仔闪亮登场', ok:1 }; } }); </script> </body> </html>
指令
在Vue中,指令是用于将特定行为应用于DOM元素的特殊属性。Vue提供了许多内置指令,可以用于处理常见的DOM操作和数据绑定
v-bind插值:v-bind指令用于在HTML属性中插入动态的数据。可以简写为:。
<img :src="imageSrc">
上述代码中,:src将会把imageSrc变量的值作为src属性的值进行插值。
v-on插值:v-on指令用于在HTML事件处理程序中插入动态的方法。可以简写为@。
<button @click="handleClick">Click Me</button>
上述代码中,@click将会将handleClick方法插入到click事件处理程序中。
v-html插值:v-html指令用于将数据作为原始HTML插入到元素中。
<div v-html="htmlString"></div>
上述代码中,htmlString变量的值将会被作为原始HTML插入到<div>元素之中。
v-text插值:v-text指令用于替代双大括号插值,将指定的数据直接作为文本内容插入到元素中。
<p v-text="message"></p>
上述代码中,message变量的值将会作为<p>元素的文本内容。
源码
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <script src="https://cdn.bootcdn.net/ajax/libs/vue/2.7.6/vue.js"></script> <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.7.1/jquery.js"></script> <title>指令</title> </head> <div id="app"> <P>v-if/v-else-if/v-else</P> <input v-model="score" /><br /> <b v-if="score < 60">麻花佬</b> <b v-else-if="score >= 60 && score < 70">屌丝</b> <b v-else-if="score >= 70 && score < 80">叼毛</b> <b v-else-if="score >= 80 && score < 90">良好青年</b> <b v-else="">靓仔</b> 60以下 麻花佬 60-70 屌丝 70-80 叼毛 80-90 良好青年 90以上 靓仔 <p>v-show</p> v-if与v-show的区别?<br> <b v-if="isSHow">展示</b> <b v-show="isSHow">展示</b> <p>v-for</p> <i v-for="a in arr">{{a}} </i> <i v-for="i,u in users"> {{i}}</i> <select> <option v-for="h in hobby" :value="h.id">{{h.name}}</option> </select> <div id="" v-for="h in hobby"> <input type="checkbox" name="hobby" :value="h.id" />{{h.name}} </div> <p>动态参数</p> <input v-model="evname" /> <button v-on:[evname]="test">点我</button> </div> <body> <script type="text/javascript"> new Vue({ el:"#app", data(){ return { score:88, isSHow:false, arr: [1, 2, 3, 4], users: [{ name: 'sz', id: 1 },{ name: 'sd', id: 2 },{ name: 'sn', id: 3 },{ name: 'sb', id: 4 }], hobby:[{ name: '喜羊羊', id: 1 },{ name: '美羊羊', id: 2 },{ name: '沸羊羊', id: 3 },{ name: '懒大王', id: 4 }], evname:'click' }; } ,methods:{ test(){ //单击事件,双击事件 alert('点我你试试!!!') } } }); </script> </body> </html>
过滤器
在Vue.js中,过滤器(Filters)是一种用于格式化文本输出的特殊函数。它可以应用于绑定表达式中的数据,在渲染过程中将数据转换为所需的格式。
源码
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <script src="https://cdn.bootcdn.net/ajax/libs/vue/2.7.6/vue.js"></script> <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.7.1/jquery.js"></script> <script src="date.js" type="text/javascript" charset="utf-8"></script> <title>过滤</title> </head> <div id="app"> <P>局部过滤器基本应用</P> {{msg}}<br /> {{msg | filterA}} <P>局部过滤器串行使用</P> {{msg}}<br /> {{msg | filterB}} <P>局部过滤器传参</P> {{msg | filterC(3,10)}}<br /> <p>全局过滤器</p> {{time}}<br /> {{time | fmtDateFilter}} </div> <body> <script type="text/javascript"> Vue.filter('fmtDateFilter', function (value) { return fmtDate(value); }); new Vue({ el:'#app', filters:{ 'filterA':function(v){ return v.substring(0,6); }, 'filterB':function(v){ return v.substring(3,8); }, 'filterC':function(v,begin,end){ return v.substring(begin,end); } }, data(){ return { msg: '沸羊羊你个臭傻逼,俺可是懒大王', time:new Date() }; } ,methods:{ test(){ //单击事件,双击事件 alert('点我你试试!!!') } } }); </script> </body> </html>
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(); };
计算属性和监听属性
计算属性(Computed):计算属性是根据其他属性的值计算得出的属性,它会根据依赖的属性自动更新。
监听属性(Watch):监听属性允许你在某个属性发生变化时执行自定义的逻辑。
源码
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <script src="https://cdn.bootcdn.net/ajax/libs/vue/2.7.6/vue.js"></script> <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.7.1/jquery.js"></script> <title>计算属性监听属性</title> </head> <body> <div id="app"> <p>计算属性</p> 单价:<input v-model="price"> 数量:<input v-model="num"> 小计:{{count}} <p>监听属性</p> 千米:<input v-model="km" /><br /> 米:<input v-model="m" /> </div> <script type="text/javascript"> new Vue({ el:"#app", data(){ return { price:66, num:1, m:1000, km:1 }; }, computed:{ count:function(){ return this.price * this.num; } }, watch:{ km:function(v){ //v指的是被监听的属性是,是km this.m = parseInt(v) * 1000; }, m:function(v){ //v指的是被监听的属性是,是m this.km = parseInt(v) / 1000; } } }); </script> </body> </html>
计算属性跟监听属性的区别
计算属性和监听属性是Vue中用于处理数据变化的两种方法,它们的主要区别如下:
- 计算属性:
- 计算属性是Vue中的一个特殊属性,用于定义一个依赖其他属性计算得来的属性。
- 计算属性会根据它所依赖的属性的变化而自动重新计算,只有当依赖属性发生变化时,计算属性才会重新求值。
- 计算属性的值会被缓存起来,只有当依赖的属性发生变化时,才会重新计算。
- 监听属性:
- 监听属性是通过
watch
选项来定义的,用于监听某个属性的变化,并在属性变化时执行特定的逻辑。- 监听属性需要显式地定义监听函数,并在函数中处理属性变化时的逻辑。
- 监听属性适用于需要监听并处理属性变化的情况,可以执行更复杂的逻辑,如异步操作或调用其他方法。
总结来说,计算属性适用于通过其他属性计算得到的属性值,而监听属性适用于需要监听并处理属性变化的情况。计算属性会自动计算并缓存值,而监听属性需要显式地定义监听函数来处理属性变化。
Vue购物车结算案列
结合我们当前学的内容简单的写一个结算
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <script src="https://cdn.bootcdn.net/ajax/libs/vue/2.7.6/vue.js"></script> <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.7.1/jquery.js"></script> <title>购物车</title> </head> <body> <div id="app"> <!-- 购物车内容 --> <table> <thead> <tr> <th>商品名称</th> <th>单价</th> <th>数量</th> <th>小计</th> </tr> </thead> <tbody> <tr v-for="(item, index) in cartItems" :key="index"> <td>{{ item.name }}</td> <td>{{ item.price }}</td> <td> <button @click="decrement(index)">-</button> {{ item.quantity }} <button @click="increment(index)">+</button> </td> <td>{{ calculateSubtotal(item) }}</td> </tr> </tbody> <tfoot> <tr> <td colspan="3">总计:</td> <td>{{ calculateTotal() }}</td> </tr> </tfoot> </table> </div> <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script> <script> new Vue({ el: '#app', data: { cartItems: [], // 购物车商品列表 }, methods: { // 减少数量 decrement(index) { if (this.cartItems[index].quantity > 1) { this.cartItems[index].quantity--; } }, // 增加数量 increment(index) { this.cartItems[index].quantity++; }, // 计算小计 calculateSubtotal(item) { return item.price * item.quantity; }, // 计算总计 calculateTotal() { let total = 0; for (let i = 0; i < this.cartItems.length; i++) { total += this.cartItems[i].price * this.cartItems[i].quantity; } return total; } }, mounted() { // 初始化购物车商品列表 // 可以根据实际情况从后端获取数据,并将数据赋值给cartItems this.cartItems = [ { name: 'ddv', price: 888, quantity: 1 }, { name: '鹤顶红', price: 1888, quantity: 2 }, { name: '奥里给', price: 8888, quantity: 3 }, ]; } }); </script> </body> </html>