Vue入门(三)

Vue入门(三)

  这一节我们开始编写自己的程序。

  首先,我们看一下完成程序后的src目录中都有哪些东西:



  除了一些图片外(1张LOGO,3张手机图片、3张平板图片、3张电脑图片),src根目录下仍然有main.js和App.vue,router目录下有一个路由文件router.js,components目录下有几个组件文件,基本上每个链接都是一个组件(一级菜单home、about、user,二级菜单phone、tablet、computer)。

  我们挨个看一下:

  一、main.js
[javascript]  view plain  copy
  1. import Vue from "vue";  
  2. import App from "./App";  
  3. import router from "./router/router";  
  4.   
  5. new Vue({  
  6.   el: '#app',  
  7.   router,  
  8.   render: h => h(App)  
  9. });  


  本节的main.js与上一节比有一些变化,上一节是:


[javascript]  view plain  copy
  1. new Vue({  
  2.   el: '#app',  
  3.   router,  
  4.   components: { App },  
  5.   template: '<App/>'  
  6. })  


  从Vue2.0开始,改用render()函数来渲染组件,h是createElement的别名。

  h=>h(App)是箭头函数,相当于:

  render: function(createElement) {

    createElement(App); // 我们要提供render函数,它的主要代码就是创建出组件元素,App是组件名称

  }


  二、App.vue


[javascript]  view plain  copy
  1. <template>  
  2.   <div id="app">  
  3.     <img src="./assets/img/logo.jpg">  
  4.     <header>  
  5.       <router-link to="/home">Home</router-link>  
  6.       <router-link to="/about">About</router-link>  
  7.       <router-link to="/user/123">User123</router-link>  
  8.       <router-link to="/user/456">User456</router-link>  
  9.     </header>  
  10.     <router-view></router-view>  
  11.   </div>  
  12. </template>  
  13.   
  14. <script>  
  15. export default {};  
  16. </script>  
  17.   
  18. <style>  
  19. html {  
  20.   max-width: 640px;  
  21.   margin: 0 auto;  
  22. }  
  23.   
  24. article,  
  25. aside,  
  26. dialog,  
  27. footer,  
  28. header,  
  29. section,  
  30. footer,  
  31. nav,  
  32. figure,  
  33. menu {  
  34.   display: block;  
  35. }  
  36.   
  37. body,  
  38. div,  
  39. dl,  
  40. dt,  
  41. dd,  
  42. ul,  
  43. ol,  
  44. li,  
  45. h1,  
  46. h2,  
  47. h3,  
  48. h4,  
  49. h5,  
  50. h6,  
  51. pre,  
  52. code,  
  53. form,  
  54. fieldset,  
  55. figure,  
  56. section,  
  57. legend,  
  58. textarea,  
  59. p,  
  60. blockquote,  
  61. th,  
  62. td,  
  63. input,  
  64. select,  
  65. textarea,  
  66. button {  
  67.   margin: 0;  
  68.   padding: 0;  
  69. }  
  70.   
  71. body {  
  72.   font: 14px/1.4 'Microsoft Yahei', Arial, Helvetica, sans-serif;  
  73.   
  74.   max-width: 640px;  
  75.   margin: 0 auto;  
  76.   
  77.   color: #424242;  
  78.   background-color: #fff;  
  79. }  
  80.   
  81. h1,  
  82. h2,  
  83. h3,  
  84. h4,  
  85. h5,  
  86. h6 {  
  87.   font-size: 100%;  
  88.   font-weight: normal;  
  89. }  
  90.   
  91. table {  
  92.   border-spacing: 0;  
  93.   border-collapse: collapse;  
  94. }  
  95.   
  96. ul,  
  97. ol,  
  98. dd,  
  99. dt,  
  100. dl {  
  101.   list-style-type: none;  
  102. }  
  103.   
  104. a {  
  105.   text-decoration: none;  
  106.   
  107.   color: blue;  
  108. }  
  109.   
  110. a:hover {  
  111.   text-decoration: underline;  
  112. }  
  113.   
  114. input,  
  115. img {  
  116.   font-size: 14px;  
  117.   
  118.   padding: 0;  
  119.   
  120.   border: none;  
  121. }  
  122.   
  123. i,  
  124. em {  
  125.   font-style: normal;  
  126. }  
  127.   
  128. :focus {  
  129.   outline: none;  
  130. }  
  131.   
  132. @media (min-device-width: 375px) and(max-device-width: 667px) and(-webkit-min-device-pixel-ratio: 2) {  
  133.   body {  
  134.     font-size: 14.5px;  
  135.   }  
  136. }  
  137.   
  138. @media (min-device-width: 414px) and (max-device-width: 736px) and (-webkit-min-device-pixel-ratio: 3) {  
  139.   body {  
  140.     font-size: 15.5px;  
  141.   }  
  142. }  
  143.   
  144. .clear {  
  145.   clear: both;  
  146. }  
  147.   
  148. .clear:after {  
  149.   display: block;  
  150.   visibility: hidden;  
  151.   clear: both;  
  152.   overflow: hidden;  
  153.   
  154.   height: 0;  
  155.   
  156.   content: '.';  
  157. }  
  158.   
  159. .fl {  
  160.   float: left;  
  161. }  
  162.   
  163. .fr {  
  164.   float: right;  
  165. }  
  166.   
  167. .mb10 {  
  168.   margin-bottom: 10px;  
  169. }  
  170.   
  171. .mt10 {  
  172.   margin-top: 10px;  
  173. }  
  174.   
  175. </style>  


  这个文件的样式表部分比较长,因为要定义App的全部通用样式。

  我们重点来看<template>部分:

  <router-link to="/home">Home</router-link>定义了一个路由链接,它会被渲染为<a>标签,to属性指向路由表中的一个路径。

  <router-view></router-view>用于显示路由链接所指向的组件的内容。


  不管点页面上的哪个<router-link>,都会查找路由表,找到相应的组件,并显示在<router-view></router-view>标签处。


  三、router/router.js


[javascript]  view plain  copy
  1. import Vue from "vue";  
  2. import VueRouter from "vue-router";  
  3. import Home from "@/components/home.vue"// 导入所有组件  
  4. import About from "@/components/about.vue";  
  5. import User from "@/components/user.vue";  
  6. import Phone from "@/components/phone.vue";  
  7. import Tablet from "@/components/tablet.vue";  
  8. import Computer from "@/components/computer.vue";  
  9.   
  10. Vue.use(VueRouter); // 使用路由器  
  11.   
  12. const routes = [  
  13.     {  
  14.         path: '/home'// 路由1,路径为“/home”  
  15.         component: Home, // 组件为“Home”  
  16.         children: [ // 子路由,子路由的路径为“/home/phone”  
  17.             { path: 'phone', component: Phone },  
  18.             { path: 'tablet', component: Tablet },  
  19.             { path: 'computer', component: Computer }  
  20.         ]  
  21.     },  
  22.     { path: '/about', component: About },  
  23.     { path: '/', redirect: '/home' }, // 如果想第一次访问首页时,也能显示Home组件,可以使用redirect重定向到“/home”路径  
  24.     { path: '/user/:id', component: User }  
  25. ];  
  26.   
  27. var router = new VueRouter({ // 创建路由对象  
  28.     mode: 'history'// 路由模式为history,这种模式的URL比较自然:/home/user/123,另一种模式是hash  
  29.     routes  
  30. });  
  31.   
  32. export default router;  


  四、components/home.vue


[javascript]  view plain  copy
  1. <template>  
  2.   <div>  
  3.     <h1>Home</h1>  
  4.     <p>  
  5.       <router-link to="/home/phone">手机</router-link>  
  6.       <router-link to="/home/tablet">平板</router-link>  
  7.       <router-link to="/home/computer">电脑</router-link>  
  8.     </p>  
  9.     <router-view></router-view>  
  10.   </div>  
  11. </template>  
  12.   
  13. <script>  
  14. export default {};  
  15. </script>  


  这个文件比较简单。


  五、components/about.vue


[javascript]  view plain  copy
  1. <template>  
  2.   <div>  
  3.     <h1>About</h1>  
  4.     <p>{{ aboutMsg }}</p>  
  5.   </div>  
  6. </template>  
  7.   
  8. <script>  
  9. export default {  
  10.   data() {  
  11.     return {  
  12.       aboutMsg: "我是About组件"  
  13.     };  
  14.   }  
  15. };  
  16. </script>  


  这个文件比较简单。


  六、components/user.vue


[javascript]  view plain  copy
  1. <template>  
  2.   <div>  
  3.     <h1>User</h1>  
  4.     <p>我是User组件,动态部分是:{{ userId }}</p>  
  5.   </div>  
  6. </template>  
  7.   
  8. <script>  
  9. export default {  
  10.   computed: {  
  11.     userId() {  
  12.       return this.$route.params.id;  
  13.     }  
  14.   }  
  15. };  
  16. </script>  


  这个组件和其它组件不同的是,该组件的路由是带参数的,路由文件中的路径是:“{ path: '/user/:id', component: User }”,那么id就是路由的参数名,实际使用时,我们给了两个链接“/user/123”和“/user/456”,在代码中使用“this.$route.params.[参数名]”的方式可以获得参数值。this.$route表示当前路由,params是路由的参数集合。

  这里用计算属性的方式,返回了参数值。


  七、components/phone.vue


[javascript]  view plain  copy
  1. <template>  
  2.   <div>  
  3.     <h1>Phones</h1>  
  4.     <div v-for="phone in phones" class="item">  
  5.       <img :src="phone.img">  
  6.       <p>{{ phone.name }}</p>  
  7.     </div>  
  8.   </div>  
  9. </template>  
  10.   
  11. <script>  
  12. export default {  
  13.   data() {  
  14.     return {  
  15.       phones: [  
  16.         { name: "手机1", img: require("@/assets/img/phone1.jpg") },  
  17.         { name: "手机2", img: require("@/assets/img/phone2.jpg") },  
  18.         { name: "手机3", img: require("@/assets/img/phone3.jpg") }  
  19.       ]  
  20.     };  
  21.   }  
  22. };  
  23. </script>  
  24.   
  25. <style scoped>  
  26. .item {  
  27.   width: 200px;  
  28.   float: left;  
  29. }  
  30. .item img {  
  31.   width: 200px;  
  32.   height: 200px;  
  33. }  
  34. .item p {  
  35.   width: 200px;  
  36.   text-align: center;  
  37. }  
  38. </style>  


  这个文件的样式表部分,我们给<style>加了一个scoped,这表示该样式表只能用在本组件内,不作用于全局。


  再来看一下<template>部分的代码:


[html]  view plain  copy
  1. <div v-for="phone in phones" class="item">  
  2.   <img :src="phone.img">  
  3.   <p>{{ phone.name }}</p>  
  4. </div>  


  我们在<script>部分定义了一个phones数组,保存了所有手机的信息,所以可以使用Vue的v-for来遍历数组,例如:“v-for='phone in phones'”。v-for会生成多个<div>。

  然后使用“:src”将动态数据绑定到src属性上,在<p></p>中使用{{phone.name}}输出手机的名称。


  可以参照这个文件,类似地编写平板、电脑的组件。


  八、运行


  完成上述代码后,用“CTRL+`”调出控制台,输入“npm run dev”运行,并在浏览器的地址栏中输入“http://localhost:8080”即可看到运行结果。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值