对Angular中单向数据流的深入理解


Posted in Javascript onMarch 31, 2018

变更检测

Angular 中,数据是由顶部根节点流向最后的叶子节点,整个数据流是单向,构成一颗单向树。

对Angular中单向数据流的深入理解

Angular 认为所有的异步操作都有可能会引起模型的变化,引起数据模型发生变化的事件源有:

  • Events:click, mouseover, keyup ...
  • Timers:setInterval、setTimeout
  • XHRs:Ajax(GET、POST ...)

Angular 封装 Zone来拦截跟踪异步,一旦发现异步行为,Angular 就会进行变更检测。

因为数据流是单向的,组件的数据来源只能由父组件进行传入,所以 Angular 会从上到下,广度遍历检测组件,只要父组件检测完毕就能继续检测子组件。而相比 angularjs,双向、混乱的数据流方向,会导致重复变更检测重复多次,直到数据稳定,可能会导致性能问题,或者出现数据和视图处于不一致的状态,即渲染过程完成后的视图不能反映数据的实际状态。

渲染输出

当检测到数据模型变化时,组件需要重新渲染,Angular将运行它的 DOM 生成函数,该函数会生成一个新的 DOM数据结构,该结构对应于组件 View 的新版本。

Angular 在渲染过程中,评估模板表达式并在整个组件树中调用生命周期钩子。

注意:绿色标志会多次调用

对Angular中单向数据流的深入理解

从生命调用周期来看(绿色有向线),ngAfterViewChecked 标示该组件及子组件视图输出完成。看以下一例子:

import {Component, AfterViewChecked} from '@angular/core';
import {Course} from "./course";
@Component({
 selector: 'app-root',
 template: `
 <div class="course">
  <span class="description">{{course.description}}</span>
 </div>
`})
export class AppComponent implements AfterViewChecked {
 course: Course = {
  id: 1,
  description: "Angular For Beginners"
 };

 ngAfterViewChecked() {
  this.course.description += Math.random();
 }
}

上述代码会在Angular变更检测周期发生错误。组件已经完成 DOM 数据结构输出,我们还在该组件 ngAfterViewChecked() 方法中修改了数据状态。这样导致了视图渲染后,数据跟视图状态不一致。

数据从组件类流向表示它们的DOM数据结构,生成这些DOM数据结构的行为本身就不会导致数据的进一步修改。但我们在 ngAfterView 生命周期发生修改数据行为,Angular 的“单向数据流”规则禁止在一个视图已经被组合好之后再更新视图。
这意味着数据模型到视图过程是单向,不可在视图后发生数据流发生改变。

总结

从变更检测过程以及渲染输出过程中,可以总结出:

单向数据流指的是从组件树的顶部到底部渲染扫描过程中应用程序数据流转到由渲染过程生成的输出DOM数据结构的流程。

好了,以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

Javascript 相关文章推荐
firefo xml 读写实现js代码
Jun 11 Javascript
javascript实现禁止右键和F12查看源代码
Dec 26 Javascript
jQuery中live()方法用法实例
Jan 19 Javascript
Jquery日期选择datepicker插件用法实例分析
Jun 08 Javascript
AngularJS 使用ng-repeat报错 [ngRepeat:dupes]
Jan 19 Javascript
bootstrap vue.js实现tab效果
Feb 07 Javascript
想用好React的你必须要知道的一些事情
Jul 24 Javascript
swiper自定义分页器使用方法详解
Sep 14 Javascript
通过一次报错详细谈谈Point事件
May 17 Javascript
Vue2.0学习系列之项目上线的方法步骤(图文)
Sep 25 Javascript
javascript数组常见操作方法实例总结【连接、添加、删除、去重、排序等】
Jun 13 Javascript
TypeScript类型声明书写详解
Aug 28 Javascript
jQuery中复合选择器简单用法示例
Mar 31 #jQuery
jQuery中内容过滤器简单用法示例
Mar 31 #jQuery
jQuery中可见性过滤器简单用法示例
Mar 31 #jQuery
Postman模拟发送带token的请求方法
Mar 31 #Javascript
浅谈Postman解决token传参的问题
Mar 31 #Javascript
postman+json+springmvc测试批量添加实例
Mar 31 #Javascript
JS和Canvas实现图片的预览压缩和上传功能
Mar 30 #Javascript
You might like
PHP采用自定义函数实现遍历目录下所有文件的方法
2014/08/19 PHP
破除一些网站复制、右键限制
2006/11/04 Javascript
为radio类型的INPUT添加客户端脚本(附加实现JS来禁用onClick事件思路代码)
2010/11/11 Javascript
jQuery 源码分析笔记(3) Deferred机制
2011/06/19 Javascript
Node.js 的异步 IO 性能探讨
2014/10/08 Javascript
jQuery插件扩展extend的简单实现原理
2016/06/24 Javascript
vue.js路由跳转详解
2017/08/28 Javascript
BootStrap下的弹出框加载select2框架失败的解决方法
2017/08/31 Javascript
jQuery实现切换隐藏与显示同时切换图标功能
2017/10/29 jQuery
JavaScript 数组去重并统计重复元素出现的次数实例
2017/12/14 Javascript
vue2.0 兄弟组件(平级)通讯的实现代码
2018/01/15 Javascript
JS实现的文字间歇循环滚动效果完整示例
2018/02/13 Javascript
vue利用axios来完成数据的交互
2018/03/23 Javascript
微信小程序实现笑脸评分功能
2018/11/03 Javascript
Python列表(list)、字典(dict)、字符串(string)基本操作小结
2014/11/28 Python
微信小程序跳一跳游戏 python脚本跳一跳刷高分技巧
2018/01/04 Python
python 反编译exe文件为py文件的实例代码
2019/06/27 Python
python使用pandas处理excel文件转为csv文件的方法示例
2019/07/18 Python
python二维键值数组生成转json的例子
2019/12/06 Python
python map比for循环快在哪
2020/09/21 Python
HTML5 DeviceOrientation实现手机网站摇一摇功能代码实例
2015/04/24 HTML / CSS
使用phonegap操作数据库的实现方法
2017/03/31 HTML / CSS
阿联酋航空假期:Emirates Holidays
2018/03/20 全球购物
初一体育教学反思
2014/01/29 职场文书
群众路线剖析材料
2014/02/02 职场文书
渔夫的故事教学反思
2014/02/14 职场文书
学校门卫岗位职责
2014/03/16 职场文书
党的群众路线教育实践方案
2014/05/11 职场文书
公司活动总结范文
2014/07/01 职场文书
党的群众路线对照检查材料
2014/09/22 职场文书
党的群众路线教育实践活动对照检查材料思想汇报(党员篇)
2014/09/25 职场文书
六年级学生期末评语
2014/12/26 职场文书
2015年度质量工作总结报告
2015/04/27 职场文书
2015年校医个人工作总结
2015/07/24 职场文书
《棉鞋里的阳光》教学反思
2016/02/20 职场文书
PyTorch 如何检查模型梯度是否可导
2021/06/05 Python