最近在学习慕课网的课程:用vue.js做一个仿饿了么外卖APP的项目,现在也把流程啊什么的暂时先整理一下在这个博客上面。
当然,这个过程会有点长,不过确实能学到很多东西。
话不多说,马上开始吧。
注:当我们把用vue-cli脚手架搭建成的vue项目复制到其他地方时,要把node_modules目录删除,不然在其他地方无法执行cnpm run dev,这其中设计到路径的问题。删除之后要重新cnpm install。
1.项目介绍
选用当前最火的MVVM框架作为这个项目的技术栈
MVVM架构:
View和model通过viewModel来通信,但数据发生变化,viewmodel能够观察到这种数据的变化,然后通知到对应的视图做自动更新;当用户操作view视图,viewModel也能监听到视图的变化,然后通知数据做改动,实现了数据的双向绑定。
应用场景:
针对具有复杂交互逻辑的前端应用;
它可以提供基础的架构抽象;
可以通过AJAX数据持久化,保证前端用户体验
好处:
当前端和数据做一些操作的时候,可以通过AJAX请求对后端做数据持久化,不需要刷新整个页面,只需要改动DOM里需要改动的那部分数据。特别是移动端应用场景,刷新页面太昂贵,会重新加载很多资源,虽然有些会被缓存,但是页面的DOM,JS,CSS都会被页面重新解析一遍,因此移动端页面通常会做出SPA单页应用。
该项目只提取饿了么其中一个模块–商家模块进行开发
项目开发的一个完整流程
项目的需求分析–脚手架工具–数据mock–架构设计–代码编写–自测–编译打包等方面完全简讲述开发一个web的全流程,更好地了解一个项目从0到1的过程。
所需技术:
项目完整的开发流程;组件化、模块化的开发模式;使用Vue-cli脚手架初始化Vue.js项目;webpack的打包原理;模拟json后端数据,前后端分离开发;es6+eslint的开发方式。
第三方组件:
使用stylus编写模块化的CSS;使用vue-router开发单页应用;使用vue-resource与后端数据交互;在Vue.js框架里和第三方JS插件交互。
关于Vue的数据驱动思想
在数据驱动的思想里,数据驱动DOM变化,DOM是数据的一种自然映射。
如果没有MVVM框架,数据和视图是如何交互的?
比如通过AJAX从后端获取数据,会让视图改变,通过手动触发DOM的改变;再比如我们通过前端交互改变一些数据,为了让视图也发生变化,仍然需要通过手动触发进行DOM改变。手动改变DOM不仅繁琐,还容易出错。用了vue之后就可以省去操作DOM变化的步骤了。
在vue.js中,可以通过directives指令去对DOM做一层封装,当数据发生变化,会通知指令去修改对应的DOM。
Vue.js还会对操作做监听,当我们修改视图的时候,vue.js监听到这些变化,从而改变数据。
(↑上面两幅图红色区域代表正在执行该逻辑)
这样就实现了数据的双向绑定。
vue.js数据响应的原理
vue.js 是采用数据劫持结合发布者-订阅者模式的方式,通过Object.defineProperty()来劫持各个属性的setter,getter,在数据变动时发布消息给订阅者,触发相应的监听回调。
思路整理
已经了解到vue是通过数据劫持的方式来做数据绑定的,其中最核心的方法便是通过Object.defineProperty()来实现对属性的劫持,达到监听数据变动的目的,无疑这个方法是本文中最重要、最基础的内容之一,如果不熟悉defineProperty,猛戳→这里
整理了一下,要实现mvvm的双向绑定,就必须要实现以下几点:
1、实现一个数据监听器Observer,能够对数据对象的所有属性进行监听,如有变动可拿到最新值并通知订阅者
2、实现一个指令解析器Compile,对每个元素节点的指令进行扫描和解析,根据指令模板替换数据,以及绑定相应的更新函数
3、实现一个Watcher,作为连接Observer和Compile的桥梁,能够订阅并收到每个属性变动的通知,执行指令绑定的相应回调函数,从而更新视图
4、mvvm入口函数,整合以上三者

详情可查看: 剖析Vue原理&实现双向绑定MVVM (先把app做出来,回头来研究)
关于vue组件化的思想
目的:拓展HTML元素,封装可重用代码
如下图:左侧是一个页面,被拆分成小的区块,每个区块对应一个组件,组件可以嵌套,最终组合成为一个完整页面。
在vue.js中,每个组件都对应一个viewModel,最终生成一个viewModel的树:
组件化讲解
一个简单的HTML页面,以此为基础:
|
|
在Vue中,可以使用Vue.component()来创建和注册你的组件,这个构造器有两个参数:组件的名字;包含组件参数的对象。
接下来注册一个组件。创建并传入两个参数:组件的名字:’mine’;包含组件参数的对象:这个对象包含一个属性’template’。
|
|
现在你已经有了自己的一个组件了,你可以在你的应用的任何地方使用它。只要你调用它的唯一标识(就是组件名字),并用普通html标签的格式来书写,比如
|
|
利用template标签处理复杂组件
如果总是在vue.component()构造器里写html代码,复杂页面就不得了了。为了避免上面的这种情况,所以我们可以用template标签(注意属性和标签是不一样的)来达到我们的目的。我们可以在页面的任何地方,定义template标签,并在template标签内,写好我们的模板。
因为template标签在页面加载的时候不会渲染出来,只有在我们需要它的时候,这个标签内的内容才会被渲染出来。所以,你可以把template标签放在任何地方,并给它一个id,以便在组件注册的时候能够找到模板。
|
|
通过props向组件中传递数据
Vue是处理父组件向子组件中传递数据是通过props。
|
|
props可以是数组,也可以是对象。
那父组件那里又是怎么指派字段给子组件的呢?
只需要在对应的标签内写下属性就好
|
|