前端框架(MV*/ReactJS/VueJS/AngularJS)

fvuMV*(MVC、MVP、MVVM)

参考:http://blog.csdn.net/kevin_1025745654/article/details/45815109

MV*

已知:M(数据与数据逻辑,例如ajax、本地存储模块)
后端的MVC:M提供数据API;V 即模板,可以直接从M获取数据,C 即控制显示哪个模板

前端的MV*
MVC : V(视图逻辑,backbone里的V即View模块),C(控制视图的显示,backbone里的C即Router模块)

MVP : P(Presenter主持人,或者Passive View被动视图。负责响应V,调用M,更新V)。也可以把backbone的View理解为P。
MVP与MVC的差别:MVC里的V直接调用M的接口,MVP中则不能,得通过中间人P。

MVVM : V(模板),VM(视图模型,即数据与视图绑定,数据逻辑与视图逻辑绑定。普通的M的对外提供接口,VM则自动绑定视图。angularJS里VM即controller组件,里面的逻辑即数据逻辑,里面的scope即数据)
MVVM与MVP的差别:P要显式操作V,而VM与V双向绑定。
优势:代码结构更好(易维护,易打包),双向绑定和组件化(易开发,易协同)

MV*的区别在于V与M之间的流程,MVC中V直接调用M。MVP中V调用P,P再调用M。MVVM中V绑定VM,VM调用M。

单页应用

单页应用的路由模块的实现原理:
1、地址栏有锚值(有 # 号),刷新时浏览器发的请求不带 # 号及后面部分
2、通过location.hash 可以读写锚值(带#号)
3、改变锚值时会增加一条历史记录,但不会重载页面
4、window.onhashchange 监听锚值变化事件

5、另有history.pushState(状态对象, 新标题, 新url)方法和 window.onpopstate 事件。state与hash是两码事,pushState或回退的时候会触发onpopstate并传入状态对象

backbone自带路由模块,不能嵌套

angularjs 路由模块:https://github.com/angular-ui/ui-router ,可嵌套

reactjs路由模块:https://github.com/reactjs/react-router,可嵌套

组成部分:MV*、模块加载工具、路由、打包工具、UI组件

前端架构

1、无模块加载系统:html 引入一个js,js为一个自调用函数(闭包)
2、有模块加载系统:html 引入模块加载库 和 入口模块,入口模块中再去加载其他模块。这些模块可以是backbone的View、Angular的controller、React的component,也可以是完全自定义的闭包揭示模块、构造器模块
3、单页应用:在2的基础上监听 state 或 hash,重新渲染页面。

数据绑定

本质上是三种方式 1、(angularjs 1.x)监控数据变化,操作DOM;2、(react)整体更新虚拟DOM,diff,操作DOM;3、(vue)监控数据变化,局部更新虚拟DOM,diff,操作DOM

监控数据变化之脏检查

     angularJS 1.x采用,在controller或$apply中改变scope的属性,会自动调用$dist,进行脏检查。发生变化的属性,调用其$watcher。view中写ng-,会自动为其创建$watcher。

监控数据变化之对象监控
Object.observe:Chrome、ES7;Object.observe(model,function(changes){ // changes里包含变化信息}),支持的浏览器少

监控数据变化之属性访问器

1、Object.defineProperty:Vue采用,原生支持
Object.defineProperty(obj,‘name’,//三个参数分别为:对象、属性名、属性描述对象

    configurable: false,  //属性是否可配置
    enumerable: true,    //属性是否可枚举
    writable: true,      //属性是否可重写,不能与set/get同存
    value: null,         //属性的默认值,不能与set/get同存
    set: undefined,     // 重写器,这里可以写入数据绑定逻辑
    get: undefined      // 读取器
})
Object.getOwnPropertyDescriptor(obj, 'name');// 获取属性描述对象

2、非原生:backbone的model,属性只能通过get 和 set访问,通过listen给他们挂钩子。backbone只给了监控数据变化的方法,不会自动操作DOM,隐藏没有数据绑定

监控数据变化之代理

用Proxy实现:Vue 3

MVVM对比

   1、如何检查model变化:脏检查(angularjs) 、 访问器(vue、backbone)、整体重新渲染,无需检查(react)
   2、如何更新视图:串行直接操作DOM(angularjs)、通过虚拟DOM
   3、数据绑定:单项(react)还是双向(angularJS、Vue)
   4、代码分离:JS、HTML是否分离,JSX需要经过编译,不好调试和定位错误
   5、体积、社区、文档等
   6、组件

Reactjs + Redux

Reactjs

demo: https://github.com/saoraozhe3hao/reactDemo

react
React为此引入了虚拟DOM(Virtual DOM)的机制:
在浏览器端用Javascript实现了一套DOM API。基于React进行开发时所有的DOM构造都是通过虚拟DOM进行,每当数据变化时,React都会重新构建整个DOM树,
然后React将当前整个DOM树和上一次的DOM树进行对比,得到DOM结构的区别,然后仅仅将需要变化的部分进行实际的浏览器DOM更新

而且React能够批处理虚拟DOM的刷新,在一个事件循环(Event Loop)内的两次数据变化会被合并

Virtual DOM :维护在内存的类似于DOM树的JavaScript对象树,对变化批量更新至Web DOM树.虚拟DOM的节点记录了元素名称,属性名称和值
组件间的通信,父组件引用子组件,子组件回调父组件,EventEmitter(npm events 包)
在componentDidMount 里面可以元素 和 body、window 绑定原生事件,在componentWillUnmount里解除


JSX 转 JS
运行时转换:
打包时转换:
    安装命令行工具 npm install -g react-tools

转换:jsx --watch jsx/ js/

Redux

Demo: https://github.com/saoraozhe3hao/reduxDemo

Flux

Flux是Facebook提出的一种 前端应用架构体系,其中 react 作为它的View层。

Redux

Redux 是 Flux 体系的一个实现框架

Redux实现单项数据流

import { createStore } from 'redux' // Redux 的API :createStore

import reducer from './reducer' // reducer需要自己实现,输入 state 和 action,返回新的state

const store = createStore(reducer) // 全局只创建一个 store,用于存放数据。可加第二个参数,作为store初始数据

// store的API:getState,获取store快照

你可能感兴趣的:(前端框架,react.js,javascript,前端)