前端Vue知识小白
感觉是已好久没写博文了。今日难得有时间,便写一篇文章。此文章是关于前端知识的,我本身是后端,因工作或其他需要,便学习了前端Vue。此文章是在菜鸟教程上学习的。那么下面进入正文!
首先,Vue.js是一套构建用户界面的渐进式框架。只关注视图层, 采用自底向上增量开发的设计。Vue 的目标是通过尽可能简单的 API 实现响应的数据绑定和组合的视图组件。Vue 学习起来非常简单,不过因人而异,有人学的比较快,有人学的较慢。只要有心,有目标,肯定会有收获的。
1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta charset="utf-8"> 5 <title>Vue 测试实例 - 菜鸟教程(runoob.com)</title> 6 <script src="js/vue.js"></script> 7 </head> 8 <style type="text/css"> 9 .class1{background: #444;color: #eee;} 10 .active{width: 100px;height: 100px;background: green;} 11 .text-danger{background: red;} 12 </style> 13 <body> 14 <!-- 指令是带有 v- 前缀的特殊属性 --> 15 <!-- 完整语法 --> 16 <a v-bind:href="url"></a> 17 <!-- 缩写 --> 18 <a :href="url"></a> 19 <!-- 完整语法 --> 20 <a v-on:click="doSomething"></a> 21 <!-- 缩写 --> 22 <a @click="doSomething"></a> 23 24 <div id="demo1"> 25 <h2>site : {{ site }}</h2> 26 <h2>url : {{ url }}</h2> 27 <h2>zys : {{ zys }}</h2> 28 <h2>{{ findUser() }}</h2> 29 <div v-html="message"></div> 30 </div> 31 <script type="text/javascript"> 32 var vue = new Vue({ 33 el: '#demo1', 34 data: { 35 site: "123456", 36 url: "http://baidu.com", 37 zys: "zys", 38 message: "<h1>菜鸟教程</h1>" 39 }, 40 methods: { 41 findUser: function(){ 42 return this.zys + ",有梦想,加油!!!" 43 } 44 } 45 }); 46 </script> 47 <div id="demo2"> 48 <label for="r1">修改颜色</label><input type="checkbox" v-model="use" id="r1"> 49 <br><br> 50 <div v-bind:class="{'class1':use}"> 51 v-bind:class 指令 52 </div> 53 </div> 54 <script type="text/javascript"> 55 new Vue({ 56 el: '#demo2', 57 data: { 58 use: false 59 } 60 }); 61 </script> 62 <div id="demo3"> 63 <h2>{{ 5 + 5}}</h2><br> 64 {{ok ? "YES" : "NO"}}<br> 65 {{message.split('').reverse().join('')}} 66 <div v-bind:id="'list-' + id">菜鸟教程</div> 67 </div> 68 <script type="text/javascript"> 69 new Vue({ 70 el: '#demo3', 71 data: { 72 ok: true, 73 message: 'RUNOOB', 74 id: 2 75 } 76 }); 77 </script> 78 <div id="demo4"> 79 <h2 v-if="see1">现在你可以看到我</h2> 80 <template v-if="ok"> 81 <h3>Hello World!!!</h3> 82 </template> 83 </div> 84 <script type="text/javascript"> 85 new Vue({ 86 el: '#demo4', 87 data: { 88 see1: true, 89 ok: true 90 } 91 }); 92 </script> 93 94 <div id="demo5"> 95 <a v-bind:href="url">百度</a> 96 </div> 97 <script type="text/javascript"> 98 new Vue({ 99 el: '#demo5', 100 data: { 101 url: "http://baidu.com" 102 } 103 }); 104 </script> 105 106 <div id="demo6"><!-- 使用 v-model 指令来实现双向数据绑定 --> 107 {{ msg }} 108 <input v-model="msg"> 109 </div> 110 <script type="text/javascript"> 111 new Vue({ 112 el: '#demo6', 113 data: { 114 msg: "你好" 115 } 116 }); 117 </script> 118 119 <div id="demo7"><!-- 使用 v-on 监听事件 --> 120 {{ msg }} 121 <button v-on:click="reverseMsg">反转字符串</button> 122 </div> 123 <script type="text/javascript"> 124 new Vue({ 125 el: '#demo7', 126 data: { 127 msg : "Runoob!" 128 }, 129 methods: { 130 reverseMsg: function (){ 131 this.msg = this.msg.split('').reverse().join(''); 132 } 133 } 134 }); 135 </script> 136 <div id="demo8"> 137 {{ message | capitalize }} 138 </div> 139 <script> 140 new Vue({ 141 el: '#demo8', 142 data: { 143 message: 'runoob' 144 }, 145 filters: { 146 capitalize: function (value) { 147 if (!value) return '' 148 value = value.toString() 149 return value.charAt(0).toUpperCase() + value.slice(1) 150 } 151 } 152 }) 153 </script> 154 <div id="demo9"> 155 <div v-if="Math.random() > 0.5"> 156 Sorry 157 </div> 158 <div v-else> 159 Not Sorry 160 </div> 161 </div> 162 <script> 163 new Vue({ 164 el: '#demo9' 165 }) 166 </script> 167 <div id="demo10"> 168 <div v-if="type=='A'"> 169 A 170 </div> 171 <div v-else-if="type=='B'"> 172 B 173 </div> 174 <div v-else-if="type=='C'"> 175 C 176 </div> 177 <div v-else> 178 Not ABC 179 </div> 180 </div> 181 <script> 182 new Vue({ 183 el: '#demo10', 184 data: { 185 type: 'A' 186 } 187 }) 188 </script> 189 190 <div id="demo11"><!-- v-for 可以绑定数据到数组来渲染一个列表 --> 191 <ol><!-- v-for 指令需要以 site in sites 形式的特殊语法, sites 是源数据数组并且 site 是数组元素迭代的别名。 --> 192 <li v-for="site in sites"> 193 {{ site.name }} 194 </li> 195 </ol> 196 </div> 197 <script> 198 new Vue({ 199 el: '#demo11', 200 data: { 201 sites: [ 202 { name : 'A'}, 203 { name : 'B'}, 204 { name : 'C'} 205 ] 206 } 207 }) 208 </script> 209 <div id="demo12"><!-- v-for 可以通过一个对象的属性来迭代数据 --> 210 <ol> 211 <li v-for="value in object"> 212 {{ value }} 213 </li> 214 </ol> 215 </div> 216 <script> 217 new Vue({ 218 el: '#demo12', 219 data: { 220 object: { 221 name: "菜鸟教程", 222 url: "http://baidu.com", 223 explain: "说明描述等等", 224 } 225 } 226 }) 227 </script> 228 <div id="demo13"><!-- v-for 也可以循环整数 --> 229 <li v-for="n in 10"> 230 {{ n }} 231 </li> 232 </div> 233 <script> 234 new Vue({ 235 el: '#demo13' 236 }) 237 </script> 238 239 <div id="demo14"><!-- 计算属性关键词: computed --> 240 <p>原始字符串: {{ message }}</p> 241 <p>计算后反转字符串: {{ reversedMessage }}</p> 242 </div> 243 <script> 244 new Vue({ 245 el: '#demo14', 246 data: { 247 message: 'Runoob!' 248 }, 249 computed: { 250 // 计算属性的 getter 251 reversedMessage: function () { 252 // `this` 指向 vm 实例 253 return this.message.split('').reverse().join('') 254 } 255 } 256 }) 257 </script> 258 <div id="demo15"><!-- 通过 watch 来响应数据的变化 --> 259 <p style="font-size: 25px;">计数器: {{ counter }}</p> 260 <button @click="counter++" style="font-size: 25px;">点击</button> 261 </div> 262 <script> 263 var vm = new Vue({ 264 el: '#demo15', 265 data: { 266 counter: 1 267 } 268 }); 269 vm.$watch('counter',function(nval,oval){ 270 alert("计数器值的变化:" + oval + "变为" + nval + "!"); 271 }); 272 </script> 273 <div id="demo16"><!-- 千米与米之间的换算 --> 274 千米:<input type="text" v-model="kilometers"> 275 米:<input type="text" v-model="meters"> 276 <p id="info"></p> 277 </div> 278 <script> 279 var vm = new Vue({ 280 el: '#demo16', 281 data: { 282 kilometers: 0, 283 meters: 0 284 }, 285 methods: { 286 287 }, 288 watch: { 289 kilometers:function(val){ 290 this.kilometers = val; 291 this.meters = this.kilometers*1000; 292 }, 293 meters:function(val){ 294 this.kilometers = val/1000; 295 this.meters = val; 296 } 297 } 298 }); 299 vm.$watch('kilometers',function(newValue,oldValue){ 300 // 这个回调将在 vm.kilometers 改变后调用 301 document.getElementById ("info").innerHTML = "修改前值为: " + oldValue + ",修改后值为: " + newValue; 302 }); 303 </script> 304 305 <div id="demo17"><!-- 样式绑定 --> 306 <!-- <div class="active"></div> --> 307 <div :class="{active: isActive}"></div> 308 </div> 309 <script> 310 new Vue({ 311 el: '#demo17', 312 data: { 313 isActive: true 314 } 315 }); 316 </script> 317 <div id="demo18"><!-- 可以在对象中传入更多属性用来动态切换多个 class --> 318 <!-- <div class="static active text-danger"></div> --> 319 <div class="static" :class="{active: isActive,'text-danger': hasError}"></div> 320 </div> 321 <script> 322 new Vue({ 323 el: '#demo18', 324 data: { 325 isActive: true, 326 hasError: true 327 } 328 }); 329 </script> 330 <div id="demo19"><!-- 可以把一个数组传给 v-bind:class --> 331 <div :class="[activeClass, errorClass]"></div> 332 </div> 333 <script> 334 new Vue({ 335 el: '#demo19', 336 data: { 337 activeClass: 'active', 338 errorClass: 'text-danger' 339 } 340 }); 341 </script> 342 <div id="demo20"><!-- 可以把一个数组传给 v-bind:class --> 343 <div :style="{ color: activeColor, fontSize: fontSize + 'px' }">菜鸟教程</div> 344 </div> 345 <script> 346 new Vue({ 347 el: '#demo20', 348 data: { 349 activeColor: 'green', 350 fontSize: 30 351 } 352 }); 353 </script> 354 <div id="demo21"><!-- 可以把一个数组传给 v-bind:class --> 355 <div :style="styleObject">菜鸟教程</div> 356 </div> 357 <script> 358 new Vue({ 359 el: '#demo21', 360 data: { 361 styleObject: { 362 color: 'orange', 363 fontSize: '30px' 364 } 365 } 366 }); 367 </script> 368 369 <div id="demo22"><!-- Vue.js 事件处理器 --> 370 <button @click="counter += 1">增加1</button> 371 <p>这个按钮被点击了{{ counter }}次!</p> 372 </div> 373 <script> 374 new Vue({ 375 el: '#demo22', 376 data: { 377 counter: 0 378 } 379 }); 380 </script> 381 <div id="demo23"><!-- Vue.js 事件处理器 --> 382 <button @click="greet">Greet</button> 383 </div> 384 <script> 385 new Vue({ 386 el: '#demo23', 387 data: { 388 name: 'Vue.js' 389 }, 390 methods:{ 391 greet: function(event){ 392 // `this` 在方法里指当前 Vue 实例 393 alert('Hello ' + this.name + '!') 394 // `event` 是原生 DOM 事件 395 if(event){ 396 alert(event.target.tagName) 397 } 398 } 399 } 400 }); 401 </script> 402 <div id="demo24"><!-- 可以用内联 JavaScript --> 403 <button @click="say('hi')">Say hi</button> 404 <button @click="say('what')">Say what</button> 405 </div> 406 <script> 407 new Vue({ 408 el: '#demo24', 409 methods:{ 410 say: function(msg){ 411 alert(msg) 412 } 413 } 414 }); 415 </script> 416 <!-- 事件修饰符 --> 417 <!-- 阻止单击事件冒泡 --> 418 <a v-on:click.stop="doThis"></a> 419 <!-- 提交事件不再重载页面 --> 420 <form v-on:submit.prevent="onSubmit"></form> 421 <!-- 修饰符可以串联 --> 422 <a v-on:click.stop.prevent="doThat"></a> 423 <!-- 只有修饰符 --> 424 <form v-on:submit.prevent></form> 425 <!-- 添加事件侦听器时使用事件捕获模式 --> 426 <div v-on:click.capture="doThis">...</div> 427 <!-- 只当事件在该元素本身(而不是子元素)触发时触发回调 --> 428 <div v-on:click.self="doThat">...</div> 429 <!-- click 事件只能点击一次,2.1.4版本新增 --> 430 <a v-on:click.once="doThis"></a> 431 432 <!-- 表单 --> 433 <div id="demo25"><!-- 可以用 v-model 指令在表单控件元素上创建双向数据绑定 --> 434 <input v-model="message" placeholder="编辑input"> 435 <p>input消息是{{ message }}</p> 436 <textarea v-model="message2" placeholder="编辑textarea"></textarea> 437 <p>textarea消息是{{ message2 }}</p> 438 </div> 439 <script> 440 new Vue({ 441 el: '#demo25', 442 data: { 443 message: 123, 444 message2: 456 445 } 446 }); 447 </script> 448 <div id="demo26"><!-- 复选框如果是一个为逻辑值,如果是多个则绑定到同一个数组 --> 449 <p>单个复选框</p> 450 <input type="checkbox" name="checkbox" v-model="checked"> 451 <label>{{ checked }}</label> 452 <p>多个复选框</p> 453 <input type="checkbox" id="runoob" value="runoob" v-model="checkedNames"><label>Runoob</label> 454 <input type="checkbox" id="google" value="google" v-model="checkedNames"><label>Google</label> 455 <input type="checkbox" id="taobao" value="taobao" v-model="checkedNames"><label>Taobao</label> 456 <span>选择的值为: {{ checkedNames }}</span> 457 </div> 458 <script> 459 new Vue({ 460 el: '#demo26', 461 data: { 462 checked: false, 463 checkedNames: [] 464 } 465 }); 466 </script> 467 <div id="demo27"><!-- 单选按钮的双向数据绑定 --> 468 <input type="radio" id="google" value="google" v-model="picked"><label>Google</label> 469 <input type="radio" id="runoob" value="runoob" v-model="picked"><label>Runoob</label> 470 <span>选择的值为: {{ picked }}</span> 471 </div> 472 <script> 473 new Vue({ 474 el: '#demo27', 475 data: { 476 picked: 'google' 477 } 478 }); 479 </script> 480 <div id="demo28"><!-- 下拉列表的双向数据绑定 --> 481 <select v-model="selected" > 482 <option value="">选择一个网站</option> 483 <option value="http://google.com">谷歌</option> 484 <option value="http://baidu.com">百度</option> 485 </select> 486 <div>选择的网站:{{ selected }}</div> 487 </div> 488 <script> 489 new Vue({ 490 el: '#demo28', 491 data: { 492 selected: '' 493 } 494 }); 495 </script> 496 497 <!-- 组件 --> 498 <!-- 注册一个全局组件语法格式 Vue.component(tagName, options) --> 499 <!-- tagName 为组件名,options 为配置选项 <tagName></tagName> --> 500 501 <!-- 全局组件 --> 502 <div id="demo29"> 503 <runoob></runoob> 504 </div> 505 <script> 506 /*注册*/ 507 Vue.component('runoob',{ 508 template: '<h1>自定义组件1!</h1>' 509 }) 510 /*创建根实例*/ 511 new Vue({ 512 el: '#demo29' 513 }) 514 </script> 515 <!-- 局部组件 --> 516 <div id="demo30"> 517 <runoob></runoob> 518 </div> 519 <script> 520 /*注册*/ 521 var Chlid = { 522 template: '<h1>自定义组件2!</h1>' 523 } 524 /*创建根实例*/ 525 new Vue({ 526 el: '#demo30', 527 components:{ 528 // <runoob> 将只在父模板可用 529 'runoob': Chlid 530 } 531 }) 532 </script> 533 <!-- prop 是父组件用来传递数据的一个自定义属性 --> 534 <div id="demo31"> 535 <chlid message="hello!"></chlid> 536 </div> 537 <script> 538 Vue.component('chlid',{ 539 // 声明 props 540 props: ['message'], 541 // 同样也可以在 vm 实例中像 “this.message” 这样使用 542 template: '<span>{{ message }}</span>' 543 }) 544 /*创建根实例*/ 545 new Vue({ 546 el: '#demo31' 547 }) 548 </script> 549 </body> 550 </html>
以上这些Demo呢,是Vue部分知识点,后续呢我也会学习下面的知识,让我们一起进步,当然我这边只是我学习完之后的总结。具体想看详细的话,可看官方文档,便于自己学习。
目标就像船舰上的指南针,有指南针才知去何方。而那些没有指南针的船舰只能跟随它去远方,做一个小目标吧,让告诉你究竟想要干什么!