{"componentChunkName":"component---src-templates-post-template-js","path":"/en-US/plus/dragMove","result":{"data":{"current":{"frontmatter":{"title":"DragMove","order":31,"brief":"Set elements to change their position by dragging","icon":"doc-dragmove"},"fields":{"type":"plus"},"tableOfContents":{"items":[{"url":"#when-to-use","title":"When to use"},{"url":"#demos","title":"Demos","items":[{"url":"#how-to-introduce","title":"How to introduce"},{"url":"#basic-usage","title":"Basic usage"},{"url":"#limit-drag-range","title":"Limit drag range"},{"url":"#customize-elements-that-trigger-dragging","title":"Customize elements that trigger dragging"},{"url":"#customize-position-processing-after-dragging","title":"Customize position processing after dragging"},{"url":"#api","title":"API"}]}]},"body":"var _excluded = [\"components\"];\nfunction _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }\nfunction _objectWithoutProperties(e, t) { if (null == e) return {}; var o, r, i = _objectWithoutPropertiesLoose(e, t); if (Object.getOwnPropertySymbols) { var s = Object.getOwnPropertySymbols(e); for (r = 0; r < s.length; r++) o = s[r], t.includes(o) || {}.propertyIsEnumerable.call(e, o) && (i[o] = e[o]); } return i; }\nfunction _objectWithoutPropertiesLoose(r, e) { if (null == r) return {}; var t = {}; for (var n in r) if ({}.hasOwnProperty.call(r, n)) { if (e.includes(n)) continue; t[n] = r[n]; } return t; }\n/* @jsxRuntime classic */\n/* @jsx mdx */\n\nvar _frontmatter = {\n  \"localeCode\": \"en-US\",\n  \"order\": 31,\n  \"category\": \"Plus\",\n  \"title\": \"DragMove\",\n  \"icon\": \"doc-dragmove\",\n  \"dir\": \"column\",\n  \"brief\": \"Set elements to change their position by dragging\"\n};\nvar layoutProps = {\n  _frontmatter: _frontmatter\n};\nvar MDXLayout = \"wrapper\";\nreturn function MDXContent(_ref) {\n  var components = _ref.components,\n    props = _objectWithoutProperties(_ref, _excluded);\n  return mdx(MDXLayout, _extends({}, layoutProps, props, {\n    components: components,\n    mdxType: \"MDXLayout\"\n  }), mdx(\"section\", null, mdx(\"h2\", {\n    parentName: \"section\"\n  }, \"When to use\"), mdx(\"p\", {\n    parentName: \"section\"\n  }, \"It is used to set the element that can be dragged to change its position. It supports limiting the drag range and customizing the elements that trigger dragging.\")), mdx(\"section\", null, mdx(\"h2\", {\n    parentName: \"section\"\n  }, \"Demos\"), mdx(\"h3\", {\n    parentName: \"section\"\n  }, \"How to introduce\"), mdx(\"p\", {\n    parentName: \"section\"\n  }, \"DragMove supported from v2.71.0.\"), mdx(\"pre\", {\n    parentName: \"section\"\n  }, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-jsx\"\n  }, \"import { DragMove } from '@douyinfe/semi-ui';\\n\")), mdx(\"h3\", {\n    parentName: \"section\"\n  }, \"Basic usage\"), mdx(\"p\", {\n    parentName: \"section\"\n  }, \"Elements wrapped by \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"DragMove\"), \" will be able to change their position by dragging.\"), mdx(\"p\", {\n    parentName: \"section\"\n  }, mdx(\"strong\", {\n    parentName: \"p\"\n  }, mdx(\"em\", {\n    parentName: \"strong\"\n  }, \"Notice\"))), mdx(\"ol\", {\n    parentName: \"section\"\n  }, mdx(\"li\", {\n    parentName: \"ol\"\n  }, \"DragMove will set the draggable element to absolute positioning\"), mdx(\"li\", {\n    parentName: \"ol\"\n  }, \"DragMove needs to apply DOM event listeners to children. If the child element is a custom component, you need to ensure that it can pass properties to the underlying DOM element. The following types of children are supported:\", mdx(\"ol\", {\n    parentName: \"li\"\n  }, mdx(\"li\", {\n    parentName: \"ol\"\n  }, \"Class Component, it is not mandatory to bind ref, but you need to ensure that props can be transparently transmitted to the real DOM node \"), mdx(\"li\", {\n    parentName: \"ol\"\n  }, \"Use the functional component wrapped by forwardRef to transparently transmit props and ref to the real DOM node in children \"), mdx(\"li\", {\n    parentName: \"ol\"\n  }, \"Real DOM nodes, such as span, div, p...  \")))), mdx(\"pre\", {\n    parentName: \"section\"\n  }, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-jsx\",\n    \"metastring\": \"live=true\",\n    \"live\": \"true\"\n  }, \"import React, { useRef, useEffect } from 'react';\\nimport { DragMove } from '@douyinfe/semi-ui';\\n\\nfunction Demo() {\\n  return (\\n    <DragMove>\\n      <div \\n        style={{ backgroundColor: 'var(--semi-color-primary)',width: 80, height: 80, \\n          display: 'flex', alignItems: 'center',justifyContent: 'center', \\n          borderRadius: 10, fontWeight: 500,\\n          position: 'absolute',  color: 'rgba(var(--semi-white), 1)'\\n        }} \\n      >Drag me</div>\\n    </DragMove>\\n  );\\n}\\n\\n\")), mdx(\"h3\", {\n    parentName: \"section\"\n  }, \"Limit drag range\"), mdx(\"p\", {\n    parentName: \"section\"\n  }, \"Passing in \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"constrainer\"), \", this function returns the elements that limit the draggable range.\"), mdx(\"p\", {\n    parentName: \"section\"\n  }, mdx(\"strong\", {\n    parentName: \"p\"\n  }, mdx(\"em\", {\n    parentName: \"strong\"\n  }, \"Note: The elements returned by the constrainer need to be positioned relative\"))), mdx(\"pre\", {\n    parentName: \"section\"\n  }, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-jsx\",\n    \"metastring\": \"live=true\",\n    \"live\": \"true\"\n  }, \"import React, { useRef, useEffect } from 'react';\\nimport { DragMove } from '@douyinfe/semi-ui';\\n\\nfunction Demo() {\\n  const containerRef = React.useRef();\\n\\n  return (\\n    <div \\n      style={{ \\n        backgroundColor: 'rgba(var(--semi-grey-2), 1)', \\n        width: 300, height: 300, padding: 5, position: 'relative', \\n        color: 'rgba(var(--semi-white), 1)', fontWeight: 500,\\n      }} \\n      ref={containerRef}\\n    >\\n      <span>Constrainer</span>\\n      <DragMove\\n        constrainer={() => containerRef.current}\\n      >\\n      <div \\n          style={{ backgroundColor: 'var(--semi-color-primary)', \\n            width: 80, height: 80, borderRadius: 10,\\n            display: 'flex', alignItems: 'center', justifyContent: 'center',\\n            position: 'absolute', top: 80, left: 80,\\n          }}\\n        >Drag me</div>\\n      </DragMove>\\n    </div>\\n  )\\n}\\n\")), mdx(\"h3\", {\n    parentName: \"section\"\n  }, \"Customize elements that trigger dragging\"), mdx(\"p\", {\n    parentName: \"section\"\n  }, \"Passing in \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"handler\"), \", this function returns the element that triggered the drag. If not set, you can click anywhere to drag; if set, only the part of the element returned by the handler can be dragged.\"), mdx(\"pre\", {\n    parentName: \"section\"\n  }, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-jsx\",\n    \"metastring\": \"live=true\",\n    \"live\": \"true\"\n  }, \"import React, { useRef, useEffect } from'react';\\nimport { IconTransparentStroked } from '@douyinfe/semi-icons';\\nimport { DragMove } from '@douyinfe/semi-ui';\\n\\nfunction Demo(){\\n  const handlerRef = React.useRef();\\n  const containerRef = React.useRef();\\n\\n  return (\\n    <div \\n      style={{ backgroundColor: 'rgba(var(--semi-grey-2), 1)', \\n        width: 300, height: 300, padding: 5, position: 'relative', \\n        color: 'rgba(var(--semi-white), 1)', fontWeight: 500,\\n      }} \\n      ref={containerRef}\\n    >\\n      <span>Constrainer</span>\\n      <DragMove\\n        handler={() => handlerRef.current}\\n        constrainer={() => containerRef.current}\\n      >\\n        <div \\n          style={{ \\n            backgroundColor: 'var(--semi-color-primary)', \\n            width: 80, height: 80, borderRadius: 10,\\n            position: 'absolute', top: 50, left: 50,\\n            display: 'flex', alignItems: 'center', justifyContent: 'center',\\n          }}\\n        >\\n          <div \\n              style={{ width: 'fit-content', height: 'fit-content' }} \\n              ref={handlerRef}\\n          ><IconTransparentStroked size={'large'}/></div>\\n        </div>\\n      </DragMove>\\n    </div>\\n  )\\n}\\n\")), mdx(\"h3\", {\n    parentName: \"section\"\n  }, \"Customize position processing after dragging\"), mdx(\"p\", {\n    parentName: \"section\"\n  }, \"You can customize the position processing after dragging through \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"customMove\"), \". After this parameter is set, the DragMove component will only return the calculated position through the parameters without setting it. The user can set the new position as needed.\"), mdx(\"pre\", {\n    parentName: \"section\"\n  }, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-jsx\",\n    \"metastring\": \"live=true\",\n    \"live\": \"true\"\n  }, \"import React, { useRef, useEffect } from'react';\\nimport { DragMove } from '@douyinfe/semi-ui';\\n\\nfunction CustomMove() {\\n  const containerRef = React.useRef();\\n  const elementRef = React.useRef();\\n  const startPoint = React.useRef();\\n\\n  const customMove = useCallback((element, top, left) => {\\n    if (left + 100 > containerRef.current.offsetWidth) {\\n      element.style.right = `${containerRef.current.offsetWidth - left - element.offsetWidth}px`\\n      element.style.left = 'auto';\\n    } else {\\n      element.style.left = left + 'px';\\n    } \\n    element.style.top = top + 'px';\\n  }, [])\\n\\n  const onMouseDown = useCallback((e) => {\\n    startPoint.current = {\\n      x: e.clientX,\\n      y: e.clientY,\\n    }\\n  }, []);\\n\\n  const onMouseUp = useCallback((e) => {\\n    if (startPoint.current) {\\n      const { x, y } = startPoint.current;\\n      if (Math.abs(e.clientX - x) < 5 && Math.abs(e.clientY - y) < 5) {\\n        if (elementRef.current.style.width === '50px') {\\n          elementRef.current.style.width = '100px';\\n        } else {\\n          elementRef.current.style.width = '50px';\\n        }\\n      }\\n    }\\n    startPoint.current = null;\\n  }, []);\\n\\n  return (\\n    <>\\n      <span>Click on the blue color block to change the width. The blue color block will not exceed the range limit before and after the change.</span>\\n      <br /><br />\\n      <div \\n        style={{ \\n          backgroundColor: 'rgba(var(--semi-grey-2), 1)', width: 300, height: 300, \\n          position: 'relative', padding: 10,\\n          color: 'rgba(var(--semi-white), 1)', fontWeight: 500,\\n        }} \\n        ref={containerRef}\\n      >\\n        <span>Constrainer</span>\\n        <DragMove\\n          constrainer={() => containerRef.current}\\n          customMove={customMove}\\n        >\\n          <div\\n            style={{ backgroundColor: 'var(--semi-color-primary)',width: 50, height: 50,\\n              display: 'flex', alignItems: 'center',justifyContent: 'center',\\n              position: 'absolute', top: 50, left: 50, borderRadius: 10, padding: 5\\n            }}\\n            onMouseDown={onMouseDown}\\n            onMouseUp={onMouseUp}\\n            ref={elementRef}\\n          >Drag me</div>\\n        </DragMove>\\n      </div> \\n    </>\\n  )\\n}\\n\\n\")), mdx(\"h3\", {\n    parentName: \"section\"\n  }, \"API\"), mdx(\"table\", {\n    parentName: \"section\"\n  }, mdx(\"thead\", {\n    parentName: \"table\"\n  }, mdx(\"tr\", {\n    parentName: \"thead\"\n  }, mdx(\"th\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Property\"), mdx(\"th\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Description\"), mdx(\"th\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Type\"), mdx(\"th\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Default value\"))), mdx(\"tbody\", {\n    parentName: \"table\"\n  }, mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"allowInputDrag\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Whether to allow dragging when clicking on native input/textarea\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"boolean\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"false\")), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"allowMove\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Determine whether dragging is allowed when clicking/touching.\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"(event: TouchEvent \", \"|\", \"MouseEvent, element: ReactNode) => boolean\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"-\")), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"constrainer\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Returns the element that limits the draggable range.\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"() => ReactNode \", \"|\", \" 'parent'\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"-\")), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"customMove\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Customize position processing after dragging\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"(element: ReactNode, top: number, left: number) => void\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"-\")), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"handler\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Returns the element that triggers dragging.\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"() => ReactNode\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"-\")), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"onMouseDown\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Callback when mouse is pressed\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"(e: MouseEvent) => void\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"-\")), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"onMouseMove\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Callback when mouse moves\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"(e: MouseEvent) => void\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"-\")), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"onMouseUp\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Callback when mouse is raised\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"(e: MouseEvent) => void\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"-\")), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"onTouchCancel\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Callback when touch cancels\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"(e: TouchEvent) => void\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"-\")), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"onTouchEnd\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"callback when touch ends\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"(e: TouchEvent) => void\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"-\")), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"onTouchMove\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Callback when touch moves\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"(e: TouchEvent) => void\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"-\")), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"onTouchStart\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Callback when touch starts\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"(e: TouchEvent) => void\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"-\"))))));\n}\n;\nMDXContent.isMDXComponent = true;"}},"pageContext":{"slug":"en-US/plus/dragMove","next":{"fields":{"slug":"zh-CN/plus/dragMove"},"id":"6ac51670-5068-5df9-9d43-c95bd58d79b0","frontmatter":{"title":"DragMove 拖拽移动","localeCode":"zh-CN","icon":"doc-dragmove","showNew":null}},"previous":{"fields":{"slug":"zh-CN/plus/markdownrender"},"id":"712d716c-560a-5288-9c5c-4594de1b342f","frontmatter":{"title":"Markdown 渲染器","localeCode":"zh-CN","icon":"doc-markdown","showNew":null}}}},"staticQueryHashes":["1348983216898582","1477422646898582","3245198693898582","417590761898582","63159454898582"]}