解决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表格排序组件-tablesorter使用示例
May 26 Javascript
JS之相等操作符详解
Sep 13 Javascript
JS重载实现方法分析
Dec 16 Javascript
js实现定时进度条完成后切换图片
Jan 04 Javascript
浅谈angularjs依赖服务注入写法的注意点
Apr 24 Javascript
vuejs实现本地数据的筛选分页功能思路详解
Nov 15 Javascript
JsChart组件使用详解
Mar 04 Javascript
对vue2.0中.vue文件页面跳转之.$router.push的用法详解
Aug 24 Javascript
Vue中的vue-resource示例详解
Nov 02 Javascript
Vue 样式绑定的实现方法
Jan 15 Javascript
新手入门带你学习JavaScript引擎运行原理
Jun 24 Javascript
JS实现电脑虚拟键盘的操作
Jun 24 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中的Session和Cookie
2013/06/21 PHP
php中OR与|| AND与&amp;&amp;的区别总结
2013/10/26 PHP
php异常处理使用示例
2014/02/25 PHP
PHP大批量插入数据库的3种方法和速度对比
2014/07/08 PHP
php中实现记住密码下次自动登录的例子
2014/11/06 PHP
学习php设计模式 php实现建造者模式
2015/12/07 PHP
mysql desc(DESCRIBE)命令实例讲解
2016/09/24 PHP
PHP常见字符串操作函数与用法总结
2019/03/04 PHP
学习YUI.Ext 第二天
2007/03/10 Javascript
js类中获取外部函数名的方法
2007/08/19 Javascript
javascript &amp;&amp;和||运算法的另类使用技巧
2009/11/28 Javascript
基于jQuery的可以控制左右滚动及自动滚动效果的代码
2010/07/25 Javascript
利用了jquery的ajax实现二级联互动菜单
2013/12/02 Javascript
原生JS绑定滑轮滚动事件兼容常见浏览器
2014/06/30 Javascript
基于javascript实现简单的抽奖系统
2020/04/15 Javascript
JS查找字符串中出现最多的字符及个数统计
2017/02/04 Javascript
Vue组件中slot的用法
2018/01/30 Javascript
用node-webkit把web应用打包成桌面应用(windows环境)
2018/02/01 Javascript
深入理解JS的事件绑定、事件流模型
2018/05/13 Javascript
vue.js使用v-model指令实现的数据双向绑定功能示例
2018/05/22 Javascript
[29:10]Ti4 冒泡赛第二天 NEWBEE vs Titan 3
2014/07/15 DOTA
分析python服务器拒绝服务攻击代码
2014/01/16 Python
Python字典简介以及用法详解
2016/11/15 Python
详解Python 正则表达式模块
2018/11/05 Python
pytorch模型预测结果与ndarray互转方式
2020/01/15 Python
python使用dlib进行人脸检测和关键点的示例
2020/12/05 Python
纯HTML5+CSS3制作图片旋转
2016/01/12 HTML / CSS
CSS实现雨滴动画效果的实例代码
2019/10/08 HTML / CSS
洛杉矶生活休闲而精致的基础品牌:Mika Jaymes
2018/01/07 全球购物
工程专业应届生求职信
2014/02/19 职场文书
《难忘的泼水节》教学反思
2014/02/27 职场文书
婚礼答谢礼品
2015/01/20 职场文书
走进科学观后感
2015/06/18 职场文书
大学生创业计划书常用模板
2019/08/07 职场文书
员工保密协议范本,您一定得收藏!很有用!
2019/08/08 职场文书
Spring Boot 排除某个类加载注入IOC的操作
2021/08/02 Java/Android