解决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 相关文章推荐
Asp.net下利用Jquery Ajax实现用户注册检测(验证用户名是否存)
Sep 12 Javascript
初窥JQuery-Jquery简介 入门了解篇
Nov 25 Javascript
Boostrap入门准备之border box
May 09 Javascript
jQuery 常用代码集锦(必看篇)
May 16 Javascript
移动端横屏的JS代码(beta)
May 16 Javascript
jQuery得到多个值只能用取Class ,不能用取ID的方法
Dec 04 Javascript
JS实现电商放大镜效果
Aug 24 Javascript
vue 数组和对象不能直接赋值情况和解决方法(推荐)
Oct 25 Javascript
浅谈Vuejs中nextTick()异步更新队列源码解析
Dec 31 Javascript
vue基于mint-ui实现城市选择三级联动
Jun 30 Javascript
Element UI 自定义正则表达式验证方法
Sep 04 Javascript
微信小程序之裁剪图片成圆形的实现代码
Oct 11 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 文章采集正则代码
2009/12/28 PHP
sql注入与转义的php函数代码
2013/06/17 PHP
php截取中文字符串不乱码的方法
2013/12/25 PHP
Yii2框架中使用PHPExcel导出Excel文件的示例
2017/08/09 PHP
搭建自己的PHP MVC框架详解
2017/08/16 PHP
php 与 nginx 的处理方式及nginx与php-fpm通信的两种方式
2018/09/28 PHP
基于JQuery.timer插件实现一个计时器
2010/04/25 Javascript
JavaScript和ActionScript的交互实现代码
2010/08/01 Javascript
利用javascript解决图片缩放及其优化的代码
2012/05/23 Javascript
JavaScript插件化开发教程 (一)
2015/01/27 Javascript
JavaScript中使用指数方法Math.exp()的简介
2015/06/15 Javascript
jQuery实现网站添加高亮突出显示效果的方法
2015/06/26 Javascript
jquery.cookie.js用法实例详解
2015/12/25 Javascript
Java  Spring 事务回滚详解
2016/10/17 Javascript
vue-resourse将json数据输出实例
2017/03/08 Javascript
Js自定义多选框效果的实例代码
2017/07/05 Javascript
基于JavaScript实现无缝滚动效果
2017/07/21 Javascript
angularjs利用directive实现移动端自定义软键盘的示例
2017/09/20 Javascript
Vue.js中的computed工作原理
2018/03/22 Javascript
Postman的下载及安装教程详解
2018/10/16 Javascript
基于vue通用表单解决方案的思考与分析
2019/03/16 Javascript
jQuery利用cookie 实现本地收藏功能(不重复无需多次命名)
2019/11/07 jQuery
json_decode 索引为数字时自动排序问题解决方法
2020/03/28 Javascript
vue 修改 data 数据问题并实时显示操作
2020/09/07 Javascript
在vue项目中引用Antv G2,以饼图为例讲解
2020/10/28 Javascript
从零学python系列之新版本导入httplib模块报ImportError解决方案
2014/05/23 Python
Python实现字典依据value排序
2016/02/24 Python
python 3.3 下载固定链接文件并保存的方法
2018/12/18 Python
CSS3新属性transition-property transform box-shadow实例学习
2013/06/06 HTML / CSS
Canal官网:巴西女性时尚品牌
2019/10/16 全球购物
文秘应聘自荐书范文
2014/02/18 职场文书
王金山在党的群众路线教育实践活动总结大会上的讲话稿
2014/10/25 职场文书
高三数学教学反思
2016/02/18 职场文书
用Python写一个简易版弹球游戏
2021/04/13 Python
Windows11插耳机没反应怎么办? win11耳机没声音的多种解决办法
2021/11/21 数码科技
Windows server 2022创建创建林、域树、子域的步骤
2022/06/25 Servers