对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 相关文章推荐
htm调用JS代码
Mar 15 Javascript
jquery蒙版控件实现代码
Dec 08 Javascript
js通过location.search来获取页面传来的参数
Sep 11 Javascript
浅谈javascript中执行环境(作用域)与作用域链
Dec 08 Javascript
微信小程序 弹幕功能简单实例
Feb 14 Javascript
浅谈js中function的参数默认值
Feb 20 Javascript
JavaScript数据结构之二叉查找树的定义与表示方法
Apr 12 Javascript
js 提取某()特殊字符串长度的实例
Dec 06 Javascript
vue父子组件的通信方法(实例详解)
Nov 10 Javascript
解决微信授权成功后点击按返回键出现空白页和报错的问题
Jun 08 Javascript
javascript全局自定义鼠标右键菜单
Dec 08 Javascript
vue使用echarts实现折线图
Mar 21 Vue.js
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
基于mysql的论坛(1)
2006/10/09 PHP
php Static关键字实用方法
2010/06/04 PHP
PHP无限分类(树形类)
2013/09/28 PHP
thinkphp连贯操作实例分析
2014/11/22 PHP
PHP中for循环与foreach的区别
2017/03/06 PHP
PHP INT类型在内存中占字节详解
2019/07/20 PHP
laravel5.6 框架邮件队列database驱动简单demo示例
2020/01/26 PHP
Json和Jsonp理论实例代码详解
2013/11/15 Javascript
javascript中expression的用法整理
2014/05/13 Javascript
JS中attr和prop属性的区别以及优先选择示例介绍
2014/06/30 Javascript
angularjs 处理多个异步请求方法汇总
2015/01/06 Javascript
跟我学习JScript的Bug与内存管理
2015/11/18 Javascript
使用JavaScript实现ajax的实例代码
2016/05/11 Javascript
JavaScript原生对象常用方法总结(推荐)
2016/05/13 Javascript
基于BootStrap环境写jQuery tabs插件
2016/07/12 Javascript
Vue 滚动行为的具体使用方法
2017/09/13 Javascript
详解Webstorm 新建.vue文件支持高亮vue语法和es6语法
2017/10/26 Javascript
深入理解Vue 单向数据流的原理
2017/11/09 Javascript
利用babel将es6语法转es5的简单示例
2017/12/01 Javascript
浅谈Vuejs中nextTick()异步更新队列源码解析
2017/12/31 Javascript
Vue组件之自定义事件的功能图解
2018/02/01 Javascript
详解如何提升JSON.stringify()的性能
2019/06/12 Javascript
vue.js实现备忘录demo
2019/06/26 Javascript
vue-cli history模式实现tomcat部署报404的解决方式
2019/09/06 Javascript
python从入门到精通(DAY 2)
2015/12/20 Python
Django Rest framework解析器和渲染器详解
2019/07/25 Python
Python的形参和实参使用方式
2019/12/24 Python
Lookfantastic西班牙官网:英国知名美妆购物网站
2018/06/13 全球购物
美国修容界大佬创建的个人美妆品牌:Kevyn Aucoin Beauty
2018/12/12 全球购物
SneakerStudio英国:最佳运动鞋商店
2019/05/22 全球购物
碧欧泉法国官网:Biotherm法国
2019/10/23 全球购物
介绍一下RMI的基本概念
2016/12/17 面试题
政府个人对照检查材料思想汇报
2014/10/08 职场文书
四风问题党员个人整改措施
2014/10/27 职场文书
通讯稿格式及范文
2015/07/22 职场文书
Python Pandas pandas.read_sql_query函数实例用法分析
2021/06/21 Python