Vue-模板语法、指令
一、模板语法
插值语法
最后都渲染成了字符串
html:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.6.4/jquery.js"></script> <link href="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.4.1/css/bootstrap.min.css" rel="stylesheet"> <script src="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.4.1/js/bootstrap.min.js"></script> <script src="./js/vue.js"></script> </head> <body> <div id="app"> <p>渲染字符串-姓名:{{name}}</p> <p>渲染字符串-年龄:{{age}}</p> <p>渲染数组-数组:{{list1}}</p> <p>渲染数组-数组-按位置取值:{{list1[1]}}</p> <p>渲染对象-对象:{{obj1}}</p> <p>渲染对象-对象-按key取值:{{obj1.name}}</p> <p>渲染对象-对象-按key取值:{{obj1['age']}}</p> <p>渲染标签字符串(处理了xss攻击):{{link1}}</p> <p>三目运算符(运算完的结果被渲染):{{10 > 9 ? 1 : 2}}</p> <p>三目运算符:{{list1.length>2?"大于2":"小于2"}}</p> <p>简单表达式:{{1+23}}</p> </div> </body> <script> var vm = new Vue({ el: '#app', data: { name: 'hh',//字符串 age: 19,//数值 list1: [1, 2, 3, 4],//数组 obj1: {name: 'hh', age: 19},//对象 link1: '<a href="https://www.baidu.com">百度一下 你就知道</a>' }, }) //结果会在Console台打印 var list1=[1,2,3,4] var res=list1.length>2?'大于1':'小于1' console.log(res) </script> </html>
结果:


结果:

二、指令
文本指令
Vue的指令系统,放在标签,以v- 开头的,每个指令都有特殊的用途
v-text:把字符串内容渲染到标签内部
v-html:把字符串内容渲染到标签内部,但如果是标签字符串,会被渲染出标签
v-show:控制标签显示与否:通过style的display是否等于none控制,在html中还存在这个标签,布尔值为true,则显示,为false就不显示
v-if:控制标签显示与否:通过dom操作做的,这个标签从dom中删除了,布尔值为true,则显示,为false就不显示
注:v-show 和v-if的区别:
- v-show:标签还在,只是不显示了(
display: none) - v-if:直接操作DOM,删除/插入 标签
v-text:标签内容显示js变量对应的值 v-html:让HTML渲染成页面
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.6.4/jquery.js"></script> <link href="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.4.1/css/bootstrap.min.css" rel="stylesheet"> <script src="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.4.1/js/bootstrap.min.js"></script> <script src="./js/vue.js"></script> </head> <body> <div id ='app'> <h3>v-text:会把字符串渲染到标签内部</h3> <p v-text="name"></p> <p v-text="link1"></p> <h3>v-html:会把字符串渲染到标签内部,但是如果是标签字符串,会被渲染成标签</h3> <p v-html="name"></p> <p v-html="link1"></p> </div> </body> <script> var vm=new Vue({ el:'#app', data:{ name:'hh', link1:'<a href="https://www.baidu.com">百度一下 点我知道</a>' } }) </script> </html>
结果:

v-show:显示/隐藏内容 v-if:显示/删除内容
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.6.4/jquery.js"></script> <link href="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.4.1/css/bootstrap.min.css" rel="stylesheet"> <script src="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.4.1/js/bootstrap.min.js"></script> <script src="./js/vue.js"></script> </head> <body> <div id ='app'> <h3>v-show:通过控制style的display是否等于none来控制标签的显示与否,标签还在html中</h3> <div> <span v-show="isShow">我是:isShow=true</span> </div> <h3>v-if:通过dom操作来控制标签的显示与否</h3> <span v-if="isShow1">我是:isShow1=true</span> </div> </body> <script> var vm=new Vue({ el:'#app', data:{ name:'hh', link1:'<a href="https://www.baidu.com">百度一下 点我知道</a>', isShow:true, isShow1:true, } }) </script> </html>
当开始设置isShow=true,isShow1=true时:

当在Console台将isShow改为false,isShow1改为false时:

结果:

再次都改成true时:

结果:v-show控制的标签,style中的没有写display:none

案例:通过点击按钮来控制显示和消失
index.html:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <script src="./js/vue.js"></script> </head> <body> <div id='app'> <div> <button v-on:click="handleShow">点我</button> <span v-if="isCreated">isCreated</span> </div> </div> </body> <script> var vm = new Vue({ el: '#app', data: { name: 'lqz', link1: '<a href="https://www.baidu.com">百度一下 你就知道</a>', isShow: true, isShow2: true, isCreated: false }, methods: { handleShow() { this.isCreated = !this.isCreated } } }) </script> </html>
结果:

当点击按钮时:

2. 事件指令
用 v-on 绑定事件后,只要触发事件,就会执行函数
v-on:点击事件,双击事件,滑动事件=‘函数’,用的最多的就是click事件,单击事件
v-on:click=‘函数’ ---》放在标签上,点击标签,就会触发函数执行,函数必须写在methods中
v-on:click可以简写为 ---》@click
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.6.4/jquery.js"></script> <link href="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.4.1/css/bootstrap.min.css" rel="stylesheet"> <script src="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.4.1/js/bootstrap.min.js"></script> <script src="./js/vue.js"></script> </head> <body> <div id="app"> <button v-on:click="handleClick">点我</button> <br> <button @click="handleClick1">点我:如果不传,默认第一个参数是 :点击事件对象:PointerEvent</button> <br> <button @click="handleClick1(1)">点我:传一个参数,只要传了参数,点击事件对象就不传入了</button> <br> <button @click="handleClick1(1,2)">点我:传两个参数,正常使用</button> <br> <button @click="handleClick1(1,2,3)">点我:传三个参数,只用前两个</button> <br> <button v-on:click="handleClick1(1,$event)">点我,传参数,第一个是数字,第二个是点击事件</button> </div> </body> <script> var vm = new Vue({ el: '#app', data: {}, methods: { // handleClick: function () { // alert('123') // } // es6 语法 handleClick() { alert('123') }, handleClick1(a,b) { console.log(a,b) } } }) </script> </html>
结果:

3. 属性指令
每个标签都会有属性,动态替换属性的值,就要用到属性指令
v-bind:属性=‘变量’ ---》针对所有标签的所有属性
v-bind:属性=‘变量’ 可以简写为----》:属性=‘变量’
eg:
:id =‘变量’
:name=‘变量’
index.html:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.6.4/jquery.js"></script> <link href="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.4.1/css/bootstrap.min.css" rel="stylesheet"> <script src="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.4.1/js/bootstrap.min.js"></script> <script src="./js/vue.js"></script> <style> .red { color: rgba(248, 126, 126, 0.7); } .purple { color: rgba(150, 150, 243, 0.7); } </style> </head> <body> <div id="app"> <h4>点击显示图片</h4> <button @click="handleClick">点我显示帅哥</button> <br> <button @click="handleClick1">点我帅哥变大</button> <br> <img :src="img_url" :height="height" :width="width"> <h2>class属性</h2> <button @click="handleChangeClass">点我变class</button> <div :class="isActivate?'red':'purple'"> <h3>我是一个div</h3> </div> </div> </body> <script> var vm = new Vue({ el: '#app', data: { img_url: '', height: '200px', width: '200px', isActivate: true }, methods: { // 点击显示帅哥 handleClick() { this.img_url = './img/2.png' }, // 点击帅哥变大 handleClick1() { this.height = '400px' this.width = '400px' }, // 点击切换颜色属性 handleChangeClass() { this.isActivate = !this.isActivate } } }) </script> </html>
结果:

当点击按钮时:


点击换色:

案例:切换图片,点击就修改src属性
index.html:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.6.4/jquery.js"></script> <link href="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.4.1/css/bootstrap.min.css" rel="stylesheet"> <script src="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.4.1/js/bootstrap.min.js"></script> <script src="./js/vue.js"></script> <style> .red { color: rgba(248, 126, 126, 0.7); } .purple { color: rgba(150, 150, 243, 0.7); } </style> </head> <body> <div id="app"> <h1>点击按钮,切换图片</h1> <button @click="handleChange">点我换帅哥</button> <img :src="img_url2" height="400px" width="400px"> </div> </body> <script> var vm = new Vue({ el: '#app', data: { // 切换图片 img_url2:'./img/1.png', img_list:['./img/1.png','./img/2.png','./img/3.png','./img/4.png','./img/5.png',] }, methods: { // 点击切换图片 handleChange(){ // Math.random() 0--1 之间的小数 // this.img_list.length 数组长度,当Math.random()为0.5时,img_list.length=5时,长度为5 this.img_url2=this.img_list[Math.floor(Math.random()*this.img_list.length)] } } }) </script> </html>
结果,当点击按钮时:


4. style和class
数据的绑定
语法::属性名='js变量/js语法'
:class='js变量、字符串、js数组'
class:三目运算符、数组、对象{red: true}
:style='js变量、字符串、js数组'
style:三目运算符、数组[{backgreound: 'red'},]、对象{background: 'red'}
style的绑定:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.6.4/jquery.js"></script> <link href="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.4.1/css/bootstrap.min.css" rel="stylesheet"> <script src="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.4.1/js/bootstrap.min.js"></script> <script src="./js/vue.js"></script> <style> .sizer { font-size: 30px; } .background { background-color: rgba(150, 150, 243, 0.7); } </style> </head> <body> <div id="app"> <h3>style绑定字符串、数组、对象</h3> <div :style="style_obj"> <button @click="handleXi">点击字体变细</button> <button @click="handleFont">点击字体变小</button> <p>我是div内的p</p> </div> </div> </body> <script> var vm=new Vue({ el:'#app', data:{ // style是字符串类型 style_str:'background: lightblue;font-size:30px;font-weight:bold', // style是数组类型 style_list:[{'background':'lightblue'},{'font-size':'30px'},{fontWeight: 'bold'}], // style是对象类型(建议用对象类型,方便修改) style_obj: {'background': 'lightblue', fontSize: '30px', 'font-weight': 'bold'}, }, methods:{ // 点击字体变细 handleXi(){ // 字符串 // this.style_str='background: lightblue;font-size:30px;' this.style_list.pop() }, //点击字体变小 handleFont(){ this.style_obj.fontSize='10px' } } }) </script> </html>
结果:

点击字体变细:

点击字体变小:

class的绑定:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.6.4/jquery.js"></script> <link href="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.4.1/css/bootstrap.min.css" rel="stylesheet"> <script src="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.4.1/js/bootstrap.min.js"></script> <script src="./js/vue.js"></script> <style> .size { font-size: 30px; } .background { background-color: rgba(150, 150, 243, 0.7); } </style> </head> <body> <div id="app"> <h3>class绑定字符串、数组、对象</h3> <div :class="class_list"> <button @click="handleClick">点击去除背景</button> <button @click="handleClick1">点击字体变小</button> <button @click="handleClick2">点字体变大</button> <p>我是div的span</p> </div> </div> </body> <script> var vm = new Vue({ el: '#app', data: { // 去除背景 handleClick() { //字符串 // this.class_str = 'size' // pop 删除最后一个元素 this.class_list.pop() }, // 点击字体变小 handleClick1() { //删除size:删除数组第一个元素用shift this.class_list.shift() }, //点击字体变大 handleClick2() { // push :往数组里加值 this.class_list.push('size') } } }) </script> </html>
结果:

点击去除背景:

点击字体变小:

点击字体变大:

5.条件渲染:
v-if
v-else-if
v-else
小案例:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.6.4/jquery.js"></script> <link href="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.4.1/css/bootstrap.min.css" rel="stylesheet"> <script src="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.4.1/js/bootstrap.min.js"></script> <script src="./js/vue.js"></script> </head> <body> <div id="app"> <span v-if="score>=90">优秀</span> <span v-else-if="score>=80&&score<90">良好</span> <span v-else-if="score>=60&&score<80">及格</span> <span v-else>不及格</span> </div> </body> <script> var vm=new Vue({ el:'#app', data:{ score:99 } }) </script> </html>
结果:
当score=99时

当 vm.score=78时:

当vm.score=59时:

6. 列表渲染:v-for
v-for能循环的:数组、对象、数字、字符串
index.html:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.6.4/jquery.js"></script> <link href="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.4.1/css/bootstrap.min.css" rel="stylesheet"> <script src="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.4.1/js/bootstrap.min.js"></script> <script src="./js/vue.js"></script> </head> <body> <div id="app"> <div class="container-fluid"> <div class="row"> <div class="col-md-6 col-md-offset-3"> <h4>循环列表</h4> <p v-for="(value,index) in girls_list">第{{index+1}}个女神是:{{value}}</p> <h4>循环对象</h4> <p v-for="(value,key) in user_obj">key值是:{{key}},value值是:{{value}}</p> <h4>循环字符串</h4> <p v-for="(value,index) in str">第{{index+1}}个字母是:{{value}}</p> <h4>循环数字</h4> <p v-for="i in 10">{{i}}</p> </div> </div> </div> </div> </body> <script> var vm=new Vue({ el:'#app', data:{ girls_list:['杨幂','高圆圆','孙千','倪妮'], user_obj:{'username':'方圆','age':19,'height':175}, str:'hello world' } }) </script> </html>
结果:
数组、对象:

字符串:

数字:

小案例:
购物车:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.6.4/jquery.js"></script> <link href="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.4.1/css/bootstrap.min.css" rel="stylesheet"> <script src="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.4.1/js/bootstrap.min.js"></script> <script src="./js/vue.js"></script> </head> <body> <div id="app"> <div class="container-fluid"> <div class="row"> <!--占六分且居中--> <div class="col-md-6 col-md-offset-3"> <div class=text-center> <button class="btn btn-success" @click="handleShow">显示购物车</button> <button class="btn btn-danger" @click="handleDelete">删除最后一条</button> </div> <table class="table table-bordered"> <thead> <tr> <th>id号</th> <th>商品名字</th> <th>商品价格</th> <th>商品数量</th> </tr> </thead> <tbody> <!--循环购物车列表--> <tr v-for="item in good_list"> <th scope="row">{{item.id}}</th> <td>{{item.name}}</td> <td>{{item.price}}</td> <td>{{item.count}}</td> </tr> </tbody> </table> </div> </div> </div> </div> </body> <script> var vm=new Vue({ el:'#app', data:{ good_list:[] }, methods:{ // 展示购物车 handleShow(){ this.good_list=[ {id:1,name:'洗面奶',price:89,count:2}, {id:2,name:'水乳',price:299,count:1}, {id:3,name:'散粉',price:115,count:5}, {id:4,name:'定妆喷雾',price:78,count:1}, {id:5,name:'口红',price:135,count:3}, {id:6,name:'眼线笔',price:59,count:4}, ] }, //删除最后一条 handleDelete(){ this.good_list.pop() } } }) </script> </html>
结果:

点击显示购物车:

点击删除最后一条:

解决跨域问题:
Views文件中:
headers['Access-Control-Allow-Origin'] = '*'

前端页面:
使用axios:
要先导入:<script src="https://unpkg.com/axios/dist/axios.min.js"></script>,才能使用

浙公网安备 33010602011771号