解决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 相关文章推荐
JavaScript 应用类库代码
Jun 02 Javascript
学习ExtJS Window常用方法
Oct 07 Javascript
Javascript匿名函数的一种应用 代码封装
Jun 27 Javascript
js,jQuery 排序的实现代码,网页标签排序的实现,标签排序
Apr 27 Javascript
使用jquery实现IE下按backspace相当于返回操作
Mar 18 Javascript
AngularJS使用指令增强标准表单元素功能
Jul 01 Javascript
基于MVC5和Bootstrap的jQuery TreeView树形控件(一)之数据支持json字符串、list集合
Aug 11 Javascript
详解jQuery简单的表格应用
Dec 16 Javascript
jQuery模拟窗口抖动效果
Mar 15 Javascript
小程序开发中如何使用async-await并封装公共异步请求的方法
Jan 20 Javascript
微信小程序数据统计和错误统计的实现方法
Jun 26 Javascript
在Vue中使用HOC模式的实现
Aug 23 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类的自动加载机制实现方法分析
2019/01/10 PHP
解决AJAX中跨域访问出现'没有权限'的错误
2008/08/20 Javascript
JS 进度条效果实现代码整理
2011/05/21 Javascript
js Function类型
2011/12/04 Javascript
jQuery中DOM树操作之复制元素的方法
2015/01/23 Javascript
JavaScript获得当前网页来源页面(即上一页)的方法
2015/04/03 Javascript
再JavaScript的jQuery库中编写动画效果的指南
2015/08/13 Javascript
DOM操作原生js 的bug,使用jQuery 可以消除的解决方法
2016/09/04 Javascript
原生js实现下拉框功能(支持键盘事件)
2017/01/13 Javascript
NW.js 简介与使用方法
2018/02/01 Javascript
Postman模拟发送带token的请求方法
2018/03/31 Javascript
vue开发中遇到的问题总结
2020/04/07 Javascript
jQuery实现简单日历效果
2020/07/05 jQuery
[51:07]VGJ.S vs Pain 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/20 DOTA
python使用PyGame播放Midi和Mp3文件的方法
2015/04/24 Python
python逐行读写txt文件的实例讲解
2018/04/03 Python
解决Django的request.POST获取不到内容的问题
2018/05/28 Python
python实现图片筛选程序
2018/10/24 Python
Python正则匹配判断手机号是否合法的方法
2020/12/09 Python
python3人脸识别的两种方法
2019/04/25 Python
关于python字符串方法分类详解
2019/08/20 Python
Python代码注释规范代码实例解析
2020/08/14 Python
python 如何调用 dubbo 接口
2020/09/24 Python
美国最大网上鞋店:Zappos
2016/07/25 全球购物
W Concept美国:精选全球独立设计师
2017/02/22 全球购物
极简鞋类,赤脚的感觉:Lems Shoes
2019/08/06 全球购物
会计主管岗位职责
2014/01/03 职场文书
创业计划书的写作技巧及要点
2014/01/31 职场文书
土建专业大学生自荐信范文
2014/04/09 职场文书
新闻编辑求职信
2014/07/13 职场文书
党的生日活动方案
2014/08/15 职场文书
师德师风建设整改措施思想汇报
2014/10/11 职场文书
2015年元宵节活动总结
2015/02/06 职场文书
幼儿园安全教育月活动总结
2015/05/08 职场文书
企业转让协议书(范文2篇)
2019/08/15 职场文书
分析Java中Map的遍历性能问题
2021/06/26 Java/Android