位置: 编程技术 - 正文

基于React.js实现原生js拖拽效果引发的思考(react jss)

编辑:rootadmin

推荐整理分享基于React.js实现原生js拖拽效果引发的思考(react jss),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:javascript react,javascript react,react引用js脚本,react all in js,react引用js脚本,react .js,react jss,react引用js脚本,内容如对您有帮助,希望把文章链接给更多的朋友!

一、起因&思路

一直想写一个原生js拖拽效果,又加上近来学react学得比较嗨。所以就用react来实现这个拖拽效果。

首先,其实拖拽效果的思路是很简单的。主要就是三个步骤:

1.onmousedown的时候,启动可拖拽事件,记录被拖拽元素的原始坐标参数。

2.onmousemove的时候,实时记录鼠标移动的距离,结合被拖拽元素第一阶段的坐标参数,计算并设置新的坐标值。

3.onmouseup的时候,关闭可拖拽事件,记录新的坐标值。

注意:这里主要是通过绝对定位的top和left来确定元素的位置的,因此被拖拽元素的css一定要设置绝对定位。

二、辅助工具

辅助工具主要就是是开发过程变得高效,而且酷炫的。在这个demo中,要给大家推荐一个gulp+browser-sync的开发工具,gulp有很多功能,在这个demo中gulp的作用主要是可以设置实时编译react中的jsx文件,当然如果你写css用的是sass,也可以设置实时编译sass。用browser-sync这个呢,主要就是可以自动实时刷新页面,我们平时做页面,看效果的时候,通常都是通过F5来刷新浏览器,然后看到页面的。但是用了这个插件,你写完代码的时候,只要按下,ctrl+s保存,新的效果就会自动在浏览器中刷新,然后看得到了。

用法详解:

安装:

1.在node的环境下,安装gulp,这里就不详说了,具体过程可参考我的博文《react.js入门必须知道的那些事》

2.安装gulp-livereload,在命令行或者git bash ,输入npm install --save-dev gulp-livereload

3.安装gulp-watch,在命令行或者git bash ,输入npm install --save-dev gulp-watch

4.安装browser-sync,在命令行或者git bash ,输入npm install --save-dev browser-sync

配置及解释如图:

三、定义组件构建页面

备注:这里的代码说明均在react相关模块安装好的情况下,安装过程见我的博文《react.js入门必须知道的那些事》.

基于React.js实现原生js拖拽效果引发的思考(react jss)

效果图:

组件拆分思路:

我当时觉得组件拆分得细一点好,所以我把input、button分别做成了一个组件:

由于input有很多都是需要指定的,这种情况下,如果像我这样定义需要传太多参数,而且其实登陆的input大多都是固定且没必要复用的,所以这样其实不大好。这里的input直接写比较好。

写好之后的父组件:

备注:因为demo中需要获取真实的dom节点,所以定义了ref。

再加上css样式,页面就完成啦!最后,重点来啦!!!

四、父子组件间通信实现拖拽

说明:由于我要实现的效果是,鼠标按住子组件DragArea的时候,拖动的是整个form,所以启动拖拽的是DragArea,而响应的是form。所以,一开始必须把父组件的一些状态属性传给子组件,然后鼠标在DragArea按下的的时候,必须通过子组件DragArea找到父组件的原始坐标参数,然后更新父组件里面的状态属性,并且告诉父组件可以进行拖拽了。父组件给子组件传参就是直接传递的。而子组件给父组件传参需要通过事件。所以在父组件中定义这么一个函数:

而子组件需要绑定这个函数,如上面的代码:callbackParent={this.onChildChanged}

在子组件中,响应的函数为:

这样,在子组件中就启动了拖拽开关,并且已经更新了from的相关参数,from的两外两个事件,move和endDrag分别为:

至此,拖拽实现!

五、反思回顾

1.理论上来说,拖拽效果可以在任意元素中实现,拖拽的思路都是一致的,所以理论上来说,拖拽各个过程的函数可以抽离出来,做成一个Mixin,然后可以反复调用。我一开始的思路就是这样,但是在传参、响应、绑定元素上面总是出错。查找了一下资料,没找到react与拖拽的简单写法资料,只有一些react的专用插件,而且是用ES6的写法,由于现在的水平还没能看懂。所以暂时放弃了这种写法。希望有相关想法的大神们和我交流一下。

2.文中子组件获取from的参数时,用了var dragBox=document.getElementById('form');去找dom,这样好像违反了react的一些理念。但是我还不是很熟悉该怎么从子组件获取父组件的dom。我试过在父组件定义refs=this.refs.dragBox。然后传给子组件,但是不知道为什么浏览器一直报错说这个不是dom节点。求大神指教。

3.拖拽事件的一般写法,是在document上面定义mousemove和mouseup事件,但是这两个事件都关联到from的参数,这样的话,如果我在react中定义在document,就跟踪不了相关参数。所以我就定义在了from上面。是不是有更好的方法呢?求分享!

4.革命尚未成功,同志仍需努力!

本demo已上传至:

React.js入门学习第一篇 一、JSX介绍①定义JSX=JavaScriptXML,是一种在React组件内部构建标签的类XML语法。React在不使用JSX的情况下一样可以工作,但是使用JSX可以提高组件的可读

JavaScript 不支持 indexof 该如何解决 indexOf()方法定义和用法indexOf()方法可返回某个指定的字符串值在字符串中首次出现的位置。该方法将从头到尾地检索字符串stringObject,看它是否含有子

JavaScript 浏览器兼容性总结及常用浏览器兼容性分析 本文是积木网小编日常整理些关于js兼容性问题,及IE与Firefox等常用浏览器的兼容性分析,对js浏览器兼容性相关知识感兴趣的朋友一起学习吧!1.children

标签: react jss

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

上一篇:基于javascript实现tab切换特效(基于JAVASCRIPT实现的可视化工具是)

下一篇:React.js入门学习第一篇(react基础入门)

  • 所得税费用科目属于什么科目
  • 税收征管法实施细则全文最新
  • 积分抵现是什么意思
  • 出口退税进项税
  • 咨询服务业涉及税费
  • 注销股本对所有股票影响
  • 小规模转一般纳税人需要什么条件
  • 服务行业适用什么核算
  • 资产报废变现收入应开具哪种发票
  • 股票价值的计算公式财务管理
  • 筹建期可以有收入吗
  • 幼儿园幼儿买花的通知
  • 航天信息维护费280元报税怎么抵扣
  • 开增值税票需要对方什么资料
  • 实收资本重复交的印花税可以申请退税吗?
  • 营改增之后还有营业税金及附加吗
  • 营改增土地增值税的计算
  • 航天服务费530是什么?
  • 受让无形资产是什么意思
  • 业务招待费业务宣传费
  • 优惠购房差价收益是否缴纳个人所得税?
  • 全资子公司向母公司提供劳务服务怎么做账
  • 已认证的发票对公司影响
  • 材料采购差异的影响因素
  • 应付票据包括哪些票
  • win10开始菜单失效如何解决
  • 苹果6手机锁屏
  • PHP:mb_ereg_replace_callback()的用法_mbstring函数
  • php讲解
  • 虚拟机vm怎么用
  • 外企借款投资利息高吗
  • 增值税进项税转出文件
  • 财务费用核算的内容没有
  • vue.min.js 本地引入
  • bad block bitmap checksum
  • 应付职工薪酬包括哪些二级科目
  • 无实物的固定资产有哪些
  • 连锁店会计的工作内容
  • 企业的借款利息可能计入哪些账户
  • 上个月的票这个月作废后报增值税需不需要交费?
  • 织梦系统网站搭建教程
  • 小规模纳税人销售商品会计分录
  • 其他业务支出属于利润表项目吗
  • 固定资产二级科目装修
  • 小型商贸企业
  • MongoDB中MapReduce编程模型使用实例
  • 公司支付宝账户怎么管理
  • 申请制作广告牌的申请
  • 贷款担保费应计入什么
  • 汇总记账凭证会计核算形式下总分类账账页格式一般采用
  • 企业以现金形式发工资
  • 应交增值税进项税额转出账务处理
  • 车保险会计怎么做分录
  • 如何从财务报表中分析企业偿债能力
  • 长期待摊费用怎么做账
  • 如何找回丢失数据
  • windows2008 64位系统下MySQL 5.7绿色版的安装教程
  • win8 联网
  • ubuntu搜索已安装软件
  • xp软件自动启动
  • ha1.dll丢失开不了机
  • win8不能启动
  • 格式化不干净
  • linux批量管理平台
  • win7专用字符编辑程序
  • win7如何整理磁盘
  • win8可以装pr2018吗
  • Win7系统打开蓝牙
  • Win10 Mobile 10586.122 ROM安装包有多大?
  • opengl纹理叠加
  • 塔防类的网游
  • python内置函数用来返回列表,元组,字典
  • 菜鸟 安卓
  • js设计模式和开发实践
  • Firefox window.close()的使用注意事项
  • 税务局验证码
  • 吉林网上报税网址
  • 02112366电子税务局
  • 梨树烧烤一条街打人
  • 税务投诉电话12345
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设