对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 相关文章推荐
javascript parseInt与Number函数的区别
Jan 21 Javascript
让人期待的2011年度最佳 jQuery 插件分享
Mar 16 Javascript
JS实现新浪微博效果带遮罩层的弹出框代码
Oct 12 Javascript
JS实现图片的不间断连续滚动的简单实例
Jun 03 Javascript
TableSort.js表格排序插件使用方法详解
Feb 10 Javascript
Vue.js使用$.ajax和vue-resource实现OAuth的注册、登录、注销和API调用
May 10 Javascript
Vue.js鼠标悬浮更换图片功能
May 17 Javascript
微信小程序实现类似微信点击语音播放效果
Mar 30 Javascript
Vue.directive 实现元素scroll逻辑复用
Nov 29 Javascript
原生js实现随机点名
Jul 05 Javascript
vue-cli脚手架的.babelrc文件用法说明
Sep 11 Javascript
react国际化react-intl的使用
May 06 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/10/31 PHP
php检查函数必传参数是否存在的实例详解
2017/08/28 PHP
PHP注释语法规范与命名规范详解篇
2018/01/21 PHP
PHP Swoole异步读取、写入文件操作示例
2019/10/24 PHP
推荐:极酷右键菜单
2006/11/29 Javascript
jQuery 使用个人心得
2009/02/26 Javascript
javascript concat数组累加 示例
2009/09/03 Javascript
javascript 添加和移除函数的通用方法
2009/10/20 Javascript
能说明你的Javascript技术很烂的五个原因分析
2011/10/28 Javascript
解析瀑布流布局:JS+绝对定位的实现
2013/05/08 Javascript
jquery使用jxl插件导出excel示例
2014/04/14 Javascript
用js格式化金额可设置保留的小数位数
2014/05/09 Javascript
JavaScript获得当前网页来源页面(即上一页)的方法
2015/04/03 Javascript
深入浅析Nodejs的Http模块
2017/06/20 NodeJs
想用好React的你必须要知道的一些事情
2017/07/24 Javascript
Vue的实例、生命周期与Vue脚手架(vue-cli)实例详解
2017/12/27 Javascript
Nuxt.js踩坑总结分享
2018/01/18 Javascript
vue.js,ajax渲染页面的实例
2018/02/11 Javascript
js与jQuery实现获取table中的数据并拼成json字符串操作示例
2018/07/12 jQuery
浅谈Vue项目骨架屏注入实践
2019/08/05 Javascript
[48:31]DOTA2-DPC中国联赛 正赛 Dynasty vs XG BO3 第一场 2月2日
2021/03/11 DOTA
在pytorch中查看可训练参数的例子
2019/08/18 Python
关于pytorch多GPU训练实例与性能对比分析
2019/08/19 Python
Python任务自动化工具tox使用教程
2020/03/17 Python
详解Python直接赋值,深拷贝和浅拷贝
2020/07/09 Python
python Pexpect模块的使用
2020/12/25 Python
Spartoo瑞典:鞋子、包包和衣服
2018/09/15 全球购物
Shopee菲律宾:在线购买和出售
2019/11/25 全球购物
C#如何调用Word并打开一个Word文档
2013/05/08 面试题
大四学年自我鉴定
2013/11/13 职场文书
劳动之星获奖感言
2014/02/01 职场文书
老师的检讨书
2014/02/23 职场文书
干部作风整顿自我剖析材料和整改措施
2014/09/18 职场文书
财政局党的群众路线教育实践活动整改方案
2014/09/21 职场文书
2015小学语文教师个人工作总结
2015/05/20 职场文书
2016干部作风整顿心得体会
2016/01/22 职场文书