Vue的学习

Posted maigy

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Vue的学习相关的知识,希望对你有一定的参考价值。

21、键盘修饰符的实例讲解:

 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <title>键盘修饰符的实例讲解</title>
 6     <script src="./lib/vue.js"></script>
 7     <style>
 8     </style>
 9 </head>
10 <body>
11 <div id="app">
12     <!--单击空格键才触发事件-->
13     <input type="text" @keyup.space="keyEvent" />
14     <!--ctrl、alt、shift键要结合某个键才能触发,比如 ctrl+a 才触发的事件-->
15     <input type="text" @keyup.ctrl.65="keyEvent" />
16 </div>
17 </body>
18 <script>
19     var vm = new Vue({
20         el: #app,
21         data: {},
22         methods: {
23             keyEvent () {
24                 alert(单击空格键触发)
25             }
26         }
27     })
28 </script>
29 </html>

22、鼠标事件处理修饰符实例讲解:

 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <title>鼠标事件处理修饰符实例讲解</title>
 6     <script src="./lib/vue.js"></script>
 7     <style>
 8     </style>
 9 </head>
10 <body>
11 <div id="app">
12     <!--单击鼠标右键触发,加上prevent阻止默认行为,即点击右键时弹出的菜单-->
13     <div :style="style" @contextmenu.prevent="keyEvent(‘右‘)"></div>
14     <!--单击鼠标左键的时候触发-->
15     <div :style="style" @click.left="keyEvent(‘左‘)"></div>
16     <!--单击鼠标中间键的时候触发-->
17     <div :style="style" @click.middle="keyEvent(‘中‘)"></div>
18 </div>
19 </body>
20 <script>
21     var vm = new Vue({
22         el: #app,
23         data: {
24             style: {
25                 border: "solid 2px red",
26                 height: "300px",
27                 width: "200px"
28             }
29         },
30         methods: {
31             keyEvent: function(where) {
32                 alert("单击鼠标"+where+"");
33             }
34         }
35     })
36 </script>
37 </html>

23、表单控件的基本使用:

  1 <!DOCTYPE html>
  2 <html lang="en">
  3 <head>
  4     <meta charset="UTF-8">
  5     <title>表单控件的基本使用</title>
  6     <script src="./lib/vue.js"></script>
  7     <link href="http://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet"/>
  8     <link href="http://cdn.bootcss.com/font-awesome/4.7.0/css/font-awesome.min.css" rel="stylesheet"/>
  9     <style>
 10     </style>
 11 </head>
 12 <body>
 13 <div id="app">
 14     <form action="" class="form-horizontal">
 15         <div class="panel panel-default">
 16             <div class="panel-heading">
 17                 <h3 class="panel-title">文章栏目</h3>
 18             </div>
 19             <div class="panel-body">
 20                 <div class="form-group">
 21                     <label for="" class="col-sm-2 control-label">标题</label>
 22                     <div class="col-sm-10">
 23                         <input type="text" class="form-control" v-model="field.title"/>
 24                     </div>
 25                 </div>
 26                 <div class="form-group">
 27                     <label for="" class="col-sm-2 control-label">栏目</label>
 28                     <div class="col-sm-10">
 29                         <select v-model="field.cid" class="form-control" multiple>
 30                             <option value="">==请选择栏目==</option>
 31                             <option v-for="v in category" :value="v.cid">{{v.title}}</option>
 32                         </select>
 33                         {{field.cid}}
 34                     </div>
 35                 </div>
 36                 <div class="form-group">
 37                     <label for="" class="col-sm-2 control-label">属性</label>
 38                     <div class="col-sm-10">
 39                         <div class="checkbox-inline" v-for="v in flag">
 40                             <input type="checkbox" v-model="field.flag" :value="v.name"/> {{v.title}}
 41                         </div>
 42                     </div>
 43                     {{field.flag}}
 44                 </div>
 45                 <div class="form-group">
 46                     <label for="" class="col-sm-2 control-label">点击数</label>
 47                     <div class="col-sm-10">
 48                         <input type="text" class="form-control" v-model="field.click"/>
 49                     </div>
 50                 </div>
 51                 <div class="form-group">
 52                     <label for="" class="col-sm-2 control-label">链接</label>
 53                     <div class="col-sm-10">
 54                         <input type="text" class="form-control" v-model="field.url"/>
 55                     </div>
 56                 </div>
 57                 <div class="form-group">
 58                     <label for="" class="col-sm-2 control-label">摘要</label>
 59                     <div class="col-sm-10">
 60                         <textarea name="" class="form-control" v-model="field.description"></textarea>
 61                     </div>
 62                 </div>
 63                 <div class="form-group">
 64                     <label for="" class="col-sm-2 control-label">类型</label>
 65                     <div class="col-sm-10">
 66                         <div class="checkbox-inline" v-for="v in draft">
 67                             <input type="radio" name="draft" class="form-control" v-model="field.draft" :value="v.name"/> {{v.title}}
 68                         </div>
 69                     </div>
 70                 </div>
 71 
 72             </div>
 73         </div>
 74         <button class="btn btn-primary col-sm-offset-2">保存</button>
 75     </form>
 76 </div>
 77 </body>
 78 <script>
 79     var vm = new Vue({
 80         el: #app,
 81         data: {
 82             flag: [
 83                 {name:hot,title:热门},
 84                 {name:recommend,title:推荐}
 85             ],
 86             draft: [
 87                 {name:draft,title:草稿},
 88                 {name:send,title:发布},
 89                 {name:times,title:延时发布}
 90             ],
 91             category: [
 92                 {cid:1,title:高等代数},
 93                 {cid:2,title:数学分析},
 94                 {cid:3,title:解析几何},
 95                 {cid:4,title:数据模型}
 96             ],
 97             field: {
 98                 title: 后盾人 人人做后盾,
 99                 click: 339,
100                 url: houdunren.com,
101                 description: 这是内容摘要,
102                 drag: send,
103                 flag: [],
104                 cid: []
105             }
106         },
107         methods: {}
108     })
109 </script>
110 </html>

24、表单控件处理之表单修饰符 .lazy、.number、.trim实例详解:

  1 <!DOCTYPE html>
  2 <html lang="en">
  3 <head>
  4     <meta charset="UTF-8">
  5     <title>表单控件处理之表单修饰符 .lazy、.number、.trim实例详解</title>
  6     <script src="./lib/vue.js"></script>
  7     <link href="http://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet"/>
  8     <link href="http://cdn.bootcss.com/font-awesome/4.7.0/css/font-awesome.min.css" rel="stylesheet"/>
  9     <style>
 10     </style>
 11 </head>
 12 <body>
 13 <div id="app">
 14     <form action="" class="form-horizontal">
 15         <div class="panel panel-default">
 16             <div class="panel-heading">
 17                 <h3 class="panel-title">文章栏目</h3>
 18             </div>
 19             <div class="panel-body">
 20                 <div class="form-group">
 21                     <label for="" class="col-sm-2 control-label">标题</label>
 22                     <div class="col-sm-10">
 23                         <!--
 24                         .trim:可以实现截取前后的空格,即不将空格计算到表单中
 25                         .lazy:懒加载,只有当鼠标移开的时候才同步数据
 26                         -->
 27                         <input type="text" class="form-control" v-model.trim.lazy="field.title"/>
 28                     </div>
 29                 </div>
 30                 <div class="form-group">
 31                     <label for="" class="col-sm-2 control-label">栏目</label>
 32                     <div class="col-sm-10">
 33                         <select v-model="field.cid" class="form-control" multiple>
 34                             <option value="">==请选择栏目==</option>
 35                             <option v-for="v in category" :value="v.cid">{{v.title}}</option>
 36                         </select>
 37                     </div>
 38                 </div>
 39                 <div class="form-group">
 40                     <label for="" class="col-sm-2 control-label">属性</label>
 41                     <div class="col-sm-10">
 42                         <div class="checkbox-inline" v-for="v in flag">
 43                             <input type="checkbox" v-model="field.flag" :value="v.name"/> {{v.title}}
 44                         </div>
 45                     </div>
 46                 </div>
 47                 <div class="form-group">
 48                     <label for="" class="col-sm-2 control-label">点击数</label>
 49                     <div class="col-sm-10">
 50                         <!--
 51                         .number:可以让数据以number的形式输出。
 52                         html输出的数据都是字符串类型的,所以 type="number":只能限制用户输入的是数字类型的字符串
 53                         -->
 54                         <input type="number" class="form-control" v-model.number="field.click"/>
 55                     </div>
 56                 </div>
 57                 <div class="form-group">
 58                     <label for="" class="col-sm-2 control-label">链接</label>
 59                     <div class="col-sm-10">
 60                         <input type="text" class="form-control" v-model="field.url"/>
 61                     </div>
 62                 </div>
 63                 <div class="form-group">
 64                     <label for="" class="col-sm-2 control-label">摘要</label>
 65                     <div class="col-sm-10">
 66                         <textarea name="" class="form-control" v-model="field.description"></textarea>
 67                     </div>
 68                 </div>
 69                 <div class="form-group">
 70                     <label for="" class="col-sm-2 control-label">类型</label>
 71                     <div class="col-sm-10">
 72                         <div class="checkbox-inline" v-for="v in draft">
 73                             <input type="radio" name="draft" class="form-control" v-model="field.draft" :value="v.name"/> {{v.title}}
 74                         </div>
 75                     </div>
 76                 </div>
 77 
 78             </div>
 79         </div>
 80         <button class="btn btn-primary col-sm-offset-2">保存</button>
 81     </form>
 82 </div>
 83 </body>
 84 <script>
 85     var vm = new Vue({
 86         el: #app,
 87         /*监听数据的变化*/
 88         watch: {
 89             field.click: function (n, o) {
 90                 console.log(typeof(n));
 91             },
 92             field.title: function (n, o) {
 93                 console.log(n);
 94             }
 95         },
 96         data: {
 97             flag: [
 98                 {name:hot,title:热门},
 99                 {name:recommend,title:推荐}
100             ],
101             draft: [
102                 {name:draft,title:草稿},
103                 {name:send,title:发布},
104                 {name:times,title:延时发布}
105             ],
106             category: [
107                 {cid:1,title:高等代数},
108                 {cid:2,title:数学分析},
109                 {cid:3,title:解析几何},
110                 {cid:4,title:数据模型}
111             ],
112             field: {
113                 title: 后盾人 人人做后盾,
114                 click: 339,
115                 url: houdunren.com,
116                 description: 这是内容摘要,
117                 drag: send,
118                 flag: [],
119                 cid: []
120             }
121         },
122         methods: {}
123     })
124 </script>
125 </html>

25、定义组件的方式:

 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <title>定义组件的方式</title>
 6     <script src="./lib/vue.js"></script>
 7     <style>
 8     </style>
 9 </head>
10 <body>
11 <div id="app">
12     <slide></slide>
13     <news></news>
14 </div>
15 </body>
16 <script>
17     /*定义全局组件,全局组件必须放在主组件 #app 的前面,否则没有效果*/
18     Vue.component(slide,{
19         template: <h1>baidu.com</h1>
20     });
21     var news = {
22         template: "<h2>世界,你好</h2>"
23     };
24     new Vue({
25         el: #app,
26         /*定义局部组件*/
27         components: {
28             /*news 相当于 news:news*/
29             news
30         }
31     })
32 </script>
33 </html>

26、组件之子组件中data使用实例与text/x-template的使用方法:

 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <title>组件之子组件中data使用实例与text/x-template的使用方法</title>
 6     <script src="./lib/vue.js"></script>
 7     <style>
 8     </style>
 9 </head>
10 <body>
11 <div id="app">
12     <news></news>
13     <hr/>
14     <news></news>
15     <hr/>
16     <news></news>
17 </div>
18 <!--
19 为什么把模板放在 <script type="text/x-template" id="news"> 中,而不放在一个 div 中?
20 答:如果放在div中,浏览器会识别解析它,所以在vue还没解析之前,浏览器就解析了,这样{{v.title}}就会原样输出了。
21 而定义在 <script type="text/x-template" id="news"> 中,x-template 会使浏览器忽略它,然后vue再解析它。
22 -->
23 <script type="text/x-template" id="news">
24     <div>
25         <li v-for="(v,k) in news" >
26             {{v.title}}
27             <button @click="del(k)">删除</button>
28         </li>
29     </div>
30 </script>
31 </body>
32 <script>
33     var lists = {
34         news: [
35             {title: 数学分析},
36             {title: 高等代数}
37         ]
38     };
39     var news = {
40         template: #news,
41         data(){
42             /*这样返回的话,所有子组件的公用一个数据,
43             所以这样只要有一个子组件删除数据,其他子组件的数据也会跟着减少*/
44             /*return lists;*/
45             /*把数据放到return里面,这样每个子组件的数据都不一样了,这样它们的数据就不会相互影响了*/
46             return {
47                 news: [
48                     {title: 数学分析},
49                     {title: 高等代数}
50                 ]
51             }
52         },
53         methods: {
54             del(k) {
55                 this.news.splice(k,1);
56             }
57         }
58     };
59     new Vue({
60         el: #app,
61         /*定义局部组件*/
62         components: {news},
63         data:{}
64     })
65 </script>
66 </html>

27、组件与组件之间的数据参props的使用实例操作:

 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <title>组件与组件之间的数据参props的使用实例操作</title>
 6     <script src="./lib/vue.js"></script>
 7     <style>
 8     </style>
 9 </head>
10 <body>
11 <div id="app">
12     <!--lists:对应的 news 是字符串,如果在前面加上 :,即 :lists,则对应的 news 就是表达式-->
13     <news php="abc" cms="你好世界" :show-del-button="true" :lists="news"></news>
14 </div>
15 <!--
16 为什么把模板放在 <script type="text/x-template" id="news"> 中,而不放在一个 div 中?
17 答:如果放在div中,浏览器会识别解析它,所以在vue还没解析之前,浏览器就解析了,这样{{v.title}}就会原样输出了。
18 而定义在 <script type="text/x-template" id="news"> 中,x-template 会使浏览器忽略它,然后vue再解析它。
19 -->
20 <script type="text/x-template" id="news">
21     <div>
22         {{php}} - {{cms}} - {{showDelButton}}
23         <li v-for="(v,k) in lists" >
24             {{v.title}}
25             <button @click="del(k)" v-if="showDelButton">删除</button>
26         </li>
27     </div>
28 </script>
29 </body>
30 <script>
31     var news = {
32         template: #news,
33         /*在 props 定义的变量,子组件中就可以使用这些变量了*/
34         props:[php,cms,showDelButton,lists],
35         data(){
36             /*把数据放到return里面,这样每个子组件的数据都不一样了,这样它们的数据就不会相互影响了*/
37             return {}
38         },
39         methods: {
40             del(k) {
41                 this.lists.splice(k,1);
42             }
43         }
44     };
45     new Vue({
46         el: #app,
47         /*定义局部组件*/
48         components: {news},
49         data:{
50             news: [
51                 {title:数学分析},
52                 {title:解析几何},
53                 {title:高等代数}
54             ]
55         }
56     })
57 </script>
58 </html>

28、组件之props数据的多种验证机制实例详解:

 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <title>组件之props数据的多种验证机制实例详解</title>
 6     <script src="./lib/vue.js"></script>
 7     <style>
 8     </style>
 9 </head>
10 <body>
11 <div id="app">
12     <news :show-del-button="true" php="php学习" cms="cms学习" :lists="news"></news>
13 </div>
14 <!--
15 为什么把模板放在 <script type="text/x-template" id="news"> 中,而不放在一个 div 中?
16 答:如果放在div中,浏览器会识别解析它,所以在vue还没解析之前,浏览器就解析了,这样{{v.title}}就会原样输出了。
17 而定义在 <script type="text/x-template" id="news"> 中,x-template 会使浏览器忽略它,然后vue再解析它。
18 -->
19 <script type="text/x-template" id="news">
20     <div>
21         {{php}} - {{cms}} - {{showDelButton}}
22         <li v-for="(v,k) in lists" >
23             {{v.title}}
24             <button @click="del(k)" v-if="showDelButton">删除</button>
25         </li>
26     </div>
27 </script>
28 </body>
29 <!--验证类型:String Number Boolean Function Object Array -->
30 <script>
31     var news = {
32         template: #news,
33         /*在 props 定义的变量,子组件中就可以使用这些变量了*/
34         props:{
35             showDelButton: {
36                 /*主组件传过来的参数必须是 Boolean、Number 类型才可以,否则就报错*/
37                 type: [Boolean, Number],
38                 /*主组件必须传 showDelButton 的参数过来,否则就报错*/
39                 /*required: true,*/
40                 /*如果没有传 showDelButton 的参数过来,就设置默认值为 false*/
41                 default: false
42             },
43             /*使用函数的方式验证*/
44             /*showDelButton: {
45               validator(v) {
46                 return v===1 || v===0;
47               }
48             }*/
49             php:‘‘,
50             cms:‘‘,
51             lists: {
52                 type: Array,
53                 default() {
54                     return [{title:数据模型}]
55                 }
56             }
57         },
58         data(){
59             /*把数据放到return里面,这样每个子组件的数据都不一样了,这样它们的数据就不会相互影响了*/
60             return {}
61         },
62         methods: {
63             del(k) {
64                 this.news.splice(k,1);
65             }
66         }
67     };
68     new Vue({
69         el: #app,
70         /*定义局部组件*/
71         components: {news},
72         data:{
73             news: [
74                 {title:数学分析},
75                 {title:解析几何},
76                 {title:高等代数}
77             ]
78         }
79     })
80 </script>
81 </html>

29、组件之子组件使用$emit事件触发父组件实现购物车的功能:

 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <title>组件之子组件使用$emit事件触发父组件实现购物车的功能</title>
 6     <script src="./lib/vue.js"></script>
 7     <style>
 8     </style>
 9 </head>
10 <body>
11 <div id="app">
12     <news :lists="goods" @sum="total"></news>  
13     总计:{{totalPrice}}元
14 </div>
15 <!--
16 为什么把模板放在 <script type="text/x-template" id="news"> 中,而不放在一个 div 中?
17 答:如果放在div中,浏览器会识别解析它,所以在vue还没解析之前,浏览器就解析了,这样{{v.title}}就会原样输出了。
18 而定义在 <script type="text/x-template" id="news"> 中,x-template 会使浏览器忽略它,然后vue再解析它。
19 -->
20 <script type="text/x-template" id="news">
21     <table border="1" width="50%">
22         <tr>
23             <th>商品名称</th>
24             <th>商品价格</th>
25             <th>商品数量</th>
26         </tr>
27         <tr v-for="(v,k) in lists">
28             <td>{{v.title}}</td>
29             <td>{{v.price}}</td>
30             <td>
31                 <!--@blur:当失焦的时候触发该事件-->
32                 <input type="text" v-model="v.num" @blur="sum" />
33             </td>
34         </tr>
35     </table>
36 </script>
37 </body>
38 <!--验证类型:String Number Boolean Function Object Array -->
39 <script>
40     var news = {
41         template: #news,
42         /*在 props 定义的变量,子组件中就可以使用这些变量了*/
43         props: [lists],
44         methods: {
45             sum () {
46                 /*$emit(‘sum‘)调用父组件的sum方法*/
47                 this.$emit(sum)
48             }
49         }
50     }
51     new Vue({
52         el: #app,
53         /*定义局部组件*/
54         components: {news},
55         /*当vue处理页面完成后,该挂载点就会自动触发*/
56         mounted () {
57             this.total()
58         },
59         data: {
60             totalPrice: 0,
61             goods: [
62                 {title: iphone7Plus, price: 200, num: 2},
63                 {title: 华为, price: 100, num: 1}
64             ]
65         },
66         methods: {
67             total () {
68                 this.totalPrice = 0
69                 this.goods.forEach((v) => {
70                     this.totalPrice += v.num * v.price
71                 })
72             }
73         }
74     })
75 </script>
76 </html>

30、组件之使用.sync修饰符与computer计算属性超简单的实现美团购物车原理:

 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <title>组件之使用.sync修饰符与computer计算属性超简单的实现美团购物车原理</title>
 6     <style>
 7     </style>
 8     <script src="./lib/vue.js"></script>
 9 </head>
10 <body>
11 <div id="app">
12     <!--②:.sync的作用:当 lists 发生改变的时候,lists 就会赋值给 goods,因此 goods 也会做出相应的改变-->
13     <news :lists.sync="goods"></news>
14     总计:{{totalPrice}}元
15 </div>
16 <!--
17 为什么把模板放在 <script type="text/x-template" id="news"> 中,而不放在一个 div 中?
18 答:如果放在div中,浏览器会识别解析它,所以在vue还没解析之前,浏览器就解析了,这样{{v.title}}就会原样输出了。
19 而定义在 <script type="text/x-template" id="news"> 中,x-template 会使浏览器忽略它,然后vue再解析它。
20 -->
21 <script type="text/x-template" id="news">
22     <table border="1" width="50%">
23         <tr>
24             <th>商品名称</th>
25             <th>商品价格</th>
26             <th>商品数量</th>
27         </tr>
28         <tr v-for="(v,k) in lists">
29             <td>{{v.title}}</td>
30             <td>{{v.price}}</td>
31             <td>
32                 <!--@blur:当失焦的时候触发该事件-->
33                 <!--①:当修改 v.num 的值的时候,lists就会做出相应的改变-->
34                 <input type="text" v-model="v.num" />
35             </td>
36         </tr>
37     </table>
38 </script>
39 </body>
40 <!--验证类型:String Number Boolean Function Object Array -->
41 <script>
42     var news = {
43         template: #news,
44         /*在 props 定义的变量,子组件中就可以使用这些变量了*/
45         props: [lists]
46     };
47     new Vue({
48         el: #app,
49         /*定义局部组件*/
50         components: {news},
51         /*③:当this.goods发生改变的时候,就是触发computed计算属性重新计算一次*/
52         computed:{
53             totalPrice() {
54                 var sum = 0;
55                 this.goods.forEach((v)=>{
56                     sum+=v.num*v.price;
57                 });
58                 return sum;
59             }
60         },
61         data: {
62             goods: [
63                 {title: iphone7Plus, price: 200, num: 2},
64                 {title: 华为, price: 100, num: 1}
65             ]
66         }
67     })
68 </script>
69 </html>

以上是关于Vue的学习的主要内容,如果未能解决你的问题,请参考以下文章

VSCode自定义代码片段11——vue路由的配置

VSCode自定义代码片段11——vue路由的配置

VSCode自定义代码片段11——vue路由的配置

VSCode自定义代码片段2——.vue文件的模板

VSCode自定义代码片段(vue主模板)

VSCode自定义代码片段13——Vue的状态大管家