当前位置: 首页 > news >正文

专门做淘宝优惠券的网站网站建设软件

专门做淘宝优惠券的网站,网站建设软件,网站建设的目的和意义,建设外贸网站公司avalon的指令在上一节已经全部介绍完毕,当然有的语焉不详,如ms-js。本节主要讲述一下我对这方面的思考与探索。 MVVM的成功很大一语分是来自于其指令,或叫绑定。让操作视图的功能交由形形式式的指令来代劳。VM,成了一个大管家。它…

avalon的指令在上一节已经全部介绍完毕,当然有的语焉不详,如ms-js。本节主要讲述一下我对这方面的思考与探索。

MVVM的成功很大一语分是来自于其指令,或叫绑定。让操作视图的功能交由形形式式的指令来代劳。VM,成了一个大管家。它只一个反射体。我们对它的操作,直接影响到视图。因此俗称“操作数据即操作视图”!至于它是怎么影响视图,avalon视其版本的不同,也有不同的解法。如果抛开avalon,纵观世上所有MVVM框架,大抵有如下几种方式

  1. 函数wrapper:将原数据对象重新改造,所有属性都变成一个函数,有参数时就是赋值,进行视图同步与回调派发,没有参数时就取值,进行依赖收集。如knockout.js。

  2. 上帝getter,setter: 将原数据对象重新包装,但对数据的操作必须经过统一的set,get方法。在set方法进行视图同步与回调派发,没有参数时进行依赖收集。如reactive.js。如果放松要求,react也是这种方式,它使用setState进行视图同步。但它们依赖收集的过程。

  3. 函数编译及脏检测:将VM放到一个函数体内,取toString重新编译,内部是第一种方式。如angular.

  4. Object.defineProperty属性劫持:前三种的用户体验非常糟,于是有了这种方式,最初我是从emberjs中学来的。avalon,vue及其他后来的MVVM框架都是使用这种方式。在赋值时执行内部的setter方法,进行视图同步与回调派发,在取值时执行内部的getter方法,进行依赖收集。

  5. Object.observe对象监控: 这个API很短命,因此没几个MVVM框架用上它。由于无法进行依赖收集,需要别辟蹊径!

  6. Proxy对象监控:Object.observe对用户的行为监控是很弱的,并且是异步的,不够友好。于是有了这个新宠物。但这其实也不算新宠,firefox4就存在了。它能对数据赋值,取值,遍历,删除等各种行为都能监控到,了解Object.defineProperty 不能监控新属性的难题。在avalon2 中,就有一分支使用它实现。avalon2一共使用了VBScript, Object.defineProperty, Proxy实现vm。并且它没有进行依赖数据,而是将整个视图编译成一个大函数,每次数据变动,都重新执行这个函数,产生虚拟DOM,前后虚拟DOM进行diff,最后全量更新。这思路从react.js学来的。

上面说了,既然使用编译整个视图成模板函数这一手段,我们就尽量让这函数轻量化。位于这视图上的所有指设也要简化,方便在对应位置上代入VM中的属性。在avalon1及其他MVVM框架,都是使用动态依赖收集方式来推断指令中的某个单词是否为vm中的某个属性,这性能耗损比较严重。在avalon2直接让用户在属性名前加上 @ 符号,人工优化这步骤了。此外,指令属性值的设计原则也很明确,就是方便转换一个函数,返回对象或对象数组(如ms-attr,ms-css,ms-widget,ms-effect,ms-class,ms-hover,ms-active,ms-for),少量的返回布尔或字符串等直接可用于JS 语句的字面量。除了ms-for与过滤器,没有其他特殊语法。

图片描述
除了ms-duplex,ms-on,原则上不再出来ms-xxx-yyy这样的指令。ms-后面只跟一个单词就够了,不用再加-及其他单词。

各种指令的优先级如下:
ms-for, ms-widget, ms-effect, ms-if…………其他指令(按指令名的charCodeAt排序)…………ms-duplex!

ms-duplex是最后,因此再不用担心它与其他指令冲突的问题。

指令的更新时机有两个,一个是位于此标签之间的所有孩子执行之前,一个是位于此标签之间的所有孩子执行之后。亦即change, afterChagne列队。有兴趣的话,可以阅览这里的源码。

想自定义指令,可以使用avalon.directive方法,第一个为指令名,第二个是定义体,里面至少有parse, diff, update三个方法。自己参看css指令,编写指令吧。

//css指令var update = require('./_update')avalon.directive('css', {parse: function(cur, pre, binding) {cur[binding.name] = avalon.parseExpr(binding)},diff: function (copy, src, name) {var a = copy[name]var p = src[name]if (Object(a) === a) {a = a.$model || a//安全的遍历VBscriptif (Array.isArray(a)) {//转换成对象a = avalon.mix.apply({}, a)}if (typeof p !== 'object') {//如果一开始为空src.changeStyle = src[name] = a} else {var patch = {}var hasChange = falsefor (var i in a) {//diff差异点if (a[i] !== p[i]) {hasChange = truepatch[i] = a[i]}}if (hasChange) {src[name] = asrc.changeStyle = patch}}if (src.changeStyle) {update(src, this.update)}}delete copy[name]//释放内存},update: function (dom, vdom) {var change = vdom.changeStylevar wrap = avalon(dom)for (var name in change) {wrap.css(name, change[name])}delete vdom.changeStyle}
})

里面的parse(cur, pre, binding)方法是用于创建虚拟DOM, cur是通过vm.$render方法生成的新虚拟节点,pre是之前的虚拟节点,binding是当前指令抽象生成的绑定对象。

里面的diff(copy, src, name)方法是用来比较前后两个虚拟DOM。copy是新虚拟节点,src是之前的虚拟DOM,name为指令的名字。当你用各种方式比较出这两个虚拟DOM有差异,那你就可以使用require('./_update')这个方法执行更新,更新方式为指令的update方法。

2.1.0后,刷新机制有点改动,两个节点比较出差异后立即更新真实DOM, 不像过去那样全部比较再全量更新。

里面的update(dom,vnode,parent)方法是用来更新真实元素的。

最后你可以在avalon.directives对象中指到所有指令的定义。你也可以在vm.$element.vtree中看到你生成的虚拟DOM树。

既然avalon的指令已经全部介绍完了,因此大家现在可以直接使用avalon2了!

http://www.lbrq.cn/news/2579851.html

相关文章:

  • 备案可以不关闭网站吗今日热搜新闻头条
  • 广陵区建设局网站网站建设开发公司
  • 怎么做网站背景图片青岛seo关键词排名
  • 北京网站报价网站多少钱
  • wordpress 主页网站页面关键词优化
  • 仪征做网站seo优化几个关键词
  • 做网站官网百度首页纯净版
  • 南宁网站制作建设seo站长助手
  • 苏州哪家做网站惠州搜索引擎优化
  • 临清网站制作公司输入关键词自动生成标题
  • 购物网站做推广什么叫外链
  • 沧州公司做网站企业推广是什么职业
  • 哪家小吃培训网站做的最好关键词搜索引擎工具爱站
  • 网络运营是干什么的网站推广优化外包便宜
  • 学网站论坛宁德市属于哪个省份
  • 网站建设使用的语言网络广告有哪些
  • 怎样做网站手机客户端淘宝流量网站
  • 做宣传单赚钱的网站专门做推广的公司
  • 动态网站开发的架构网易企业邮箱
  • ps做的网站保存不了jpgit学校培训学校哪个好
  • 建站行业突破网页界面设计
  • 三亚做网站seo手机关键词排行推广
  • 常州建站软件全球网站排名
  • b2c电子商城网站建设网站提交收录入口
  • 早期做的网站支持现在的网速吗百度推广系统营销平台
  • 那个网站做稻草交易网站域名查询网
  • 精通网站建设 百度云怎么做网页
  • 保定网站推广费用营销策略ppt模板
  • 如何免费做网站网页seo网络推广排名
  • 用tomcat做网站目录适合口碑营销的产品
  • RAWINPUT避坑指南(涉及GetRawInputData/GetRawInputBuffer)
  • python:以支持向量机(SVM)为例,通过调整正则化参数C和核函数类型来控制欠拟合和过拟合
  • 2025 年 VSCode 插件离线下载硬核攻略
  • C语言字符函数和字符串函数全解析:从使用到模拟实现
  • 开箱即用的Next.js SSR企业级开发模板
  • Python 项目路径配置完全指南