解决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.alert 弹出式复选框实现代码
Jun 15 Javascript
Javascript 类、命名空间、代码组织代码
Jul 31 Javascript
js 操作select和option常用代码整理
Dec 13 Javascript
jQuery插件MixItUp实现动画过滤和排序
Apr 12 Javascript
解决jquery实现的radio重新选中的问题
Jul 03 Javascript
JS创建对象的写法示例
Nov 04 Javascript
jQuery实现删除li节点的方法
Dec 06 Javascript
关于jQuery EasyUI 中刷新Tab选项卡后一个页面变形的解决方法
Mar 02 Javascript
解决vue页面DOM操作不生效的问题
Mar 17 Javascript
vue实现标签云效果的方法详解
Aug 28 Javascript
JS实现随机抽选获奖者
Nov 07 Javascript
JavaScript中arguments的使用方法详解
Dec 20 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
用文本文件制作留言板提示(下)
2006/10/09 PHP
php 清除网页病毒的方法
2008/12/05 PHP
php自动加载的两种实现方法
2010/06/21 PHP
PHP获取url的函数代码
2011/08/02 PHP
PHP操作MySQL事务实例
2014/11/05 PHP
Laravel框架实现修改登录和注册接口数据返回格式的方法
2018/08/17 PHP
破除一些网站复制、右键限制
2006/11/04 Javascript
一个基于jquery的图片切换效果
2010/07/06 Javascript
基于jQuery的输入框无值自动显示指定数据的实现代码
2011/01/24 Javascript
js固定DIV高度,超出部分自动添加滚动条的简单方法
2013/07/10 Javascript
IE下Ajax缓存问题的快速解决方法(get方式)
2014/01/09 Javascript
JS+CSS实现自适应选项卡宽度的圆角滑动门效果
2015/09/15 Javascript
jQuery实现公告新闻自动滚屏效果实例代码
2016/07/14 Javascript
41个Web开发者必须收藏的JavaScript实用技巧
2016/07/22 Javascript
jQuery简单创建节点的方法
2016/09/09 Javascript
jQuery中的100个技巧汇总
2016/12/15 Javascript
JS基于贪心算法解决背包问题示例
2017/11/27 Javascript
puppeteer实现html截图的示例代码
2019/01/10 Javascript
Node.js使用supervisor进行开发中调试的方法
2019/03/26 Javascript
JS实现li标签的删除
2019/04/12 Javascript
基于JS实现web端录音与播放功能
2019/04/17 Javascript
python写的一个文本编辑器
2014/01/23 Python
python读取二进制mnist实例详解
2017/05/31 Python
使用Python写一个小游戏
2018/04/02 Python
浅谈python的dataframe与series的创建方法
2018/11/12 Python
完美解决python3.7 pip升级 拒绝访问问题
2019/07/12 Python
python爬虫开发之使用python爬虫库requests,urllib与今日头条搜索功能爬取搜索内容实例
2020/03/10 Python
英国女士家居服网站:hush
2017/08/09 全球购物
德国滑雪和户外用品网上商店:XSPO
2019/10/30 全球购物
PHP使用Redis队列执行定时任务实例讲解
2021/03/24 PHP
大学生就业推荐信范文
2013/11/29 职场文书
司机个人年终总结
2015/03/03 职场文书
Python中for后接else的语法使用
2021/05/18 Python
MySQL之PXC集群搭建的方法步骤
2021/05/25 MySQL
企业开发CSS命名BEM代码规范实践
2022/02/12 HTML / CSS
Java数据结构之堆(优先队列)
2022/05/20 Java/Android