位置: 编程技术 - 正文

再次谈论React.js实现原生js拖拽效果引起的一系列问题(react all in js)

编辑:rootadmin

推荐整理分享再次谈论React.js实现原生js拖拽效果引起的一系列问题(react all in js),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:react all in js,react to change,react all in js,react onchange,react all in js,react to changes,react at once,react at once,内容如对您有帮助,希望把文章链接给更多的朋友!

React 起源于 Facebook 的内部项目,因为该公司对市场上所有 JavaScript MVC 框架,都不满意,就决定自己写一套,用来架设 Instagram 的网站。做出来以后,发现这套东西很好用,就在年5月开源了。由于 React 的设计思想极其独特,属于革命性创新,性能出众,代码逻辑却非常简单。所以,越来越多的人开始关注和使用,认为它可能是将来 Web 开发的主流工具。

前几天写的那个拖拽,自己留下的疑问。。。这次在热心博友的提示下又修正了一些小小的bug,也加了拖拽的边缘检测部分。。。就再聊聊拖拽吧

一、不要直接操作dom元素

react中使用了虚拟dom的概念,目地就是要尽量避免直接操作dom元素,所以我们在对dom元素进行操作的时候需要注意,我之前为了获取form的参数就直接用了var dragBox=document.getElementById('form')去找dom,但是其实记录from的初始位置,可以在其子组件更新父组件参数的时候调用。即在MyFrom组件中获取,如下代码:

这样就可以直接在父组件中操作自己,而不是在子组件中调用。

二、onmousemove和onmouseup事件应该绑定到document上

拖拽事件中,当鼠标在DragArea中按下后,就应该检测鼠标在document中移动的距离及何时弹起。否则直接绑定在form的话会有一个不雅的地方,就是拖动条拖动边缘附近的时候,如果鼠标速度快一点会失效,鼠标再回来拖动条会自动吸上鼠标。因此利用react初始化阶段的componentDidMount函数,这个函数是组件被装载后才会被调用,也就是说调用这个方法的时候,组件已经被渲染到了页面上,这个时候可以修改DOM。也就是说此时把相应事件再绑定到document上面,如下代码:

再次谈论React.js实现原生js拖拽效果引起的一系列问题(react all in js)

这样就可以消除那个小小的bug啦!

三、增加边缘检测

一般情况下的拖拽,我们都是不希望能够拖出可视窗口之外的,因此这就需要检测。检测四个方向上的位置,即上、下、左、右。显然,上的距离top和左边left的距离必须要大于等于0,下边和右的距离必须要小于视口大小减去from本身的元素宽高。

具体代码:

PS:新的代码已经更新在我的github上面,大家可以研究一下。

ReactJS的背景和原理

在Web开发中,我们总需要将变化的数据实时反应到UI上,这时就需要对DOM进行操作。而复杂或频繁的DOM操作通常是性能瓶颈产生的原因(如何进行高性能的复杂DOM操作通常是衡量一个前端开发人员技能的重要指标)。React为此引入了虚拟DOM(Virtual DOM)的机制:在浏览器端用Javascript实现了一套DOM API。基于React进行开发时所有的DOM构造都是通过虚拟DOM进行,每当数据变化时,React都会重新构建整个DOM树,然后React将当前整个DOM树和上一次的DOM树进行对比,得到DOM结构的区别,然后仅仅将需要变化的部分进行实际的浏览器DOM更新。而且React能够批处理虚拟DOM的刷新,在一个事件循环(Event Loop)内的两次数据变化会被合并,例如你连续的先将节点内容从A变成B,然后又从B变成A,React会认为UI不发生任何变化,而如果通过手动控制,这种逻辑通常是极其复杂的。尽管每一次都需要构造完整的虚拟DOM树,但是因为虚拟DOM是内存数据,性能是极高的,而对实际DOM进行操作的仅仅是Diff部分,因而能达到提高性能的目的。这样,在保证性能的同时,开发者将不再需要关注某个数据的变化如何更新到一个或多个具体的DOM元素,而只需要关心在任意一个数据状态下,整个界面是如何Render的。

如果你像在年代那样写过服务器端Render的纯Web页面那么应该知道,服务器端所要做的就是根据数据Render出HTML送到浏览器端。如果这时因为用户的一个点击需要改变某个状态文字,那么也是通过刷新整个页面来完成的。服务器端并不需要知道是哪一小段HTML发生了变化,而只需要根据数据刷新整个页面。换句话说,任何UI的变化都是通过整体刷新来完成的。而React将这种开发模式以高性能的方式带到了前端,每做一点界面的更新,你都可以认为刷新了整个页面。至于如何进行局部更新以保证性能,则是React框架要完成的事情。

借用Facebook介绍React的视频中聊天应用的例子,当一条新的消息过来时,传统开发的思路如上图,你的开发过程需要知道哪条数据过来了,如何将新的DOM结点添加到当前DOM树上;而基于React的开发思路如下图,你永远只需要关心数据整体,两次数据之间的UI如何变化,则完全交给框架去做。可以看到,使用React大大降低了逻辑复杂性,意味着开发难度降低,可能产生Bug的机会也更少。

纯js+html和纯css+html制作手风琴效果 本文分享了纯js+html制作手风琴和纯css+html制作手风琴两种效果,供大家参考,具体内容如下一、纯css+html的手风琴效果这种用css写的手风琴比较简单,主

基于javascript制作微博发布栏效果 本文为大家分享了做微博发布栏效果的过程,涉及到的知识点包括以下:1.判断IE的方法:直接用varie=!-[1,];即可2.连续发生事件的用法:IE下:触发对象.o

javascript事件委托的用法及其好处简析 本文为大家简单介绍了javascript事件委托的用法及其好处,供大家参考,具体内容如下事件委托:利用冒泡的原理,把事件加到父级上,触发执行效果,好

标签: react all in js

本文链接地址:https://www.jiuchutong.com/biancheng/373378.html 转载请保留说明!

上一篇:深入浅析JSON.parse()、JSON.stringify()和eval()的作用详解(json的parseobject)

下一篇:纯js+html和纯css+html制作手风琴效果(js 和html)

  • 研发机构采购设计方案
  • 资源税的税目有几个
  • 记账错误怎么办
  • 以前未入账固定资产补入账涉及的房产税
  • 个税中房屋租赁日期写长跟写短
  • 补提上一年度的年终奖
  • 汇票委托书会计分录
  • 京东佣金费用计算公式
  • 转出未交增值税是借方还是贷方
  • 商业银行委托贷款期限
  • 企业授予员工股份的条件
  • 现金日记账支出是记借还是贷
  • 材料未验收入库属于哪个科目
  • 企业合同约定调岗不接受辞退没赔偿成立吗
  • 公司注销过程中如果有纠纷怎么办
  • 电商公司购买拍照违法吗
  • 应交税费的余额怎么计算
  • 银行存款二级科目怎么增加
  • 个独企业生产经营所得税率
  • 个人将房产无偿赠与他人应交个人所得税吗
  • 个人免征增值税起征点
  • 工业企业预付材料款时一般应借记什么账户
  • vue框架使用方法
  • windows无法访问共享文件夹
  • 腾讯电脑管家中如何安装 文件夹上锁专家
  • 收到车辆保险发票怎么做分录
  • 什么叫市净率?它有何意义?
  • 关于汇算清缴的问题
  • 新车发生事故报废保险怎么赔付
  • 如何使用dashboard
  • 补缴税款可以享受减免政策么
  • 下载文件是php
  • php socket_select
  • 产品工人工资属于制造费用吗
  • 专利权属于什么会计科目
  • php和apache
  • electron-vue官网
  • 2023 年值得关注的 9 个 Web3 发展趋势
  • 调整价格差额计算应采用
  • 进口货物交哪些税费
  • 金融企业会计科目有哪些
  • 用简易计税办法开发票
  • 融资租赁视同销售吗
  • 一般纳税企业增值税的核算应当使用
  • CentOS 7.3上SQL Server vNext CTP 1.2安装教程
  • 个人所得税专项附加扣除标准一览表
  • 电子承兑汇票承兑后几天到账
  • 企业消费税应计入资产成本的有哪些
  • 一般纳税人增值税减免政策2023
  • 管理费用算营业外支出吗
  • 员工罚款从工资中代扣
  • 涉税信息声明怎么提供
  • 半成品是指正在各生产阶段加工的产品
  • 什么是无形资产包括哪些
  • 被代持股份的股东需要负责吗
  • 政府征税再进行补贴对消费者福利的影响
  • 可转债公允价值变动计入
  • 收到税务局汇算清缴退所得税怎么做账
  • 编制合并报表时最关键的一步
  • mysql rand整数
  • 存储sql
  • Win10 Mobile RS2预览版14926已知问题和解决方法汇总 谨慎升级
  • spamsub.exe - spamsub进程是什么文件
  • winxp/win7/win2003 电脑开机密码设置图文方法
  • 更换主板也不用换硅脂吗
  • centos如何安装yum
  • keyword是啥
  • android的开发
  • js如何将毫秒转换为日期
  • rsa加解密过程是什么
  • android的消息机制
  • js面向对象的三大特性
  • 浙江通用电子发票注册申请怎么填
  • 学校 税务登记
  • 211学生占全国比例
  • 荆州市税务局现任名单
  • 设计费需要交税吗
  • 收购烟叶支付的价外补贴怎么处理
  • 房没交契税和物业维修金房屋预告登记证明可以打印吗
  • 中国进口车关税为什么那么贵
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设