美文网首页vue学习vue -demovue-cli
Vue2.0史上最全入坑教程(完)—— 实战案例

Vue2.0史上最全入坑教程(完)—— 实战案例

作者: 诺奕 | 来源:发表于2017-03-03 12:28 被阅读20843次
我们书接上文,已经定义了两个组件(list、commonFooter、homeHeader.vue),接下来写home.vue:
<template lang="html">
  <div class="container">
    <home-header></home-header>   <!--  展示引入的header组件 -->
    <div class="content">
      <ul class="cont-ul">
          <!-- list组件展示区,并用v-for来将数据遍历,:xx="xxx" 是用来给子组件传递数据的 -->
        <list v-for="item in items" :price="item.price" :title="item.title" :img="item.img"></list>
      </ul>
    </div>
    <common-footer></common-footer>  <!--  展示引入的footer组件 -->
  </div>
</template>
<script>
import HomeHeader from '../components/HomeHeader'   /* 本页面中用到了HomeHeader组件,所以就需要在这里引入一下 */
import CommonFooter from '../components/commonFooter'
import List from '../components/list'
export default {
  data () {
      return {
          items: []   /* 定义一个空数组数据items */
      }
  },
  components: {
    HomeHeader,
    CommonFooter,
    List
  },
  created () {   /* 这个是vue的钩子函数,当new Vue()实例创建完毕后执行的函数 */
      this.$http.get('/api/goods').then((data) => {   /* 调用vue的ajax来请求数据,promise语法,并用es6的箭头函数 */
      this.items = data.body.data;
      })
  }
}
</script>

<style lang="css" scoped>
  .container {
    width: 100%;
    margin: 0 auto;
  }
  .content {
    margin-bottom: 1.8rem;
  }
  .cont-ul {
    padding-top: 0.5rem;
    background-color: #ccc;
  }
  .cont-ul::after {
    content: '';
    display: block;
    clear: both;
    width: 0;
    height: 0;
  }
</style>

3. 商品详情页goodsDetail.vue:

a). DetailHeader.vue

<template lang="html">
  <div class="head">
    <div class="header">
      <a href="javascript:;" class="go-back" @click="goBack">返回</a>
      <h4 class="header-cont">商品详情页</h4>
    </div>
  </div>
</template>

<script>
export default {
  methods: {
    goBack () {
      window.history.back();
    }
  }
}
</script>

<style lang="css" scoped>
  .head{
    height: 2rem;
  }
  .header{
    width: 100%;
    height: 2rem;
    position: fixed;
    left: 0;
    top: 0;
    background-color: #fff;
    border-bottom: 2px solid #ccc;
  }
  .header .go-back {
    width: 2rem;
    height: 2rem;
    text-align: center;
    color: #ccc;
    font-size: 0.8rem;
    float: left;
    line-height: 2rem;
    margin-left: 1rem;
    position: absolute;
    left: 0;
    top: 0;
  }
  .header .header-cont {
    width: 100%;
    text-align: center;
    line-height: 2rem;
    font-size: 1.2rem;
  }
</style>

b). goodsDetail.vue

<template lang="html">
  <div class="detail">
      <detail-header></detail-header>
      <p class="site-title">树懒果园 泰国进口大金煌芒果</p>
      <p class="site-cont">5斤装,约2-4个果,大!!!甜!!!</p>
      <common-footer></common-footer>
  </div>
</template>

<script>
import DetailHeader from '../components/DetailHeader'
import CommonFooter from '../components/commonFooter'

export default {
  data () {
    return {

    }
  },
  components: {
    DetailHeader,
    CommonFooter
  }
}
</script>

<style lang="css">
  .detail {
    padding: 0.25rem;
    font-size: 12px;
  }
  .detail > img {
    display: block;
    width: 80%;
    margin:  0 auto 0.5rem;
  }
  .detail > p {
    font-size: 1.1rem;
    line-height: 1.5rem;
    text-align: left;
    padding-bottom: 0.5rem;
  }
  .detail > p.site-title {
    color: #ff8000;
  }
  .detail > p.site-cont {
    color: #666;
    font-size: 0.9rem;
  }
</style>

至此一个简单的基于vue但页面应用,编写完毕。下面我就简单说下例子过程中用到的一些语法,以便加深大家的理解

demo的github地址,觉得不错的给个star

相关文章

网友评论

  • ed88a0f6e5fa:您好,问一下怎么显示主键的内容呢
  • 5913343dc17c:<router-view></router-view>在点击上面router-link组件生成的导航a,url变成localhost:8080/#/detail,但是页面没有任何结果展示。还是一直显示商品列表页,detail页面一直都没出现,也没有出现报错,作者大大,请问一下这是什么原因造成的呢?
    诺奕:router-view默认会渲染成a标签的。检查下在router里面是否配置相关路由
  • 关键我是晓俊啊:<home-header></home-header> 为什么要这样引入组件呢
    还有就是你是怎么从vue初始化的那个界面跳转到你现在的主页的
    诺奕:home-header这个是在HTML中的写法,homeHeade这样写也是可以的,这看公司的规范和个人习惯。但是需要注意的一点就是在JS中一定不要home-header ,这样写
  • Van有梦想的人不睡觉:看到这里了,特地注册个账号来评论下。先说一句报错是正常的,这种东西更新很快,也许1个月来看这篇文章的也会报错,又需要改进。如果新同学是最近学VUE,比如我这个时间点,你按照作者的代码完成后,再去GitHub上补齐其它的代码,运行会报错,在pages/home.vue, 你可以百度一下,或者直接修改了 list这个组件 需要绑定键 v-for="(item, index) in items" :key="index" 这样就可以运行了。 总体讲的很不错,让我们这种速成的理解的很快。
    8e6035d3b9cb:哎呀 太厉害了,我的报错一直没解决 这下好了
    97470200bc90:之前看了传智涂俊雄老师的视频,跟着敲了两遍代码,今天想来了解下vue-cli,看见了博主的这一系列文章,总结一下:简练,通俗。 但是没有基础的看着应该挺费劲,比如一些es6的语法,promise函数 express服务器的配置 最好有一些了解以后再看此文 感觉不错。还有 为什么没有用axios
    诺奕:@有梦想的人不睡觉_258a 谢谢支持,您说的这个应该是警告,貌似在2.4语法更新的。这个是循环时候给一个唯一标识。在1.0的版本就有的,后来去掉了,现在又加上了。希望能帮助到你
  • 折柳画马:您好,home.vue文件里的<home-header></home-header>是如何实现与components里的HomeHeader相对应,找了好多地方找不到对应配置文件,有点迷糊,望指点,多谢!
    折柳画马:@datura_lj :clap: 多谢
    诺奕:@折柳画马 你好,这个HomeHeader是在js中驼峰命名,在html中就用中划线“-”连接了
  • 8348a9d3b4e8:感觉组件封装过度了,如果没有复杂逻辑和样式,同样也没有复用,就没必要封装组件,就是一个简单的布局而已,个人见解
  • 远方有多远_eee0:写了home组件后就有警告,效果出不来,只有头部主页两字,这是什么原因?
    一寸心_1fe1:我的啥都没有,也报错,就连头部的主页都没有。你的后来怎么处理了?
  • 6ab36a0711ee:楼主好耐心,向您学习!:blush: 期待你更多文章哈!我最近也在学习vue,不太会在vue项目中用rem做适配,楼主有空写篇文章,让大伙学习学习!已关注楼主,期待:grin:
    诺奕:@珍珍2012 你好。vue项目中的rem适配和普通的移动端适配是一样的。就是根据设计图尺寸来给元素响应的rem
  • 19e799b388b6:作者写得很不错,可是如果不给出index.js和main.js,我这样的小白看了还是一头雾水。单看文章的讲解我还是无法将这些组件串起来理解。
    诺奕:@科学君_b478 因为,一般是需要use的main.js使用和,全局注册的
  • f91911048988:想请问那个商品详情每个都不一样该怎么写
    诺奕:@G_2c3d 因为详情页是公用组件,列表页可以在路由跳转的时候传递每个商品的id,然后详情页在根据id来请求ajax,然后展示数据
    f91911048988:@datura_lj 网上查这个看的不是很懂,能不能具体一点
    诺奕: @G_2c3d 可以通过,路由跳转传参
  • 1c437c1b5d12:这里还有好几个文件没有讲到,按照楼主的顺序来运行不了
    诺奕: @拒絕誘惑 嗯,可以看看我的github,那个clone下来就行。这个我只说了主要的。有任何问题可以加群沟通
  • 6c0f61850d15:vue 怎么在手机上测试?
    6c0f61850d15:@datura_lj 那苹果机可以用什么?
    诺奕: @Mr欧耶 安卓机可以用inspect
  • 04f2f99cae1f:作者大大,您好。
    我照着你的步骤一路走了下来,数据可以请求出来,就后面运行的时候报错,错误如下:
    “Refused to apply inline style because it violates the following Content Security Policy directive: "default-src 'self'". Either the 'unsafe-inline' keyword, a hash ('sha256-cEmJ9wfQpnZLR35+jGeZk1WmknBbXo0CyiXREeJHUGo='), or a nonce ('nonce-...') is required to enable inline execution. Note also that 'style-src' was not explicitly set, so 'default-src' is used as a fallback.

    addAnimations @ VM60:47
    init @ VM60:103
    (anonymous) @ VM60:106
    doAdblock @ VM60:107
    (anonymous) @ VM60:1
    (anonymous) @ include.postload.js:1
    sendResponseAndClearCallback @ VM55 extensions::messaging:417
    messageListener @ VM55 extensions::messaging:449
    EventImpl.dispatchToListener @ VM48 extensions::event_bindings:403
    publicClassPrototype.(anonymous function) @ VM54 extensions::utils:140
    EventImpl.dispatch_ @ VM48 extensions::event_bindings:387
    EventImpl.dispatch @ VM48 extensions::event_bindings:409
    publicClassPrototype.(anonymous function) @ VM54 extensions::utils:140
    dispatchOnMessage @ VM55 extensions::messaging:390”
    help,感觉迷乱了。
    vue新手,这是我照着写的第一个列子。。
  • 平凡但不平庸的人生:博主,最近一直在看你的文章,收益颇丰,再次感谢;但是遇到这个错误, GET http://localhost:8080/api/goods 404 (Not Found),之前测试能获取到数据,但是把所有的代码都写完后,又获取不到数据了,请求数据总是跳转到首页
  • c4fc0c987595:为什么用webpack打包后报错,我一修改文件路径,项目启动就不正常???
    c4fc0c987595:@datura_lj 修改文件引用路径后,文件能引用上,但是定义的数据json文件找不到

    报错:XMLHttpRequest cannot load file:///C:/api/goods. Cross origin requests are only supported for protocol schemes: http, data, chrome, chrome-extension, https.
    (anonymous) @ vue-resource.es2015.js:1085
    诺奕:@恋_0b18 具体情况具体分析,得看啥报错信息
  • Luo_2a25:commonfooter这些组件import有误,为什么?
    错误如下:
    ERROR in ./node_modules/vue-loader/lib/template-compiler?{"id":"data-v-1dcad40a","hasScoped":true,"transformToRequire":{"video":"src","source":"src","img":"src","image":"xlink:href"},"buble":{"transforms":{}}}!./node_modules/vue-loader/lib/selector.js?type=template&index=0&bustCache!./src/components/index.vue
    (Emitted value instead of an instance of Error)
    Error compiling template:

    <common-header></common-header>
    <div class="head">
    <div class="header">
    <h4 class="header-cont">主页</h4>
    </div>
    </div>
    <common-footer></common-footer>

    - Component template should contain exactly one root element. If you are using v-if on multiple elements, use v-else-if to chain them instead.

    @ ./src/components/index.vue 10:0-358
    @ ./src/router/index.js
    @ ./src/main.js
    @ multi ./build/dev-client ./src/main.js
    8e6035d3b9cb:包裹一层,在你写的带上外面???
    诺奕:@Luo_2a25 Component template should contain exactly one root element。就是只能有个根元素,包裹一层,在你写的带上外面,试试
  • 328b3aa412dc:浏览器报错:Cannot read property 'get' of undefined",怎么破?
    平凡但不平庸的人生:是因为你没有引入vue-resource模块导致的
  • 5a4f044975e3:你好 你的github里的项目是不是没有做 不同商品显示对应的信息 的功能 请问这个怎么实现呢 通过连接跳转将之前从props中获取的信息传到goodsDetail页面中呢(初入手vue 望解答)
    诺奕:@先把QQ关了 用data中的数据
    5a4f044975e3:@datura_lj 我尝试用路由传参 goodsDetail页面能收到 但就是list这个router-link中没有正确将该商品的数据传过去 不知道应该怎么把props中的值给router-link 中加上 可能是我穿的方式不对 我传过去的都是我写在router-link中的变量名的字符串
    诺奕:商品信息应该是后台返回的json数据,如果是状态管理的话,推荐使用vuex。如果是路由跳转传参,可以通过路由传,query的参数
  • c29e6b3f5b49:想请问下为什么localhost:8080/后面我填msg或者detail结果还是跳转到商品列表页面
    诺奕: @影山牌垫肩 这个#是hash的意思,在路由配置里可以选择模式。model这个。
    c29e6b3f5b49:@datura_lj 试了一下,前面加上#/就OK了,这个#/好像一直都有
    诺奕: @影山牌垫肩 看看路由配置,应该是那里
  • 2d54cbf8374c:楼主你下载下来打不开
    诺奕: @春色满园关不住_cb6d 不会的。clone下来就是文件夹,怎么会打不开呢
  • 172f623f1e20:楼主,这是什么问题呢?
    诺奕:@xingxing525 页面没找到404了
    172f623f1e20:页面显示Cannot GET /,
    控制台显示GET http://localhost:8090/ 404 (Not Found)
  • 7a236da5374d:主页面入口index.html并没有引入其他的js文件。为什么<router-view></router-view>会产生效果呢。不是应该引入路由相依赖的文件,<router-view></router-view>才会产生效果吗?
    7a236da5374d:@datura_lj 谢谢了,感觉你真的写的不错,学到了:blush:
    诺奕:@7a236da5374d 谢谢支持,针对此问题,我其他文章已经说明 ,请移驾(http://www.jianshu.com/p/b499f7ad81cf)
  • 以为是书生:你好,新手一枚,请问 : ![](../assets/image/54205424_big.jpg) 这个是用来显示图片的吗?
    和<img :src="xxx"/>这种有区别吗?
    诺奕:您好,![]()这个是markdown的语法用来展示图片的,和vue没关系,防止误会已经删除了。谢谢支持!
  • 05b80db6545e:你好,跳转到详情页打不开,有这样一个警告:(Emitted value instead of an instance of Error) <list v-for="item in items">: component lists rendered with v-for should have explicit keys. See https://vuejs.org/guide/list.html#key for more info. key是什么,怎么解决啊
    诺奕: @雨落先湿我心 挺好,加油
    05b80db6545e:@datura_lj 可以了,router下出了点小问题
    诺奕: @雨落先湿我心 看看数据过来没
  • cf15438eb83b:为什么,你的项目打不开,会有报错呢?
    cf15438eb83b:你有qq没,可以加你一下吗
    cf15438eb83b:@datura_lj 我就是在你GitHub下载的
    诺奕:@凌潇漫步 您是在哪打的?可以去我的github上下载
  • 2498c5bf4186:看完了,很不错,对于新手来说有很大的帮助。
    好像还缺少mainJS和indexjs说明
    诺奕:@边缘_06a4 谢谢支持
  • 7af9da7188df:测试数据,显示不出来,怎么回事,一直停留在首页
    b69a9a5169ff:@datura_lj 7楼说测试数据出不来
    诺奕: @左心室 啥?
    b69a9a5169ff:你是不是把json里边的注释也给贴上去了?
  • c288b3a78cca:你好, 跟着你的步骤写到了这里。 但是就不知道怎样让页面生效了。 感觉一下子断了一部分。我是一个学习Vue的新手。
    定义好了各个组件的.Vue,怎么让页面显示出来呢?
    是不是后面应该还有部分配置?
    诺奕: @c288b3a78cca 你好,看完,我很欣慰。页面生效就是,用nodejs启一个服务,然后可以用浏览器访问。针对定义好的组件在vue2.x中,可以在需要的父组件内,用配置选项components里以键值对的方式写
  • 魔攻力缆狂澜聊:源码地址有吗?😁
    诺奕:@魔攻力缆狂澜聊 可以,现在网络不好,传上去的话告诉你
    魔攻力缆狂澜聊:@datura_lj :smile: 介意传一个吗:smile:
    诺奕: @魔攻力缆狂澜聊 有,需要的话,我可以传到github
  • 活在初音的未来:报了两个错……能帮忙看下嘛?
    [Vue warn]: Error in created hook:
    (found in <Home> at E:\project\git\vue\vuedemo\src\page\home.vue)

    vue.esm.js?c2ce:1445 TypeError: Cannot read property 'get' of undefined

    这两个错误全是created钩子的错,这是我写的
    created () {
    this.$http.get('/api/goods').then((data) => {
    this.items = data.body.data
    })
    }
    48ce0aa14516:我重新装了,还是报这个错,,不知道怎么解决~~~~:joy:
    诺奕: @voicing 嗯嗯,那就安装呗
    voicing:这个我也遇到了,因为没有安装vue-resource模块,所以找不到$http对象。
  • 活在初音的未来:你好,我跟着走完了。
    你应该是少了一步配置没说吧?
    ./src/router/index.js
    这个路由的配置文件也需要进行更改,不然会提示hello页面不存在
    活在初音的未来:@datura_lj 没有……谢了……
    诺奕: @活在初音的未来 兄弟,你下载引入resource模块了嘛,下班了,手机,看代码不太方便
    诺奕: @活在初音的未来 如果你是用脚手架搭建的用改就能显示,如果自己加了一些东西就需要配置
  • 相思雨gg:嗯嗯,不错,我最近也在学vue感觉很强大
    诺奕:嗯,很强大的。面向数据变成嘛,还有vuex等组件库呢,都挺好用的

本文标题:Vue2.0史上最全入坑教程(完)—— 实战案例

本文链接:https://www.haomeiwen.com/subject/bjglgttx.html