一.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"
}, {
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