引入
在 初识Vue 中,我们以及对 Vue 进行了了解和实践了第一个 Vue 程序展示,接下来我们继续进行学习,对 Vue 的相关知识进行一个入门。
Vue指令
v-bind
绑定数据和元素属性
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| <!DOCTYPE html> <html lang="en" xmlns:v-bind="http://www.w3.org/1999/xhtml"> <head> <meta charset="UTF-8"> <title>Title</title>
</head> <body> <div id="test"> <span v-bind:title="message"> 悬停几秒查看隐藏内容</span> </div> </body>
<script src="https://cdn.jsdelivr.net/npm/vue@2.5.21/dist/vue.min.js"></script> <script> var vm = new Vue({ el: "#test", data: { message: "hello, vue!" } }); </script> </html>
|

判断指令
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| <!DOCTYPE html> <html lang="en" xmlns:v-bind="http://www.w3.org/1999/xhtml"> <head> <meta charset="UTF-8"> <title>Title</title>
</head> <body> <div id="test"> <h1 v-if="ok">Yes</h1> <h1 v-else>No</h1> </div> </body>
<script src="https://cdn.jsdelivr.net/npm/vue@2.5.21/dist/vue.min.js"></script> <script> var vm = new Vue({ el: "#test", data: { ok: true } }); </script> </html>
|

还有v-else-if用法类似,这里就不再赘述
v-for
等同于 for ,用以循环
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| <!DOCTYPE html> <html lang="en" xmlns:v-bind="http://www.w3.org/1999/xhtml"> <head> <meta charset="UTF-8"> <title>Title</title>
</head> <body> <div id="test"> <li v-for="(item, index) in items"> {{item.message}}是第{{index + 1}}个 </li> </div> </body>
<script src="https://cdn.jsdelivr.net/npm/vue@2.5.21/dist/vue.min.js"></script> <script> var vm = new Vue({ el: "#test", data: { items: [ {message: 'test1'}, {message: 'test2'} ] } }); </script> </html>
|

v-on
事件处理绑定
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title>
</head> <body> <div id="test"> <button v-on:click="sayHi">click me</button> </div> </body>
<script src="https://cdn.jsdelivr.net/npm/vue@2.5.21/dist/vue.min.js"></script> <script> var vm = new Vue({ el: "#test", data: { message: "Hi" }, methods: { sayHi: function () { console.log(this.message); } } }); </script> </html>
|

v-model
在表单中进行双向数据绑定
- 输入框
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title>
</head> <body> <div id="test"> input:<input type="text" v-model="message">{{message}} </div> </body>
<script src="https://cdn.jsdelivr.net/npm/vue@2.5.21/dist/vue.min.js"></script> <script> var vm = new Vue({ el: "#test", data: { message: "test1" } }); </script> </html>
|
- 单选框
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
| <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title>
</head> <body> <div id="test"> 性别: <input type="radio" name="sex" value="男" v-model="checked">男 <input type="radio" name="sex" value="女" v-model="checked">女
<p> 选中了:{{checked}} </p> </div> </body>
<script src="https://cdn.jsdelivr.net/npm/vue@2.5.21/dist/vue.min.js"></script> <script> var vm = new Vue({ el: "#test", data: { checked: '' } }); </script> </html>
|

- 下拉框
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
| <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title>
</head> <body> <div id="test"> 下拉框: <select v-model="checked"> <option value="" disabled>---请选择---</option> <option>A</option> <option>B</option> <option>C</option> <option>D</option> </select>
选中了:{{checked}} </div> </body>
<script src="https://cdn.jsdelivr.net/npm/vue@2.5.21/dist/vue.min.js"></script> <script> var vm = new Vue({ el: "#test", data: { checked: '' } }); </script> </html>
|

其他类似于多行文本,多选框等都殊途同归,这里就不再赘述。
Vue组件
Vue 组件是可复用的 Vue 实例,归根结底其实就像自定义可重复模板一般。例如你可能会有页头、侧边框、内容区等组件,每个组件又包含了其他的类似导航链接、博文之类的组件。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
| <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title>
</head> <body> <div id="test"> <my-component v-for="(item, index) in items" :val="item" :index="index"> </my-component>
</div> </body>
<script src="https://cdn.jsdelivr.net/npm/vue@2.5.21/dist/vue.min.js"></script> <script> Vue.component("myComponent", { props: ['val', 'index'], template: '<li>第{{index + 1}}个是:{{val}}</li>' });
var vm = new Vue({ el: "#test", data: { items: ["A", "B", "C"] } }); </script> </html>
|

Axios异步通信
Axios 是一个开源的可以用在浏览器端和NodeJS(不仅限)的异步通信框架,它的主要作用就是用来实现 AJAX 异步通信。在实际使用时,还是可以使用 jQuery 的 AJAX ,但是不推荐使用,因为 jQuery 操作 DOM 太频繁。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
| <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title>
<style> [v-clock]{ display: none; } </style> </head> <body> <div id="test" v-clock> <div>{{info.name}}</div> <a :href="info.url">跳转</a> </div> </body>
<script src="https://cdn.jsdelivr.net/npm/vue@2.5.21/dist/vue.min.js"></script>
<script src="https://unpkg.com/axios/dist/axios.min.js"></script> <script> var vm = new Vue({ el: "#test", data() { return { info: { name: null, address: { street: null, city: null, country: null }, url: null } } }, mounted () { axios.get('data.json').then(response => (this.info=response.data)) } }); </script> </html>
|
data.json:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| { "name": "百度", "url": "http://baidu.com", "page": 1, "isNonProfit":true, "address": { "street": "含光门", "city": "陕西西安", "country": "中国" }, "links": [ { "name": "B站", "url": "https://www.bilibili.com/" }, { "name": "4399", "url": "https://www.4399.com/" }, { "name": "搜狗", "url": "https://www.sogou.com/" } ] }
|

计算属性
计算属性:Vue 的一个特性,可以将计算结果缓存成属性(将行为转化为静态的属性)。发挥类似缓存的作用。计算属性的主要特性就是为了不将经常变化的计算结果进行缓存,以节省系统开销。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
| <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title>
</head> <body> <div id="test" > <p>getNowTime(): {{getNowTime()}}</p> <p>getNowTime1: {{getNowTime1}}</p> </div> </body>
<script src="https://cdn.jsdelivr.net/npm/vue@2.5.21/dist/vue.min.js"></script>
<script src="https://unpkg.com/axios/dist/axios.min.js"></script> <script> var vm = new Vue({ el: "#test", data: { message: "hello" }, methods: { getNowTime: function () { return Date.now(); } }, computed: { getNowTime1: function () { this.message; return Date.now(); } } }); </script> </html>
|

slot 插槽
在 Vue 中我们可以使用 <slot> 元素作为承载分发内容的出口,在原文档中称其为插槽,它可以应用在组合组件的场景中。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50
| <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title>
</head> <body> <div id="test"> <my-component> <c-title slot="c-title" :title="title"></c-title> <c-items slot="c-items" v-for="item in testItems" :item="item"></c-items> </my-component> </div> </body>
<script src="https://cdn.jsdelivr.net/npm/vue@2.5.21/dist/vue.min.js"></script> <script> /* '\'自动会换行 */ Vue.component("myComponent", { /*在模板中预留两个插槽,方便后继填入和组合*/ template: '<div>\ <slot name="c-title"></slot>\ <ul>\ <slot name="c-items"></slot>\ </ul>\ </div>' });
Vue.component("c-title", { props: ['title'], template: '<div>{{title}}</div>' });
Vue.component("c-items", { props:['item'], template: '<li>{{item}}</li>' });
var vm = new Vue({ el: "#test", data: { title: '编程语言:', testItems: ['java', 'c++', 'python'] } }); </script> </html>
|

自定义事件
在上一个实验的基础上,假如我要删除某个组件怎么办?此时就设计到参数传递和事件分发了, Vue 为我们提供了自定义事件的功能;使用 this.$emit('自定义事件名', 参数) ,演示如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65
| <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title>
</head> <body> <div id="test"> <my-component> <c-title slot="c-title" :title="title"></c-title> <c-items slot="c-items" v-for="(item, index) in testItems" :item="item" :index="index" @remove="removeItem(index)" :key="index"></c-items> </my-component> </div> </body>
<script src="https://cdn.jsdelivr.net/npm/vue@2.5.21/dist/vue.min.js"></script> <script> Vue.component("myComponent", { template: '<div>\ <slot name="c-title"></slot>\ <ul>\ <slot name="c-items"></slot>\ </ul>\ </div>' });
Vue.component("c-title", { props: ['title'], template: '<div>{{title}}</div>' });
Vue.component("c-items", { props:['item', 'index'], template: '<li>{{item}} <button @click="remove">delete</button></li>', methods: { remove: function (index) { this.$emit('remove', index); } } });
var vm = new Vue({ el: "#test", data: { title: '编程语言:', testItems: ['java', 'c++', 'python'] }, methods: { removeItem: function (index) { this.testItems.splice(index, 1); } } }); </script> </html>
|
