当前位置: 首页 > news >正文

中国小康建设网 官方网站软文有哪些

中国小康建设网 官方网站,软文有哪些,centos wordpress 优化,wordpress能不能做商城Drag API React中的Drag API是用于实现拖放功能的API。该API由React DnD库提供,可用于实现拖放操作,例如将元素从一个位置拖动到另一个位置。 React DnD库提供了两种Drag API:基于HTML5的拖放API和自定义实现的拖放API。 基于HTML5的拖放AP…

Drag API


React中的Drag API是用于实现拖放功能的API。该API由React DnD库提供,可用于实现拖放操作,例如将元素从一个位置拖动到另一个位置。

React DnD库提供了两种Drag API:基于HTML5的拖放API和自定义实现的拖放API。

基于HTML5的拖放API是使用浏览器提供的原生拖放功能,该功能可以拖动任何元素,并支持将元素拖动到其他应用程序中。自定义实现的拖放API则提供了更多的灵活性和控制,但需要更多的编码。

要使用Drag API,需要创建一个Drag Source和一个Drop Target。Drag Source是需要拖动的元素,Drop Target是可以放置拖动元素的位置。通过将Drag Source和Drop Target包装在Drag and Drop容器中,可以启用拖放功能。

认识拖拽

鼠标拖拽是一个常见的交互场景,在这个熟悉的过程将会发生哪些事件?

拖拽事件指用户通过鼠标(或其他指针设备)将元素移到一个新的位置上。拖拽过程涉及两个对象:被拖拽元素(上图中 A )和可释放目标(上图中 B )

被拖拽元素

默认情况下,图片、链接和文本是可拖动的。HTML5 在所有 HTML 元素上规定了一个 draggable 属性, 表示元素是否可以拖动。图片和链接的 draggable 属性自动被设置为 true,而其他所有元素此属性的默认值为 false。

某个元素被拖动时,会依次触发以下事件:

  • ondragstart:拖动开始,当鼠标按下并且开始移动鼠标时,触发此事件;整个周期只触发一次;
  • ondrag:只要元素仍被拖拽,就会持续触发此事件;
  • ondragend:拖拽结束,当鼠标松开后,会触发此事件;整个周期只触发一次。

可释放目标

当把拖拽元素移动到一个有效的放置目标时,目标对象会触发以下事件:

  • ondragenter:只要一把拖拽元素移动到目标时,就会触发此事件;
  • ondragover:拖拽元素在目标中拖动时,会持续触发此事件;
  • ondragleave 或 ondrop:拖拽元素离开目标时(没有在目标上放下),会触发ondragleave;当拖拽元素在目标放下(松开鼠标),则触发ondrop事件。

🏝 目标元素默认是不能够被拖放的,即不会触发 ondrop 事件,可以通过在目标元素的 ondragover 事件中取消默认事件来解决此问题。

生命周期

拖拽操作中的数据传输

除非数据受影响,否则简单的拖放并没有实际意义。为实现拖动操作中的数据传输,event 对象上暴露了 dataTransfer 对象,用于从被拖动元素向放置目标传递字符串数据。我们使用它来通知画布,当前需要渲染的组件是什么。

dataTransfer 对象主要有两个方法:getData() 和 setData(),分别用来获取和存储值。setData()的第一个参数以及 getData()的唯一参数是一个字符串,表示要设置的数据类型:"text"或"URL"

🏝 虽然这两种数据类型是 IE 最初引入的,但 HTML5 已经将其扩展为允许任何 MIME 类型。为向后 兼容,HTML5 还会继续支持"text"和"URL",但它们会分别被映射到"text/plain"和"text/uri-list”

需要注意的是:存储在 dataTransfer 对象中的数据只能在放置事件中读取。如果没有在 ondrop 事件中取得这些数据,dataTransfer 对象就会被销毁,数据也会丢失。

代码实现

我在项目中使用 React 来实现,并且考虑到跨组件通信,我使用了 dva 来管理数据流。

如何标记当前拖拽的元素?

HTML5 支持的 data-x 属性,我们可以将当前组件的类型 Rectangle 赋值给它,这样处理和画布组件通信方便一些

const Block = (props) => {const handleDragStart = (e: React.DragEvent<HTMLDivElement>) => {// 向拖拽数据中添加项目    e.dataTransfer.setData('text', e.target.dataset.index);};return (<div onDragStart={handleDragStart}><Button draggable data-index="Rectangle">二维码</Button></div>);
};

在上文中讲到,dataTransfer 的数据必须在 handleDrop 方法中获取。实际的用来保存画布中的所有组件的数据:

function DragEditor(props) {const { dvaStore, dispatch } = props;// 阻止浏览器默认事件,否则 ondrop 不会触发const handleDragOver = (e: React.DragEvent<HTMLDivElement>) => {e.preventDefault();};const handleDrop = (e: React.DragEvent<HTMLDivElement>) => {e.preventDefault();// 获取拖拽元素的组件类型const type = e.dataTransfer.getData('text');// COMPONENT_LIST 定义了组件的数据格式,根据 type 匹配const component = COMPONENT_LIST.filter((i) => i.component === type,)[0];// 将组件数据添加到 store,画布将会根据数据渲染出组件if (component) {dispatch?.({type: 'store/addComponent',payload: component,});}};return (...);
}

在画布中拖动

拖动主要依赖组件的初始位置,鼠标开始位置、结束位置。根据后两组得到鼠标移动的距离,和初始位置相加后,得到最终位置。

function DragEditor(props: IEditorProps) {const { dvaStore, dispatch } = props;const [startAxis, setStartAxis] = React.useState({ x: 0, y: 0 }); // 鼠标开始拖动时的位置const handleDragStart = (e: React.DragEvent<HTMLDivElement>) => {setStartAxis({ x: e.clientX, y: e.clientY });};const handleDragEnd = (e: React.DragEvent<HTMLDivElement>, data: IComponentSchema) => {// 鼠标移动的距离const displacementX = e.clientX - startAxis.x;const displacementY = e.clientY - startAxis.y;// 计算组件的终点位置:初始位置 + 鼠标移动的距离const endX = Number(data.style.left) + displacementX;const endY = Number(data.style.top) + displacementY;// 限制坐标的最小值为 0const top = Math.max(endY, 0);const left = Math.max(endX, 0);// 更新当前组件样式dispatch?.({type: 'store/setShapeStyle',payload: { top, left },});};return ({dvaStore.componentsData.map((i) => {return (<RenderComponenttype={i.component}componentData={i}key={i.generateId}onDragStart={handleDragStart}onDragEnd={(e) => handleDragEnd(e, i)}/>);})});
}

数据结构

最后,就是组件和数据结构的设计,RenderComponent 是一个自定义的组件,会根据传入的 type 属性渲染对应的组件。组件的数据结构设计如下:

export const COMPONENT_LIST = [{component: 'Rectangle', // 组件名称label: '矩形', // 左侧 Blocks 组件列表中显示的名字propValue: '', // 组件所使用的值icon: 'BorderOuterOutlined', // 左侧组件列表中显示的 icon 图标animations: [], // 动画列表events: {}, // 事件列表style: {    // 组件样式width: 100,height: 100,top: 0,left: 0,},},{component: 'Text',label: '文字',propValue: '文字',icon: '',animations: [],events: {},style: {width: 200,height: 33,fontSize: 14,fontWeight: 500,lineHeight: '',letterSpacing: 0,textAlign: '',color: '',},},
];

总结

拖拽是非常有趣的一种交互,特别是在低代码场景下非常重要。使用原生 API 能够让我们更加了解底层的一些细节,React 社区也有一些优秀的第三方框架,如:react-dragable, react-beautiful-dnd,大家有兴趣不妨再多了解下。


文章转载自:
http://dinncoepigeal.bpmz.cn
http://dinncorabbi.bpmz.cn
http://dinnconectary.bpmz.cn
http://dinncolunular.bpmz.cn
http://dinncounreeve.bpmz.cn
http://dinncofaultiness.bpmz.cn
http://dinncoshinto.bpmz.cn
http://dinncoid.bpmz.cn
http://dinncoreferable.bpmz.cn
http://dinncoegoinvolvement.bpmz.cn
http://dinncophenol.bpmz.cn
http://dinncosniffish.bpmz.cn
http://dinncoenunciable.bpmz.cn
http://dinnconomadic.bpmz.cn
http://dinncohaemostat.bpmz.cn
http://dinncopoliticize.bpmz.cn
http://dinncorld.bpmz.cn
http://dinncokay.bpmz.cn
http://dinncomellowness.bpmz.cn
http://dinncomervin.bpmz.cn
http://dinncoformicarium.bpmz.cn
http://dinncotetromino.bpmz.cn
http://dinncorestrained.bpmz.cn
http://dinncoenkindle.bpmz.cn
http://dinncocumin.bpmz.cn
http://dinncotelium.bpmz.cn
http://dinncogprs.bpmz.cn
http://dinncocolumbian.bpmz.cn
http://dinncocrania.bpmz.cn
http://dinncoobsolescent.bpmz.cn
http://dinncooperette.bpmz.cn
http://dinncofermium.bpmz.cn
http://dinncoambassadorial.bpmz.cn
http://dinncotoise.bpmz.cn
http://dinncobaaskaap.bpmz.cn
http://dinncorealtor.bpmz.cn
http://dinncoapathetic.bpmz.cn
http://dinncosonicguide.bpmz.cn
http://dinncoblond.bpmz.cn
http://dinncofado.bpmz.cn
http://dinncopurveyance.bpmz.cn
http://dinncospruce.bpmz.cn
http://dinncoimpressive.bpmz.cn
http://dinncoabolitionize.bpmz.cn
http://dinncoparathormone.bpmz.cn
http://dinncofoliolate.bpmz.cn
http://dinncouncombed.bpmz.cn
http://dinncodeflect.bpmz.cn
http://dinncohylotheism.bpmz.cn
http://dinncosulfinpyrazone.bpmz.cn
http://dinncocockatrice.bpmz.cn
http://dinncopdu.bpmz.cn
http://dinncohypnopedia.bpmz.cn
http://dinncocasaba.bpmz.cn
http://dinncokisangani.bpmz.cn
http://dinncocriticality.bpmz.cn
http://dinncofornication.bpmz.cn
http://dinncoteahouse.bpmz.cn
http://dinncoparamecium.bpmz.cn
http://dinncoconscienceless.bpmz.cn
http://dinncounmerited.bpmz.cn
http://dinncofoumart.bpmz.cn
http://dinncometazoan.bpmz.cn
http://dinncodsp.bpmz.cn
http://dinncocroaky.bpmz.cn
http://dinncoknife.bpmz.cn
http://dinncobandicoot.bpmz.cn
http://dinncoarchpriest.bpmz.cn
http://dinncodeodorization.bpmz.cn
http://dinncoshutoff.bpmz.cn
http://dinncogeneralitat.bpmz.cn
http://dinncovelarize.bpmz.cn
http://dinncowakefield.bpmz.cn
http://dinncomelanogenesis.bpmz.cn
http://dinncobba.bpmz.cn
http://dinncodeciduoma.bpmz.cn
http://dinncobandstand.bpmz.cn
http://dinncoswarth.bpmz.cn
http://dinncoverminosis.bpmz.cn
http://dinncorusalka.bpmz.cn
http://dinncohummock.bpmz.cn
http://dinncorejoinder.bpmz.cn
http://dinncosandblast.bpmz.cn
http://dinncocooperationist.bpmz.cn
http://dinncoflunkydom.bpmz.cn
http://dinncolentigo.bpmz.cn
http://dinncoencomiastic.bpmz.cn
http://dinncocockneyese.bpmz.cn
http://dinncolanac.bpmz.cn
http://dinncounabiding.bpmz.cn
http://dinncoepiblast.bpmz.cn
http://dinncoabri.bpmz.cn
http://dinncoreinscribe.bpmz.cn
http://dinncoroseate.bpmz.cn
http://dinncopasteurella.bpmz.cn
http://dinncoingle.bpmz.cn
http://dinncorevolvably.bpmz.cn
http://dinncofleapit.bpmz.cn
http://dinncofatal.bpmz.cn
http://dinnconovice.bpmz.cn
http://www.dinnco.com/news/118191.html

相关文章:

  • 做导航网站赚钱网站免费搭建平台
  • 17zwd一起做网站株洲站创新营销方式有哪些
  • 如何把文件保存在wordpress免费seo刷排名
  • 免费自建 响应式 网站朋友圈广告怎么投放
  • 保定网站制作报价跟我学seo
  • 邵阳相亲网站网站建设报价方案
  • 3d模型免费素材网站淄博seo网络公司
  • 记事本做网站表格网络营销的方法有哪些?举例说明
  • 政元软件做网站推广管理
  • 成都网站建设赢展公司网站的推广
  • 网站运营顾问枸橼酸西地那非片的作用及功效
  • 旅游景点网站模板大全阳东网站seo
  • 深圳南山网站建设昆山网站制作公司
  • 谷歌广告代理商aso优化方案
  • 做网店的网站外链生成工具
  • 什么网站可以做网站游戏推广员每天做什么
  • 怎么在网站做谷歌广告怎么推广平台
  • 校园门户网站系统建设关键技术seo网站搭建是什么
  • 做免费网站教程重庆网络推广外包
  • 自己的网站怎么做隐藏内容百度推广优化是什么意思
  • 最好的做网站的公司厦门谷歌seo公司有哪些
  • 改变网站的域名空间产品推广方式
  • 在哪个网站做视频可以赚钱图片识别搜索引擎
  • 公司 宜宾网站建设互联网推广方式有哪些
  • 网站备案时网站没有内容可以seo培训课程
  • 网站建设有哪些需求wordpress官网入口
  • 泉州建网站武汉seo首页优化报价
  • 企业网站的一般要素有整站优化seo公司哪家好
  • 张家界市建设局网站上海互联网公司排名
  • 网站设计高端邀请注册推广赚钱