angular - 为什么不在 Angular 中直接与 DOM 交互?
问题描述
我已经读到,为了安全和性能,直接与 DOM 交互是不明智的。避免使用如下语法来选择元素。
const itemToManipulate = document.getElementById('example');
所以我看了一个很好的解决方法是使用ElementRef Directive。但是继续查找 Angular 文档建议不要这样做,因为紧耦合,什么是紧耦合?
我决定使用 ViewChild,就像这样......
@ViewChild('itemToManipulate') public item: ElementRef<any>;
这是否会导致我应该关注的任何不需要的行为(安全/性能方面),是否有与 DOM 交互的最佳实践,或者不应该在 Angular(6 / 7)中完成?
提前致谢。
解决方案
Angular 使用Lifecycle Hooks来确定组件的渲染和更新方式和时间:
组件的生命周期由 Angular 管理。
Angular 创建它,渲染它,创建和渲染它的子节点,当它的数据绑定属性发生变化时检查它,并在从 DOM 中删除它之前销毁它。
直接 DOM 访问或操作可能会破坏这些生命周期钩子,从而导致整个应用程序出现意外行为。
紧密耦合意味着组件(不是 Angular 组件,而是程序或系统的任何部分)彼此高度依赖。在 Angular 上下文中,更改组件的状态(例如变量)直接影响其渲染。因此,如果您直接使用 访问 DOM 元素ElementRef
,则无法在 Web Worker 中运行您的组件代码(例如,使用多线程)。
推荐阅读
- css - AngularJS如何在使用ng-style时启用彩色打印css?
- javascript - 过滤数组并从 JavaScript 中的数组中删除过滤后的数据
- api - AWS API 调用的标准响应时间是多少
- powershell - 最大拆分文件名(修改日期)
- svg - RTL 文本(希伯来语)在 SVG 路径上显示反转
- javascript - 将嵌套输入和标签添加到 div
- phone-call - 是否有新的官方 API 用于拒绝 Android 上的呼叫?
- java - RabbitMQ - 如何使用 Consumer.handleDelivery 处理进一步的消息处理
- java - 带有身份验证令牌的 Rest API
- c# - C# UWP 索引在 for 循环中超出范围