解决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制作弹窗提示窗口代码分享
Mar 02 Javascript
使用Javascript实现选择下拉菜单互移并排序
Feb 23 Javascript
Vue.js快速入门实例教程
Oct 15 Javascript
js实现加载更多功能实例
Oct 27 Javascript
AngularJS Toaster使用详解
Feb 24 Javascript
Vue生命周期示例详解
Apr 12 Javascript
Bootstrap Table快速完美搭建后台管理系统
Sep 20 Javascript
详解VueJs中的V-bind指令
May 03 Javascript
Vue在页面右上角实现可悬浮/隐藏的系统菜单
May 04 Javascript
JS加密插件CryptoJS实现的Base64加密示例
Aug 16 Javascript
javascript获取元素的计算样式
May 24 Javascript
JS实现手风琴特效
Nov 08 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
source.php查看源文件
2006/12/09 PHP
基于HTTP长连接的&quot;服务器推&quot;技术的php 简易聊天室
2009/10/31 PHP
php判断输入不超过mysql的varchar字段的长度范围
2011/06/24 PHP
有关phpmailer的详细介绍及使用方法
2013/01/28 PHP
如何在smarty中增加类似foreach的功能自动加载数据
2013/06/26 PHP
PHP中比较时间大小实例
2014/08/21 PHP
PHP中你应该知道的require()文件包含的正确用法
2015/06/12 PHP
thinkPHP3.x常量整理(预定义常量/路径常量/系统常量)
2016/05/20 PHP
Thinkphp3.2.3分页使用实例解析
2016/07/28 PHP
php动态读取数据清除最右边距的方法
2017/04/12 PHP
Extjs改变树节点的勾选状态点击按钮将复选框去掉
2013/11/14 Javascript
JQuery创建DOM节点的方法
2015/06/11 Javascript
javascript实现自动输出文本(打字特效)
2015/08/27 Javascript
详解JavaScript UTC时间转换方法
2016/01/07 Javascript
深入解析Backbone.js框架的依赖库Underscore.js的作用
2016/05/07 Javascript
酷! 不同风格页面布局幻灯片特效js实现
2021/02/19 Javascript
nodejs批量下载图片的实现方法
2017/05/19 NodeJs
基于vue的换肤功能的示例代码
2017/10/10 Javascript
AngularJS实现自定义指令及指令配置项的方法
2017/11/20 Javascript
JS排序算法之希尔排序与快速排序实现方法
2017/12/12 Javascript
解决uWSGI的编码问题详解
2017/03/24 Python
python3.7简单的爬虫实例详解
2019/07/08 Python
Python 写了个新型冠状病毒疫情传播模拟程序
2020/02/14 Python
Python中使用socks5设置全局代理的方法示例
2020/04/15 Python
Python bisect模块原理及常见实例
2020/06/17 Python
class类在python中获取金融数据的实例方法
2020/12/10 Python
用React加CSS3实现微信拆红包动画效果
2017/03/13 HTML / CSS
HTML5 Canvas像素处理使用接口介绍
2012/12/02 HTML / CSS
Gap工厂店:Gap Factory
2017/11/02 全球购物
美国最大的在线寄售和旧货店:Swap.com
2018/08/27 全球购物
车辆年审委托书范本
2014/09/18 职场文书
2014医学院领导班子对照检查材料思想汇报
2014/09/19 职场文书
财务会计实训报告
2014/11/05 职场文书
写给领导的感谢信
2015/01/22 职场文书
Pytorch 实现变量类型转换
2021/05/17 Python
Win10玩csgo闪退如何解决?Win10玩csgo闪退的解决方法
2022/07/23 数码科技