- A+
一.Vue 介绍
Vue (读音 /vjuː/,类似于 view) 是一套用于构建用户界面的渐进式框架。与其它大型框架不同的是,Vue 被设计为可以自底向上逐层应用。Vue 的核心库只关注视图层,不仅易于上手,还便于与第三方库或既有项目整合。 另一方面,当与现代化的工具链以及各种支持类库结合使用时,Vue 也完全能够为复杂的单页应用提供驱动。
二.使用方法
下载到本地引用:
开发版: https://cn.vuejs.org/js/vue.js
生产版:https://cn.vuejs.org/js/vue.min.js
在线引用:
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
npm安装:
// 最新稳定版 npm install vue // 安装vue-cli脚手架构建工具 npm install --global vue-cli
三.vue入门指令
vue实例创建
<body> <!-- 定义id为app作为 锚点 --> <p id="app"> <!-- vue 表达式{{}} 两个花括号 ,里面是数据名--> {{msg}} </p> <!-- 引入 vue.js --> <script src="js/vue.js" type="text/javascript" charset="utf-8"></script> <script type="text/javascript"> // 创建 vue 实例 new Vue({ // el 代表的是 页面中的 id值 el: '#app', // data 是数据 ,与json数据一样 data: { msg: "hello vue", } }) // 在页面就会显示 hello vue </script> </body>
注意:vue 表达式语法是两个花括号{{msg}} 里面写实例中对应的数据名,数据名必须在对应的vue实例之下。
在写实例vue时 要注意 属性和 属性名之间的空格
- 指令
- 本质就是自定义属性
- Vue中指令都是以 v- 开头
v-text指令
<body> <div id="app"> <!-- 在使用 v-text标签时就不需要{{}} 效果等同于{{msg}} --> <p v-text="msg"></p> <p>{{msg}}</p> </div> <!-- 导入vue.js --> <script src="js/vue.js" type="text/javascript" charset="utf-8"></script> <script type="text/javascript"> // 在写实例vue时 要注意 属性和 属性名之间的空格 new Vue({ el: '#app', data: { msg: "v-text 测试" } }) </script> <!-- 页面效果 打印了两个 v-text 测试--> </body>
v-html指令
-
用法和v-text 相似 但是他可以将HTML片段填充到标签中
-
可能有安全问题, 一般只在可信任内容上使用
v-html
,永不用在用户提交的内容上 -
它与v-text区别在于v-text输出的是纯文本,浏览器不会对其再进行html解析,但v-html会将其当html标签解析后输出。
<body> <div id="app"> <!-- v-html 指令会将标签渲染解析 --> <p v-html="html"></p> <!-- 输出:<span>html标签在渲染的时候被源码输出</span> --> <p v-text="text"></p> <!-- msg 普通语法 --> <p>{{msg}}</p> </div> <script src="js/vue.js" type="text/javascript" charset="utf-8"></script> <script type="text/javascript"> let app = new Vue({ el: "#app", data: { msg: "<span >普通双标签不会解析span标签</span>", html: "<span>v-html指令可以渲染解析标签</span>", text: "<span>v-text 不会解析 标签 跟双花括号一样</span>" } }) </script> </body>
v-text 和 v-html相当于原生js中的 .text 和 .html 相同 是一样的性质
v-pre指令
- 显示原始信息跳过编译过程
- 跳过这个元素和它的子元素的编译过程。
- 一些静态的内容不需要编译加这个指令可以加快渲染
<body> <div id="app"> <!-- 使用v-pre 指令 会跳过vue的编译过程 所以p标签中的{{msg}} 不会被vue识别编译 则页面会直接显示 {{msg}} --> <p v-pre>{{msg}}</p> </div> <script src="js/vue.js" type="text/javascript" charset="utf-8"></script> <script type="text/javascript"> new Vue({ el: "#app", data: { msg: "v-pre 指令会使该语法表达式不会被识别" } }) </script> </body>
v-model指令
-
v-model是一个指令,限制在
<input>、<select>、<textarea>、components
中使用 -
v-model是一个双向数据绑定指令
双向数据绑定
- 当数据发生变化的时候,视图也就发生变化
- 当视图发生变化的时候,数据也会跟着同步变化
<body> <div id="app"> <span>{{msg}}</span> <br> <!-- 在页面测试时 当修改 input 内容,vue实例中的msg值会跟着改变 上面的span标签中的值 也会跟随 vue实例中数据改变,v-model 双向 绑定的好处已经很明显了 --> <input type="text" name="" id="" v-model="msg" /> </div> <script src="js/vue.js" type="text/javascript" charset="utf-8"></script> <script type="text/javascript"> let app = new Vue({ el: "#app", data: { msg: "v-model指令测试" } }) </script> </body>
v-once指令
<body> <div id="app"> <!-- 使用v-pre 指令 会跳过vue的编译过程 所以p标签中的{{msg}} 不会被vue识别编译 则页面会直接显示 {{msg}} --> <p v-pre>{{msg}}</p> </div> <script src="js/vue.js" type="text/javascript" charset="utf-8"></script> <script type="text/javascript"> new Vue({ el: "#app", data: { msg: "v-pre 指令会使该语法表达式不会被识别" } }) </script> </body>
mvvm概念
- MVC 是后端的分层开发概念; MVVM是前端视图层的概念,主要关注于 视图层分离,也就是说:MVVM把前端的视图层,分为了 三部分 Model, View , VM ViewModel
- m model
- 数据层 Vue 中 数据层 都放在 data 里面
- v view 视图
- Vue 中 view 即 我们的HTML页面
- vm (view-model) 控制器 将数据和视图层建立联系
- vm 即 Vue 的实例 就是 vm
v-on指令
<body> <div id="app"> <p>{{num}}</p> <!-- 绑定点击事件 每点击一下,num值++一下 一般不推荐这样操作--> <button type="button" v-on:click="num++">普通点击</button> <button type="button" v-on:click="handlel($event)" name="event测试">点击</button> <button type="button" v-on:click="handlel2(123,222,$event)">带参点击</button> </div> <script src="js/vue.js" type="text/javascript" charset="utf-8"></script> <script type="text/javascript"> new Vue({ el: "#app", data: { num: 0 }, methods: { // methods 存放调用的方法 handlel: function(event) { console.log(event.target.innerHTML) console.log(event.target.name) }, handlel2: function(p, p1, event) { console.log(p, p1) console.log(event.target.innerHTML) // this的指向为当前vue实例 this.num++ 就是将num的值++ this.num++; } } }) </script> </body>
拓展:$event 经过对参数的对比,发现 该event传入的是当前标签的对象,我们可以使用该对象获取参数类如获取文本内容 event.target.innerHTML 或者event.target.name
按键修饰符
在做项目中有时会用到键盘事件,在监听键盘事件时,我们经常需要检查详细的按键。Vue 允许为 v-on
在监听键盘事件时添加按键修饰符
<body> <div id="app"> <!-- 当键盘每点击一次时触发事件调用submit方法--> <input v-on:keyup="submit($event)" value="键盘点击" /> <!-- 指定特定的键盘键值 来调用 只有当点击小写a时才会触发 --> <input v-on:keyup.65="submit($event)" type="button" value="65" /> <!-- 当鼠标键抬起时触发事件 调用 mouseup 方法 --> <input v-on:mouseup="mouseup($event)" type="button" value="鼠标点击" /> <!-- 以上 是键盘鼠标事件的演示 ,还可以拓展其他的类似的操作、 常用的按键修饰符 .enter => enter键 .tab => tab键 .delete (捕获“删除”和“退格”按键) => 删除键 .esc => 取消键 .space => 空格键 .up => 上 .down => 下 .left => 左 .right => 右 --> </div> <script src="js/vue.js" type="text/javascript" charset="utf-8"></script> <script type="text/javascript"> new Vue({ el: "#app", data: { }, methods: { submit: function(event) { console.log(event.target.value); }, mouseup: function(event) { console.log(event.target.value); } } }) </script> </body>
自定义按键别名
- 在Vue中可以通过
config.keyCodes
自定义按键修饰符别名
<body> <div id="app"> <button type="button" v-on:keydown.fn="prompt($event)" value="我是自定义按键">我是自定义按键</button> </div> <script src="js/vue.js" type="text/javascript" charset="utf-8"></script> <script type="text/javascript"> // 将 a 的 键值自定义成fn ,然后在控件中直接使用fn 一般情况下不会这样使用 Vue.config.keyCodes.fn = 65; new Vue({ el: "#app", methods: { prompt: function(event) { alert(event.target.value); } } }) </script> </body>
keyCode值一览表
虚拟键 | 十六进制值 | 十进制值 | 相应键盘或鼠标键 |
---|---|---|---|
VK_LBUTTON | 01 | 1 | 鼠标左键 |
VK_RBUTTON | 02 | 2 | 鼠标右键 |
VK_CANCEL | 03 | 3 | Ctrl-Break键 |
VK_MBUTTON | 04 | 4 | 鼠标中键 |
VK_BACK | 08 | 8 | Backspace键 |
VK_TAB | 09 | 9 | Tab键 |
VK_CLEAR | 0C | 12 | Clear键 |
VK_RETURN | 0D | 13 | Enter键 |
VK_SHIFT | 10 | 16 | Shift键 |
VK_CONTROL | 11 | 17 | Ctrl键 |
VK_MENU | 12 | 18 | Alt键 |
VK_PAUSE | 13 | 19 | Pause键 |
VK_CAPITAL | 14 | 20 | Caps Lock键 |
VK_ESCAPE | 1B | 27 | Esc键 |
VK_SPACE | 20 | 32 | Space键 |
VK_PRIOR | 21 | 33 | Page Up键 |
VK_NEXT | 22 | 34 | Page Down键 |
VK_END | 23 | 35 | End键 |
VK_HOME | 24 | 36 | Home键 |
VK_LEFT | 25 | 37 | ←键 |
VK_UP | 26 | 38 | ↑键 |
VK_RIGHT | 27 | 39 | →键 |
VK_DOWN | 28 | 40 | ↓键 |
VK_SELECT | 29 | 41 | Select键 |
VK_PRINT | 2A | 42 | Print键 |
VK_EXECUTE | 2B | 43 | Execute键 |
VK_SNAPSHOT | 2C | 44 | Print Screen键 |
VK_INSERT | 2D | 45 | Ins键 |
VK_DELETE | 2E | 46 | Del键 |
VK_HELP | 2F | 47 | Help键 |
VK_0 | 0x30 | 48 | 0键 |
VK_1 | 0x 31 | 49 | 1键 |
VK_2 | 0x 32 | 50 | 2键 |
VK_3 | 0x 33 | 51 | 3键 |
VK_4 | 0x 34 | 52 | 4键 |
VK_5 | 0x 35 | 53 | 5键 |
VK_6 | 0x 36 | 54 | 6键 |
VK_7 | 0x 37 | 55 | 7键 |
VK_8 | 0x 38 | 56 | 8键 |
VK_9 | 0x 39 | 57 | 9键 |
VK_A | 41 | 65 | A键 |
VK_B | 42 | 66 | B键 |
VK_C | 43 | 67 | C键 |
VK_D | 44 | 68 | D键 |
VK_E | 45 | 69 | E键 |
VK_F | 46 | 70 | F键 |
VK_G | 47 | 71 | G键 |
VK_H | 48 | 72 | H键 |
VK_I | 49 | 73 | I键 |
VK_J | 4A | 74 | J键 |
VK_K | 4B | 75 | K键 |
VK_L | 4C | 76 | L键 |
VK_M | 4D | 77 | M键 |
VK_N | 4E | 78 | N键 |
VK_O | 4F | 79 | O键 |
VK_P | 50 | 80 | P键 |
VK_Q | 51 | 81 | Q键 |
VK_R | 52 | 82 | R键 |
VK_S | 53 | 83 | S键 |
VK_T | 54 | 84 | T键 |
VK_U | 55 | 85 | U键 |
VK_V | 56 | 86 | V键 |
VK_W | 57 | 87 | W键 |
VK_X | 58 | 88 | X键 |
VK_Y | 59 | 89 | Y键 |
VK_Z | 5A | 90 | Z键 |
VK_LWIN | 5B | 91 | 左Windows键 |
VK_RWIN | 5C | 92 | 右Windows键 |
VK_APPS | 5D | 93 | 应用程序键 |
VK_SLEEP | 5F | 95 | 休眠键 |
VK_NUMPAD0 | 60 | 96 | 小数字键盘0键 |
VK_NUMPAD1 | 61 | 97 | 小数字键盘1键 |
VK_NUMPAD2 | 62 | 98 | 小数字键盘2键 |
VK_NUMPAD3 | 63 | 99 | 小数字键盘3键 |
VK_NUMPAD4 | 64 | 100 | 小数字键盘4键 |
VK_NUMPAD5 | 65 | 101 | 小数字键盘5键 |
VK_NUMPAD6 | 66 | 102 | 小数字键盘6键 |
VK_NUMPAD7 | 67 | 103 | 小数字键盘7键 |
VK_NUMPAD8 | 68 | 104 | 小数字键盘8键 |
VK_NUMPAD9 | 69 | 105 | 小数字键盘9键 |
VK_MULTIPLY | 6A | 106 | 乘号键 |
VK_ADD | 6B | 107 | 加号键 |
VK_SEPARATOR | 6C | 108 | 分割键 |
VK_SUBSTRACT | 6D | 109 | 减号键 |
VK_DECIMAL | 6E | 110 | 小数点键 |
VK_DIVIDE | 6F | 111 | 除号键 |
VK_F1 | 70 | 112 | F1键 |
VK_F2 | 71 | 113 | F2键 |
VK_F3 | 72 | 114 | F3键 |
VK_F4 | 73 | 115 | F4键 |
VK_F5 | 74 | 116 | F5键 |
VK_F6 | 75 | 117 | F6键 |
VK_F7 | 76 | 118 | F7键 |
VK_F8 | 77 | 119 | F8键 |
VK_F9 | 78 | 120 | F9键 |
VK_F10 | 79 | 121 | F10键 |
VK_F11 | 7A | 122 | F11键 |
VK_F12 | 7B | 123 | F12键 |
VK_F13 | 7C | 124 | F13键 |
VK_F14 | 7D | 125 | F14键 |
VK_F15 | 7E | 126 | F15键 |
VK_F16 | 7F | 127 | F16键 |
VK_F17 | 80 | 128 | F17键 |
VK_F18 | 81 | 129 | F18键 |
VK_F19 | 82 | 130 | F19键 |
VK_F20 | 83 | 131 | F20键 |
VK_F21 | 84 | 132 | F21键 |
VK_F22 | 85 | 133 | F22键 |
VK_F23 | 86 | 134 | F23键 |
VK_F24 | 87 | 135 | F24键 |
VK_NUMLOCK | 90 | 144 | Num Lock键 |
VK_SCROLL | 91 | 45 | Scroll Lock键 |
VK_LSHIFT | A0 | 160 | 左Shift键 |
VK_RSHIFT | A1 | 161 | 右Shift键 |
VK_LCONTROL | A2 | 162 | 左Ctrl键 |
VK_RCONTROL | A3 | 163 | 右Ctrl键 |
VK_LMENU | A4 | 164 | 左Alt键 |
VK_RMENU | A5 | 165 | 右Alt键 |
v-bind指令
- v-bind 指令被用来响应地更新 HTML 属性
<style type="text/css"> /* 定义几组样式 */ .p1Color { color: blue; } .p2Color { color: darkred; } .p1Text { font-size: 18px; } .p1Text { font-size: 10px; } </style> </head> <body> <div id="app"> <!-- 绑定 p1Color 并选择isColor isColor定义为true 也可以直接写true--> <p v-bind:class="{p1Color:isColor}"> 学习 v-bind 指令 </p> <button v-on:mouseup="changeColor">{{chgColor}}</button> <p></p> <p></p> </div> <script src="js/vue.js" type="text/javascript" charset="utf-8"></script> <script type="text/javascript"> new Vue({ el: "#app", data: { isColor: true, isText: true, color: "yellow", size: "14px", chgColor: "关闭样式" }, methods: { changeColor: function() { // 点击事件 关闭开启 p标签的样式 if (this.isColor === true) { this.isColor = false; this.chgColor = "开启样式" } else { this.isColor = true; this.chgColor = "关闭样式" } } } }) </script> </body>
v-bind绑定class
<style type="text/css"> /* 定义几组样式 */ .p1Color { color: blue; } .p2Color { color: darkred; } .p1Text { font-size: 18px; } .p1Text { font-size: 10px; } </style> </head> <body> <div id="app"> <!-- 将 样式 定义在vue实例中,然后 绑定到DOM上 --> <!-- :class 等同于 v-on:calss --> <p :class="[colorA,textA]"> 学习 v-bind 指令 </p> <button v-on:mouseup="changeAColor">{{chgColor}}</button> <p v-bind:class="[colorB,textB]"> 学习 v-bind 指令绑定 class </p> <button v-on:mouseup="changeBColor">{{chgColor}}</button> <p></p> </div> <script src="js/vue.js" type="text/javascript" charset="utf-8"></script> <script type="text/javascript"> new Vue({ el: "#app", data: { colorA: "p1Color", colorB: 'p2Color', textA: 'p1Text', textB: 'p2Text', chgColor: "切换样式" }, /*定义 两个 方法切换样式 */ methods: { changeAColor: function() { if ("p1Color" === this.colorA) { this.colorA = 'p2Color'; } else { this.colorA = 'p1Color'; } }, changeBColor: function() { if ("p2Color" === this.colorB) { this.colorB = 'p1Color'; } else { this.colorB = 'p2Color'; } } } }) </script> </body>
绑定对象和绑定数组 的区别
- 绑定对象的时候 对象的属性 即要渲染的类名 对象的属性值对应的是 data 中的数据
- 绑定数组的时候数组里面存的是data 中的数据
绑定style v-bind:style
<body> <div id="app"> <!-- :style 等同于 v-bind:style --> <p :style="{ color:colorB, fontSize:fontSize}"> v-bind:style 样式绑定 内联样式 </p> <p v-bind:style="[styleB, styleA]"> v-bind:style 样式绑定 数组绑定 </p> </div> <script src="js/vue.js" type="text/javascript" charset="utf-8"></script> <script type="text/javascript"> new Vue({ el: "#app", data: { /* 在data里面定义几组 样式数据 */ styleObject: { color: "green", fontSize: "18px" }, colorB:"green", fontSize:"18px", styleA: { color: "red" }, styleB: { fontSize: "28px" } } }) </script> </body>
分支循环
v-if指令
<body> <div id="app"> <!-- 使用v-if 指令来判断flag --> <p v-if="flag === true"> {{msg}} </p> <p v-if="flag === false"> {{msg2}} </p> <button type="button" @click="changeClick">点我</button> </div> <script src="js/vue.js" type="text/javascript" charset="utf-8"></script> <script type="text/javascript"> new Vue({ el: "#app", data: { flag: true, // 设置标志 为true 用于页面判断 msg: "我出来了", msg2: "我消失了" }, methods: { changeClick: function() { if (this.flag === true) { this.flag = false; } else { this.flag = true; } } } }) </script> </body>
v-show指令
<body> <div id="app"> <p v-show="1===1">v-show判断为true时我显示了</p> <p v-show="1===2">v-show为flase时我隐藏</p> <!-- 使用 v-show 指令来判断flag --> <p v-show="flag === true"> {{msg}} </p> <p v-show="flag === false"> {{msg2}} </p> <button type="button" @click="changeClick">点我</button> </div> <script src="js/vue.js" type="text/javascript" charset="utf-8"></script> <script type="text/javascript"> new Vue({ el: "#app", data: { flag: true, // 设置标志 为true 用于页面判断 msg: "我出来了", msg2: "我消失了" }, methods: { changeClick: function() { if (this.flag === true) { this.flag = false; } else { this.flag = true; } } } }) </script> </body>
v-show 和 v-if的区别
- v-show本质就是标签display设置为none,控制隐藏
- v-show只编译一次,后面其实就是控制css,而v-if不停的销毁和创建,故v-show性能更好一点。
- v-if是动态的向DOM树内添加或者删除DOM元素
- v-if切换有一个局部编译/卸载的过程,切换过程中合适地销毁和重建内部的事件监听和子组件
v-for循环指令
<body> <div id="app"> <!-- 循环遍历 data中 items 数据 --> <p v-for="item in items"> <span>id: {{item.id}} </span> <span>name: {{item.name}} </span> <span>age: {{item.age}} </span> <br> </p> <!-- 页面中将会循环遍历 id: 1 name: 李四 age: 20 id: 2 name: 王五 age: 19 id: 3 name: 张飞 age: 33 --> </div> <script src="js/vue.js" type="text/javascript" charset="utf-8"></script> <script type="text/javascript"> new Vue({ el: "#app", // 准备 循环模拟数据 data: { items: [{ id: 1, name: "李四", age: 20 }, { id: 2, name: "王五", age: 19 }, { id: 3, name: "张飞", age: 33 }, ] } }) </script> </body>
注意点:
- 不推荐同时使用
v-if
和v-for
- 当
v-if
与v-for
一起使用时,v-for
具有比v-if
更高的优先级。
"="和""和"="的区别
<body> <!-- 一个等号 是赋值的意思 主要用于js里面 --> <div id="app"> <!-- 使用双等时 --> <p v-if="num == '1' ">我是双等于 双等于 不严谨 普通的数字1可以等于字符串"1"</p> <!-- 使用三等时 由于strNum定义为字符型1 所以不等于数字型1--> <p v-if="strNum==='1'">我是双等于 双等于 不严谨 普通的数字1可以等于字符串"1"</p> <!-- 同样使用于其他类型数据 eg Boolean和string的ture相对比 --> </div> <script src="js/vue.js" type="text/javascript" charset="utf-8"></script> <script type="text/javascript"> new Vue({ el: "#app", data: { // 定义一个普通的1 一个字符类型的1 num: 1, strNum: '1' }, }) </script> </body>
四.Vue选项卡案例
<body> <!-- 选项卡主体 --> <div id="app" class="tableCard"> <div id="" class="tableHead"> <ul> <!-- 取选项卡数据 遍历标题 --> <!-- defaultStyle 如果标志id等于遍历id则加上默认样式 --> <li v-for="title in tableLists" :class="title.id===flagId?'defaultStyle':''"> <!-- 绑定点击事件change 传入对应数据id --> <span v-on:click='change(title.id)'>{{title.title}}</span> </li> </ul> </div> <div id="" class="tableBody"> <!-- 取选项卡数据 遍历图片路径 --> <ul v-for="img in tableLists"> <!-- 数据id等于标志id 则让改图片显现 --> <li v-if="img.id === flagId"> <img :src="img.path" v-bind:style="showImg"> </li> <!--不等于的就隐藏 --> <li v-else> <img :src="img.path"> </li> </ul> </div> </div> <script src="js/vue.js" type="text/javascript" charset="utf-8"></script> <!-- vue 实例--> <script type="text/javascript"> new Vue({ el: "#app", // 定义图片样式 data: { flagId: 1, showImg: "display: block;", tableLists: [{ id: 1, title: "选项卡1", path: "img/3Dbg01.jpg" alt="Vue入门常用指令" }, { id: 2, title: "选项卡2", path: "img/3Dbg02.jpg" }, { id: 3, title: "选项卡3", path: "img/3Dbg03.jpg" }, ] }, methods: { // 每点击一次修改flagId的值为传入的值 change: function(titleId) { this.flagId = titleId; } } }) </script> </body>
参考demo
gitee: https://gitee.com/li_shang_shan/vue-entry-instruction-demo