解决angular 使用原生拖拽页面卡顿及表单控件输入延迟问题


Posted in Javascript onApril 21, 2020

说明

之前有一个angular项目,页面上表单不算多,也就一百来个(这个不固定,有的地方多,有的地方少),但是再输入的时候会造成输入延迟,反应不灵敏,对用户体验极其不好。还有一个功能就是拖拽功能(原生,没有使用官方中的拖拽功能),从左边拖到右边区域,拖拽区域少的时候还挺流畅,但一旦有几百上千的时候反应极其的慢

原因(?)

上面两个问题其实都和angular的机制有关。一个双向绑定一个拖拽归根结底都是因为angular的变化检测

angular的双向绑定主要是脏数据检查,如果大量的检查,效率比较低。(双向绑定时向zone挂载一个异步函数,对数据改变是做处理,及时将变化反馈显示在页面上)可能就会输入延迟

拖拽(也是向zone挂载异步函数)则是因为angular对每个可移动像素的元素进行检测而且还可能涉及对dom的操作,当拖拽区域数量较为多时,绑定的函数就越多,angular需要检测的元素区域就越来越多,处理起来就越力不从心(即使元素隐藏也不代表不会进行变化检测)

解决

  1. 对于双向绑定造成的输入延迟,停止使用双向绑定,改用单向绑定
  2. 拖拽过程angular一直检测页面变化,所以页面卡顿。我们需要做的就是设置对某些操作不跟踪变化
this.ngZone.runOutsideAngular(() => {
  this.dragEnter = this.rd.listen(spanDom, 'dragenter', this.dragenterHandler.bind(this));
  this.dragOver = this.rd.listen(spanDom, 'dragover', (e) => {
   e.preventDefault();
  });
 this.dragLeave = this.rd.listen(spanDom, 'dragleave', this.dragLeaveHandle.bind(this));
});
this.dragDrop = this.rd.listen(spanDom, 'drop', this.dropHandler.bind(this));

对频繁的操作(如dragover)不去触发变更检测。使用NgZone中的runOutsideAngular方法,angular不会对里面的变化进行跟踪。

ps:下面看下Angular 元素拖拽

  1. 拖动元素到指定区域
  2. 拖放的同时传递数据

1. 安装 ng2-drag-drop

npm install ng2-drag-drop --save

2. 模板中配置可拖拽元素

// drag.component.html
 <div>
  <a href="javascript:;" rel="external nofollow" *ngFor="let item of sysData" draggable [dragData]="item" [dragScope]="'system'">{{ item.name }}</a>
 </div>
  • draggable - 表明此元素时可拖拽的
  • [dragData] = 'item' - 在拖动过程中将item数据从draggable到droppable
  • [dragScope]="'system'" - 拖拽范围,和第三步[dropScope]="'system'"相对应;

3. 模板中配置拖拽元素所拖拽的目的地

// drag.component.ts
 <div droppable (onDrop)="onItemDrop($event)" [dropScope]="'system'"></div>
  • droppable - 第二步中拖拽的元素都将拖拽到有droppable指令的元素内;
  • (onDrop) - 当拖拽元素至此区域内后(鼠标释放后),触发onItemDrop方法,其中$event就是第二步中[dragData] = 'item'的item参数
  • [dropScope]="'system'" - 和第二步的[dragScope]="'system'"对应,[dragScope]="'system'"的拖拽元素只能拖拽到 [dropScope]="'system'"元素内;

4. ts文件

// drag.component.ts
export class DragComponent {

 const sysData = [
  {id: '1', name: '拖动元素1'},
  {id: '2', name: '拖动元素2'},
  {id: '3', name: '拖动元素3'},
  {id: '4', name: '拖动元素4'}
 ];

}

onItemDrop(e: any) {
 // data为拖拽时传递的数据 - item
 const data = e.dragData;
}

总结

到此这篇关于angular 中使用原生拖拽页面卡顿,表单控件输入延迟的文章就介绍到这了,更多相关angular 中使用原生拖拽页面卡顿,表单控件输入延迟内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Javascript 相关文章推荐
使用jquery hover事件实现表格的隔行换色功能示例
Sep 03 Javascript
a标签的href与onclick事件的区别详解
Nov 12 Javascript
jQuery+CSS3折叠卡片式下拉列表框实现效果
Nov 02 Javascript
JavaScript实现iframe自动高度调整和不同主域名跨域
Feb 27 Javascript
浅析script标签中的defer与async属性
Nov 30 Javascript
JavaScrpt的面向对象全面解析
May 09 Javascript
ReactNative 之FlatList使用及踩坑封装总结
Nov 29 Javascript
图文介绍Vue父组件向子组件传值
Feb 17 Javascript
JS扩展String.prototype.format字符串拼接的功能
Mar 09 Javascript
vue+axios+mock.js环境搭建的方法步骤
Aug 28 Javascript
Bootstrap Paginator+PageHelper实现分页效果
Dec 29 Javascript
JS+CSS+HTML实现“代码雨”类似黑客帝国文字下落效果
Mar 17 Javascript
javascript设计模式 ? 策略模式原理与用法实例分析
Apr 21 #Javascript
javascript设计模式 ? 备忘录模式原理与用法实例分析
Apr 21 #Javascript
VUE+elementui组件在table-cell单元格中绘制微型echarts图
Apr 20 #Javascript
Vue的全局过滤器和私有过滤器的实现
Apr 20 #Javascript
深入浅析JavaScript中的in关键字和for-in循环
Apr 20 #Javascript
vue实现购物车功能(商品分类)
Apr 20 #Javascript
vue实现淘宝购物车功能
Apr 20 #Javascript
You might like
PHP生成随机用户名和密码的实现代码
2013/02/27 PHP
php url路由入门实例
2014/04/23 PHP
PHP安装memcached扩展笔记
2015/05/28 PHP
php实现Mysql简易操作类
2015/10/11 PHP
php session的锁和并发
2016/01/22 PHP
[原创]php简单防盗链验证实现方法
2016/07/09 PHP
PHP使用数组实现矩阵数学运算的方法示例
2017/05/29 PHP
动态加载js文件 document.createElement
2006/10/14 Javascript
不错的JS中变量相关的细节分析
2007/08/13 Javascript
js螺旋动画效果的具体实例
2013/11/15 Javascript
js动态删除div元素基本思路及实现代码
2014/05/08 Javascript
jquery实现适用于门户站的导航下拉菜单效果代码
2015/08/24 Javascript
JS实现的3D拖拽翻页效果代码
2015/10/31 Javascript
学习JavaScript设计模式之责任链模式
2016/01/18 Javascript
基于BootStrap实现简洁注册界面
2017/07/20 Javascript
vue、react等单页面项目部署到服务器的方法及vue和react的区别
2018/09/29 Javascript
js实现详情页放大镜效果
2020/10/28 Javascript
跟老齐学Python之有容乃大的list(2)
2014/09/15 Python
pandas中的DataFrame按指定顺序输出所有列的方法
2018/04/10 Python
Python实现随机漫步功能
2018/07/09 Python
解决torch.autograd.backward中的参数问题
2020/01/07 Python
TensorFlow基本的常量、变量和运算操作详解
2020/02/03 Python
python模拟实现分发扑克牌
2020/04/22 Python
python“静态”变量、实例变量与本地变量的声明示例
2020/11/13 Python
中国领先的专业家电网购平台:国美在线
2016/12/25 全球购物
英国手机零售商:Carphone Warehouse
2018/06/06 全球购物
倩碧英国官网:Clinique英国
2018/08/10 全球购物
主持人婚宴答谢词
2014/01/28 职场文书
地球一小时倡议书
2014/04/15 职场文书
四风问题查摆剖析材料
2014/10/11 职场文书
泸县召开党的群众路线教育实践活动总结大会新闻稿
2014/10/21 职场文书
2014年租房协议书范本
2014/10/30 职场文书
2015年外贸业务员工作总结范文
2015/05/23 职场文书
2015国庆节66周年标语
2015/07/30 职场文书
《工作是最好的修行》读后感3篇
2019/12/13 职场文书
剑指Offer之Java算法习题精讲二叉树的构造和遍历
2022/03/21 Java/Android