对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 相关文章推荐
IE、FF、Chrome浏览器中的JS差异介绍
Aug 13 Javascript
JS+CSS实现大气的黑色首页导航菜单效果代码
Sep 10 Javascript
JS组件Bootstrap实现弹出框和提示框效果代码
Dec 08 Javascript
js插件dropload上拉下滑加载数据实例解析
Jul 27 Javascript
js实现登录注册框手机号和验证码校验(前端部分)
Sep 28 Javascript
使用vue实现简单键盘的示例(支持移动端和pc端)
Dec 25 Javascript
还不懂递归?读完这篇文章保证你会懂
Jul 29 Javascript
vue 纯js监听滚动条到底部的实例讲解
Sep 03 Javascript
详解jQuery获取特殊属性的值以及设置内容
Nov 14 jQuery
详解Vue前端对axios的封装和使用
Apr 01 Javascript
element-ui table组件如何使用render属性的实现
Nov 04 Javascript
原生JS实现飞机大战小游戏
Jun 09 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
数组任意位置插入元素,删除特定元素的实例
2017/03/02 PHP
PHP实现微信申请退款功能
2018/10/01 PHP
Flash+XML滚动新闻代码 无图片 附源码下载
2007/11/22 Javascript
jQuery实现公告文字左右滚动的实例代码
2013/10/29 Javascript
document.execCommand()的用法小结
2014/01/08 Javascript
JavaScript数据结构和算法之图和图算法
2015/02/11 Javascript
jQuery获得子元素个数的方法
2015/04/14 Javascript
jquery获取css的color值返回RGB的方法
2015/12/18 Javascript
JS Array.slice 截取数组的实现方法
2016/01/02 Javascript
Bootstrap 粘页脚效果
2016/03/28 Javascript
JavaScript中自带的 reduce()方法使用示例详解
2016/08/10 Javascript
AngularJS实现一次监听多个值发生的变化
2016/08/31 Javascript
jquery css实现邮箱自动补全
2016/11/14 Javascript
使用BootStrap实现标签切换原理解析
2017/03/14 Javascript
微信小程序中的onLoad详解及简单实例
2017/04/05 Javascript
Vue.js实现文章评论和回复评论功能
2020/05/30 Javascript
浅谈vue的props,data,computed变化对组件更新的影响
2018/01/16 Javascript
javascript异步编程的六种方式总结
2019/05/17 Javascript
如何使用JavaScript检测空闲的浏览器选项卡
2020/05/28 Javascript
NodeJS模块Buffer原理及使用方法解析
2020/11/11 NodeJs
python动态加载变量示例分享
2014/02/17 Python
web.py 十分钟创建简易博客实现代码
2016/04/22 Python
python 查找字符串是否存在实例详解
2017/01/20 Python
python Flask实现restful api service
2017/12/04 Python
Python数据分析之双色球统计单个红和蓝球哪个比例高的方法
2018/02/03 Python
详解flask表单提交的两种方式
2018/07/21 Python
python单向链表的基本实现与使用方法【定义、遍历、添加、删除、查找等】
2019/10/24 Python
Centos7 下安装最新的python3.8
2019/10/28 Python
基于Python爬取搜狐证券股票过程解析
2020/11/18 Python
世界排名第一的运动鞋市场:Flight Club
2020/01/03 全球购物
设计师大码女装:11 Honoré
2020/05/03 全球购物
智乐游戏测试笔试题
2014/05/21 面试题
村主任“四风”问题个人对照检查材料思想汇报
2014/10/02 职场文书
机关作风建设剖析材料
2014/10/11 职场文书
2015年元旦主持词开场白
2014/12/14 职场文书
2016年优秀班主任先进事迹材料
2016/02/26 职场文书