02. Vue数据绑定
Vue 框架很核心的功能就是双向的数据绑定。 双向是指:HTML 标签数据 绑定到 Vue 对象,另外反方向数据也是绑定的。通俗点说就是,Vue 对象的改变会直接影响到 HTML 的标签的变化,而且标签的变化也会反过来影响 Vue 对象的属性的变化。
这样以来,就彻底变革了之前 Dom 的开发方式,之前 Dom 驱动的开发方式尤其是以 jQuery 为主的开发时代,都是 dom 变化后,触发 js 事件,然后在事件中通过 js 代码取得标签的变化,再跟后台进行交互,然后根据后台返回的结果再更新 HTML 标签,异常的繁琐。有了 Vue 这种双向绑定,让开发人员只需要关心 json 数据的变化即可,Vue 自动映射到 HTML 上,而且 HTML 的变化也会映射回 js 对象上,开发方式直接变革成了前端由数据驱动的 开发时代,远远抛弃了 Dom 开发主导的时代了。
Vue绑定文本
数据绑定最常见的形式就是使用 “Mustache” 语法(双大括号)的文本插值,比如模板引擎:handlebars 中就是用的
{{}}。
创建的 Vue 对象中的 data 属性就是用来绑定数据到 HTML 的。如:<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> <script src="./js/vue.js"></script> </head> <body> <!-- 创建html的快捷键 html:5 --> <!-- 代码快速格式化的快捷键 shift + alt + f --> <div id="app"> <span>Message: {{ msg }}</span> </div> <script> var app = new Vue({ // 创建Vue对象。Vue的核心对象。 el: '#app', // el属性:把当前Vue对象挂载到 div标签上,#app是id选择器 data: { // data: 是Vue对象中绑定的数据 msg: 'Hello Vue!' // message 自定义的数据 } }); </script> </body> </html>
Vue绑定内联样式
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> <script src="./js/vue.js"></script> </head> <body> <!-- 创建html的快捷键 html:5 --> <!-- 代码快速格式化的快捷键 shift + alt + f --> <!-- <div id="app" style="backgroundColor:pink;width: 200px;height: 200px;"> --> <div id="app" v-bind:style="{backgroundColor:pink,width:width,height:height}"> <div v-bind:style="myDiv">Message: {{ msg }}</div> </div> <script> var app = new Vue({ // 创建Vue对象。Vue的核心对象。 el: '#app', // el属性:把当前Vue对象挂载到 div标签上,#app是id选择器 data: { // data: 是Vue对象中绑定的数据 myDiv: { backgroundColor: 'red', width: '100px', height: '100px' }, pink: 'pink', width: '100%', height: '200px' } }); </script> </body> </html>
Vue绑定样式类
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> <script src="./js/vue.js"></script> <style> .box { background-color: pink; width: 100%; height: 200px; } .inner { background-color: powderblue; width: 100px; height: 50px; border: 1px solid black; } .inner1 { background-color: khaki; width: 200px; height: 10px; border: 5px solid black; } </style> </head> <body> <div id="app"> <div v-bind:class="box"> 我是外层的div <div v-bind:class="inner">我是内层的div</div> </div> </div> <script> let vm = new Vue({ el: "#app", data: { box: 'box', inner: 'inner' } }) </script> </body> </html>
内置指令
路径 说明 v-model 双向数据绑定 v-on 监听事件 v-bind 单向数据绑定 v-text 插入文本内容 v-html 插入包含HTML的内容 v-model演示
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> <script src="./js/vue.js"></script> </head> <body> <div id="app"> <input type="text" v-model="msg"> {{msg}} </div> <script> let vm = new Vue({ el:"#app", data: { msg: "v-model" } }) </script> </body> </html>
v-text演示
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> <script src="./js/vue.js"></script> </head> <body> <div id="app"> <p>{{msg}}</p> <p v-text="msg"></p> <p v-text="msg">123546</p> </div> <script> let vm = new Vue({ el: "#app", data:{ msg: "一切总会过去,不要担心" } }); </script> </body> </html>
v-html演示
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> <script src="./js/vue.js"></script> </head> <body> <div id="app"> <p v-html="msg"></p> <p v-html="msg"> 123456 </p> </div> <script> let vm = new Vue({ el: "#app", data: { msg: "<strong>同学们,加油</strong>" } }) </script> </body> </html>
v-bind演示
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> <script src="./js/vue.js"></script> </head> <body> <div id="app"> <input type="text" v-bind:value="msg" style="width: 80%;"/> <input type="text" :value="msg" style="width: 80%;"/> </div> <script> let vm = new Vue({ el: "#app", data: { msg: "<strong>同学们,加油</strong>" } }) </script> </body> </html>
v-on 事件监听指令演示
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> <script src="./js/vue.js"></script> </head> <body> <div id="app"> {{msg}} <br> <button v-on:click="showInfo()">点击执行showInfo()方法</button> <br> <button @click="showInfo()">点击执行showInfo()方法</button> </div> <script> let vm = new Vue({ el: "#app", data: { msg: "<strong>同学们,加油</strong>" }, methods:{ showInfo(){ this.msg = "我是v-on指令" } } }) </script> </body> </html>
路径 说明 v-for 列表渲染 v-if 条件渲染 v-show 显示隐藏 v-for演示
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> <script src="./js/vue.js"></script> </head> <body> <div id="app"> <p v-for="(item , index) in list">元素的下标——>{{index}} : 元素内容是——>{{item}} </p> </div> <script> let vm = new Vue({ el: "#app", data: { list: [1,2,3] } }) </script> </body> </html>
v-if 和 v-show 演示
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> <script src="./js/vue.js"></script> </head> <body> <div id="app"> <p v-if="isShow" style="background-color: lightgreen;"> v-if </p> <button @click="isShow = !isShow">点击隐藏或显示v-if</button><br> <p v-show="isDisplay" style="background-color: lightgreen;"> v-show </p> <button @click="isDisplay = !isDisplay">点击隐藏或显示v-show</button> </div> <script> let vm = new Vue({ el: "#app", data: { isShow: true, isDisplay: true } }) </script> </body> </html>