了解MVVM,vue.js搭建属于你的饿了吗项目

1.MVVM框架

view      <=>         viewModel   <=>        model

视图(DOM) 通讯(观察者) 数据(js对象)

  • 基本概念:当数据发生变化,viewModel观察到数据变化,通知对应视图自动更新

当用户操纵视图,viewModel也能监听到视图变化,通知数据改变

  • 应用场景:

针对具有复杂交互逻辑的前端应用

提供基础的架构抽象

通过ajax数据持久化,保证前端用户体验

2.什么是vue.js?

一个轻量级的MVVM框架 组件化+数据驱动的前端开发

  • 数据驱动:数据改变驱动dom自动更新,dom是数据的自然映射
  • 组件化:扩展HTML元素,封装可重用代码

组件设计原则:

页面每个独立的可视/可交互区域视为一个组件

每个组件对应一个工程目录,组件需要的资源在这个目录下就近维护

页面不过是组件的容器,组件可以嵌套自由组合形成完整的页面

3.vue开发利器vue cli——Vue的脚手架

$npm install -g vue-cli//全局安装

$vue init webpack sell//初始化一个项目vue init <模板> <项目名>

$cd sell

$npm install//安装依赖,生成node_modeles文件

$npm run dev//运行项目

进入文件夹,查看了解各个项目文件是干嘛的(后续补充)

4.资源准备

需求分析:头部-商品页-评价页-商家 -详情页-购物车

项目资源准备:图片素材

图标字体制作:https://icomoon.io/app/#/select将svg文件上传生成对应的icon下载下来

目录设计:在src下面新建一个common文件,将上一步下载的文件copy过来。

模拟(mock)数据:在build./dev-server.js文件里写路由获取数据

...
const app = express()
const appData = require('../data.json')
const seller = appData.seller
const goods = appData.goods
const ratings = appData.ratings
// router
const apiRoutes = express.Router();
apiRoutes.get('/seller', function (req, res) {
  res.json({
    code: "SVCSTG.0000000",
    data: seller
  })
})
...
app.use('/api', apiRoutes)
...

5.页面骨架拆分

 <!--html5移动端Meta设置 强制让文档的宽度与设备的宽度保持1:1,并且文档最大的宽度比例是1.0,且不允许用户点击屏幕放大浏览。 -->
  <meta name="viewport" content="width=device-width, initial-scale=1.0,maximum-scale=1.0, user-scalable=no" />
  

一个vue文件模板:

<template>
<div class="header">
    我是header
</div>
</template>

<script  type="text/ecmascript-6">
    export default {};
</script>

<style lang="stylus" rel="stylesheet/stylus" scoped>

</style>

。。。

6.css-stick-footer布局写详情页

flex布局

 

 

 

 

项目为外卖App核心的商家模块的SPA,包括商品、评论、商家介绍、购物车等多个子模块,使用Vuejs全家桶+ES6+Webpack等前端最新最热的技术,采用模块化、组件化、工程化的模式开发; 显示/隐藏优惠和公告详情 <template> <div class="header"> <div class="content-wrapper"> <div class="avatar"> <img width="64" height="64"src="seller.avatar"> </div> <div class="content"> <div class="title"> <span class="brand"></span> <span class="name">{{seller.name}}</span> </div> <div class="description"> {{seller.description}}/{{seller.deliveryTime}}分钟到达 </div> <div class="support" v-if="seller.supports"> <span class="icon" :class="classMap[seller.supports[0].type]"></span> <span class="text">{{seller.supports[0].description}}</span> </div> </div> <div class="supports_count" v-if="seller.supports" @click="showDetail(true)"> <span class="count">{{seller.supports.length}}个</span> <span class="icon-keyboard_arrow_right"></span> </div> </div> <div class="bulletin-wrapper" @click="showDetail(true)"> <span class="bulletin-title"></span> <span class="bulletin-text">{{seller.bulletin}}</span> <i class="icon-keyboard_arrow_right"></i> </div> <div class="background"> <img width="100%" height="100%"src="seller.avatar"> </div> <div class="detail" v-show="detailShow"> <div class="detail-wrapper"> <div class="detail-main clearfix"> <div class="name">{{seller.name}}</div> <div class="star-wrapper">star组件内容</div> <div class="title"> <div class="line"></div> <div class="text">优惠信息</div> <div class="line"></div> </div> <ul class="supports" v-if="seller.supports"> <li class="support" v-for="item in seller.supports"> <span class="icon" :class="classMap[item.type]"></span> <span class="text">{{item.description}}</span> </li> </ul> <div class="title"> <div class="line"></div> <div class="text">商家公告</div> <div class="line"></div> </div> <div class="content"> <p>{{seller.bulletin}}</p> </div> </div> </div> <div class="detail-close" @click="showDetail(false)"> <span class="icon-close"></span> </div> </div> </div> </template> [removed] export default{ props: { seller: { type: Object } }, data () { return { detailShow: false } }, created () { this.classMap = ["decrease", "discount", "guarantee", "invoice", "special"] }, methods: { showDetail (isShow) { this.detailShow = isShow } } } [removed]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值