解决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 this 深入理解
Jul 30 Javascript
Aptana调试javascript图解教程
Nov 30 Javascript
JS对img进行操作(换图片/切图/轮换/停止)
Apr 17 Javascript
jQuery的each终止或跳过示例代码
Dec 12 Javascript
js中小数转换整数的方法
Jan 26 Javascript
javascript设置连续两次点击按钮时间间隔的方法
Oct 28 Javascript
JavaScript资源预加载组件和滑屏组件的使用推荐
Mar 10 Javascript
Vue Ajax跨域请求实例详解
Jun 20 Javascript
JS获取当前地理位置的方法
Oct 25 Javascript
Vue 2.0学习笔记之使用$refs访问Vue中的DOM
Dec 19 Javascript
微信小程序checkbox组件使用详解
Jan 31 Javascript
使用vue-cli3 创建vue项目并配置VS Code 自动代码格式化 vue语法高亮问题
May 14 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数组保存文本与文本反编成数组实例
2014/11/13 PHP
PHP中key和current,next的联合运用实例分析
2016/03/29 PHP
基于Laravel实现的用户动态模块开发
2017/09/21 PHP
YII2框架中使用RBAC对模块,控制器,方法的权限控制及规则的使用示例
2020/03/18 PHP
Easy.Ajax 部分源代码 支持文件上传功能, 兼容所有主流浏览器
2011/02/24 Javascript
纯js分页代码(简洁实用)
2013/11/05 Javascript
两个多选select(multiple左右)添加、删除选项和取值实例
2014/05/12 Javascript
js创建表单元素并使用submit进行提交
2014/08/14 Javascript
jQuery与getJson结合的用法实例
2015/08/07 Javascript
Select下拉框模糊查询功能实现代码
2016/07/22 Javascript
解决canvas画布使用fillRect()时高度出现双倍效果的问题
2017/08/03 Javascript
JavaScript实现构造json数组的方法分析
2018/08/17 Javascript
原生JS实现简单的倒计时功能示例
2018/08/30 Javascript
layui异步加载table表中某一列数据的例子
2019/09/16 Javascript
layui+SSM的数据表的增删改实例(利用弹框添加、修改)
2019/09/27 Javascript
[38:38]完美世界DOTA2联赛PWL S3 access vs Rebirth 第二场 12.17
2020/12/18 DOTA
python3 与python2 异常处理的区别与联系
2016/06/19 Python
Django 前后台的数据传递的方法
2017/08/08 Python
Python实现聊天机器人的示例代码
2018/07/09 Python
Python如何发布程序的详细教程
2018/10/09 Python
Python 3 实现定义跨模块的全局变量和使用教程
2019/07/07 Python
pandas 中对特征进行硬编码和onehot编码的实现
2019/12/20 Python
在Sublime Editor中配置Python环境的详细教程
2020/05/03 Python
解析python 中/ 和 % 和 //(地板除)
2020/06/28 Python
使用Python实现NBA球员数据查询小程序功能
2020/11/09 Python
使用HTML5 Geolocation实现一个距离追踪器
2018/04/09 HTML / CSS
美国折扣宠物药房:Total Pet Supply
2018/05/27 全球购物
日本最大的旅游网站:Rakuten Travel(乐天旅游)
2018/08/02 全球购物
香港现代设计家具品牌:Ziinlife Furniture
2018/11/13 全球购物
材料加工硕士生求职信
2013/10/10 职场文书
入党申请人的自我鉴定
2013/12/01 职场文书
商场促销活动策划方案
2014/08/18 职场文书
辞职信如何写
2015/02/27 职场文书
2015教师个人工作总结范文
2015/03/31 职场文书
五星级酒店宣传口号
2015/12/25 职场文书
Vue Element UI自定义描述列表组件
2021/05/18 Vue.js