资讯专栏INFORMATION COLUMN

vue小项目实战

VishKozus / 3635人阅读

摘要:概念图此文章参考网络教程清单实现过程项目说明这个简单小项目只提供一个小小小的骨架,需要向它身上具体加多少肉,需要大家考虑好功能和布局后进行完善。详情请看下图具体文件夹以及文件名称可根据自己项目进行自拟。

概念图

此文章参考网络教程

</>复制代码

  1. https://www.jianshu.com/p/ec436222c608
清单(实现过程) 项目说明

ps:这个简单小项目只提供一个小小小的骨架,需要向“它”身上具体加多少“肉”,需要大家考虑好功能和布局后进行完善。

1.首先看下主页效果:如下图

主页分析:大体上分为上(header)、中(body或content)、下(footer)三部分,中间body部分是由若干个相同的li组成的“列表”,所以我们可将li定义为一个组件。

2.再来看下商品详情页:如下图

详情页分析:也分为上、中、下三部分。

配置目录文件

在src文件夹(也就是我们码农主要工作区)下,创建assets文件夹(用来保存项目所需图片)、components(存组件commonFooter.vue、DetailHeader.vue、homeHeader.vue、list.vue)、pages(存页面goodsDetail.vue、home.vue)和main.js文件。详情请看下图:

ps: 1.具体文件夹以及文件名称可根据自己项目进行“自拟”。 2.这里的每一个*.vue文件都是一个组件。

配置相关接口

主页商品信息及图片, 是从服务器端返回的json数据,不可能所以商品都“写死”。故这里需要模拟后台建立了一个数据文件。在根目录下建立一个goods.json文件用来放“伪数据”,如下图:

注意json里不能带有注释和其他文字,不然会项目跑不起来,出错

</>复制代码

  1. {
  2. "goods": [
  3. { "price": "69.9", "title": "德芙", "img": "http://m.360buyimg.com/babel/s211x211_jfs/t3688/270/776223567/128582/fa074fb3/58170f6dN6b9a12bf.jpg!q50.jpg.webp" },
  4. { "price": "63", "title": "费列罗", "img": "http://m.360buyimg.com/babel/s211x211_jfs/t613/100/1264998035/221234/1a29d51f/54c34525Nb4f6581c.jpg!q50.jpg.webp"},
  5. { "price": "29.9", "title": "大米", "img": "http://m.360buyimg.com/babel/s211x211_jfs/t1258/40/17387560/108696/aced445f/54e011deN3ae867ae.jpg!q50.jpg.webp"},
  6. { "price": "54.9", "title": "安慕希", "img": "http://m.360buyimg.com/babel/s211x211_jfs/t2734/15/680373407/215934/3abaa748/572057daNc09b5da7.jpg!q50.jpg.webp"},
  7. { "price": "58", "title": "金典", "img": "http://m.360buyimg.com/babel/s211x211_jfs/t2482/145/1424008556/91991/d62f5454/569f47a2N3f763060.jpg!q50.jpg.webp"},
  8. { "price": "60", "title": "味可滋", "img": "http://m.360buyimg.com/babel/s211x211_jfs/t2368/3/874563950/70786/7b5e8edd/563074c8N4d535db4.jpg!q50.jpg.webp" },
  9. { "price": "248.00", "title": "泸州老窖", "img": "http://m.360buyimg.com/babel/s211x211_jfs/t283/166/1424018055/189580/7c0792b7/543b4958N05fa2feb.jpg!q50.jpg.webp"},
  10. { "price": "328.8", "title": "剑南春", "img": "http://m.360buyimg.com/babel/s350x350_g15/M05/1A/0A/rBEhWlNeLAwIAAAAAAHyok3PZY0AAMl8gO8My0AAfK6307.jpg!q50.jpg.webp"},
  11. { "price": "49.00", "title": "蓝莓", "img": "http://m.360buyimg.com/babel/s211x211_jfs/t2332/148/2952098628/94387/e64654e2/56f8d76aNb088c2ab.jpg!q50.jpg.webp" },
  12. { "price": "68", "title": "芒果", "img": "http://m.360buyimg.com/n0/jfs/t3709/334/1378702984/206759/5c100ab5/58253588Naaa05c5c.jpg!q70.jpg"}
  13. ]
  14. }

使用node中的express,
安装express和axios

在main.js里配置axios到原型链中
注意标记的那两行

</>复制代码

  1. import Vue from "vue"
  2. import App from "./App"
  3. import router from "./router"
  4. import axios from "axios" //注意这行
  5. Vue.prototype.$http = axios; //注意这行
  6. Vue.config.productionTip = false
  7. new Vue({
  8. el: "#app",
  9. router,
  10. components: { App },
  11. template: ""
  12. })

在build>>webpack.dev.conf.js配置express并设置路由规则

如图:

代码如下:

</>复制代码

  1. "use strict"
  2. const utils = require("./utils")
  3. const webpack = require("webpack")
  4. const config = require("../config")
  5. const merge = require("webpack-merge")
  6. const baseWebpackConfig = require("./webpack.base.conf")
  7. const HtmlWebpackPlugin = require("html-webpack-plugin")
  8. const FriendlyErrorsPlugin = require("friendly-errors-webpack-plugin")
  9. const portfinder = require("portfinder")
  10. /* datura_lj 增加express 20171126 */
  11. const express = require("express")
  12. const app = express()
  13. var appData = require("../goods.json")/*加载本地数据文件*/
  14. var goods = appData.goods
  15. var apiRoutes = express.Router()
  16. app.use("/api", apiRoutes)
  17. /* 增加express end */
  18. const devWebpackConfig = merge(baseWebpackConfig, {
  19. module: {
  20. rules: utils.styleLoaders({ sourceMap: config.dev.cssSourceMap, usePostCSS: true })
  21. },
  22. // cheap-module-eval-source-map is faster for development
  23. devtool: config.dev.devtool,
  24. // these devServer options should be customized in /config/index.js
  25. devServer: {
  26. clientLogLevel: "warning",
  27. historyApiFallback: true,
  28. hot: true,
  29. compress: true,
  30. host: process.env.HOST || config.dev.host,
  31. port: process.env.PORT || config.dev.port,
  32. open: config.dev.autoOpenBrowser,
  33. overlay: config.dev.errorOverlay ? {
  34. warnings: false,
  35. errors: true,
  36. } : false,
  37. publicPath: config.dev.assetsPublicPath,
  38. proxy: config.dev.proxyTable,
  39. quiet: true, // necessary for FriendlyErrorsPlugin
  40. watchOptions: {
  41. poll: config.dev.poll,
  42. },
  43. /* datura_lj 增加express 20171126 */
  44. before(app) {
  45. app.get("/api/goods", (req, res) => {
  46. res.json({
  47. code: 0,
  48. data: goods
  49. })
  50. })
  51. }
  52. /* datura_lj 增加路由规则 end */
  53. },
  54. plugins: [
  55. new webpack.DefinePlugin({
  56. "process.env": require("../config/dev.env")
  57. }),
  58. new webpack.HotModuleReplacementPlugin(),
  59. new webpack.NamedModulesPlugin(), // HMR shows correct file names in console on update.
  60. new webpack.NoEmitOnErrorsPlugin(),
  61. // https://github.com/ampedandwired/html-webpack-plugin
  62. new HtmlWebpackPlugin({
  63. filename: "index.html",
  64. template: "index.html",
  65. inject: true
  66. }),
  67. ]
  68. })
  69. module.exports = new Promise((resolve, reject) => {
  70. portfinder.basePort = process.env.PORT || config.dev.port
  71. portfinder.getPort((err, port) => {
  72. if (err) {
  73. reject(err)
  74. } else {
  75. // publish the new Port, necessary for e2e tests
  76. process.env.PORT = port
  77. // add port to devServer config
  78. devWebpackConfig.devServer.port = port
  79. // Add FriendlyErrorsPlugin
  80. devWebpackConfig.plugins.push(new FriendlyErrorsPlugin({
  81. compilationSuccessInfo: {
  82. messages: [`Your application is running here: http://${config.dev.host}:${port}`],
  83. },
  84. onErrors: config.dev.notifyOnErrors
  85. ? utils.createNotifierCallback()
  86. : undefined
  87. }))
  88. resolve(devWebpackConfig)
  89. }
  90. })
  91. })

npm run dev 之后,测试是否该数据可用,在浏览器地址栏中输入:http://localhost:8080/api/goods ,在浏览器中展示出如下图数据,代码数据数取成功

配置config/index.js:解决跨域问题

在proxTable对象里写:

</>复制代码

  1. proxyTable: {
  2. "/api": {
  3. target: "http://127.0.0.1:8080/api",
  4. changeOrigin: true,
  5. pathRewrite: {
  6. "^/api": "/"
  7. //写"/api"就等于写"http://127.0.0.1:8080/api"
  8. //到时候写"/api/goods"就等于写"http://127.0.0.1:8080/api/goods"
  9. }
  10. }
  11. }

原来参考教程有些地方需要修改:

home.vue里的获取数据要改成这样才对:

2.修改list.vue里的价格显示那行代码

3.在home.vue里修改组件 : v-for="(item, index) in items" :key="index" 这样就可以运行了

期待扩写功能:实现点击商品列表的某一项(商品列表为请求数据循环输出),传参到详情页,详情页根据传过来的参数去请求数据回来填充到页面.

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/95764.html

相关文章

  • 前端面试题总结(js、html、程序、React、ES6、Vue、算法、全栈热门视频资源)

    摘要:并总结经典面试题集各种算法和插件前端视频源码资源于一身的文档,优化项目,在浏览器端的层面上提升速度,帮助初中级前端工程师快速搭建项目。 本文是关注微信小程序的开发和面试问题,由基础到困难循序渐进,适合面试和开发小程序。并总结vue React html css js 经典面试题 集各种算法和插件、前端视频源码资源于一身的文档,优化项目,在浏览器端的层面上提升速度,帮助初中级前端工程师快...

    pumpkin9 评论0 收藏0
  • 前端面试题总结(js、html、程序、React、ES6、Vue、算法、全栈热门视频资源)

    摘要:并总结经典面试题集各种算法和插件前端视频源码资源于一身的文档,优化项目,在浏览器端的层面上提升速度,帮助初中级前端工程师快速搭建项目。 本文是关注微信小程序的开发和面试问题,由基础到困难循序渐进,适合面试和开发小程序。并总结vue React html css js 经典面试题 集各种算法和插件、前端视频源码资源于一身的文档,优化项目,在浏览器端的层面上提升速度,帮助初中级前端工程师快...

    Carson 评论0 收藏0
  • 前端面试题总结(js、html、程序、React、ES6、Vue、算法、全栈热门视频资源)

    摘要:并总结经典面试题集各种算法和插件前端视频源码资源于一身的文档,优化项目,在浏览器端的层面上提升速度,帮助初中级前端工程师快速搭建项目。 本文是关注微信小程序的开发和面试问题,由基础到困难循序渐进,适合面试和开发小程序。并总结vue React html css js 经典面试题 集各种算法和插件、前端视频源码资源于一身的文档,优化项目,在浏览器端的层面上提升速度,帮助初中级前端工程师快...

    muzhuyu 评论0 收藏0
  • 光光谈前端

    摘要:这个问题应该是百度或者知乎都能知道答案的,以上是自己亲身学习的一些途径方便少走一点弯路入门。 问题1:前端的学习路线 基础的html,css,js,推荐慕课网免费课程:前端工程师路径,极客学院免费课程:前端工程师路径 大概刷过就可以了,不用死记硬背某个知识点,css跟js还需要加深学习的,在实战过程中不懂就去查文档 基础的ps切图能力 慕课网ps基础课程 拥有自己的虚拟主机 传送...

    canopus4u 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<