UNPKG

gui-one-nutui-react-taro

Version:

京东风格的轻量级移动端 React 组件库,支持一套代码生成 H5 和小程序

154 lines (153 loc) 6.13 kB
import _slicedToArray from "@babel/runtime/helpers/slicedToArray"; import _defineProperty from "@babel/runtime/helpers/defineProperty"; import _objectWithoutProperties from "@babel/runtime/helpers/objectWithoutProperties"; var _excluded = ["attract", "direction", "boundary", "children", "className", "style"]; function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; } function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; } import React__default, { useState, useRef, useEffect } from 'react'; import Taro, { eventCenter, getCurrentInstance } from '@tarojs/taro'; import { c as cn } from './bem-893ad28d.js'; var defaultProps = { attract: false, direction: undefined, boundary: { top: 0, left: 0, right: 0, bottom: 0 }, className: 'myDrag' }; var Drag = function Drag(props) { var _defaultProps$props = _objectSpread(_objectSpread({}, defaultProps), props), attract = _defaultProps$props.attract, direction = _defaultProps$props.direction, boundary = _defaultProps$props.boundary, children = _defaultProps$props.children, className = _defaultProps$props.className, style = _defaultProps$props.style, reset = _objectWithoutProperties(_defaultProps$props, _excluded); var b = cn('drag'); var _useState = useState(boundary), _useState2 = _slicedToArray(_useState, 2), boundaryState = _useState2[0], setBoundaryState = _useState2[1]; var myDrag = useRef(null); var dragRef = useRef(null); var _useState3 = useState({}), _useState4 = _slicedToArray(_useState3, 2), currstyle = _useState4[0], setCurrStyle = _useState4[1]; var timer = useRef(0); var axisCache = useRef({ x: 0, y: 0 }); var transformCache = useRef({ x: 0, y: 0 }); var translateX = useRef(0); var translateY = useRef(0); var middleLine = useRef(0); var getInfo = function getInfo() { var el = myDrag.current; if (el) { var top = boundary.top, left = boundary.left, bottom = boundary.bottom, right = boundary.right; var _Taro$getSystemInfoSy = Taro.getSystemInfoSync(), screenWidth = _Taro$getSystemInfoSy.screenWidth, windowHeight = _Taro$getSystemInfoSy.windowHeight; Taro.createSelectorQuery().select(".".concat(className)).boundingClientRect(function (rec) { // console.log(rec.height, rec.width) setBoundaryState({ top: -rec.top + top, left: -rec.left + left, bottom: windowHeight - rec.height - rec.top - bottom, right: screenWidth - rec.width - rec.left - right }); middleLine.current = screenWidth - rec.width - rec.left - (screenWidth - rec.width) / 2; }).exec(); } }; var touchStart = function touchStart(e) { e.currentTarget; var touches = e.touches[0]; axisCache.current = { x: touches.clientX, y: touches.clientY }; transformCache.current = { x: translateX.current, y: translateY.current }; }; var touchMove = function touchMove(e) { e.preventDefault(); if (e.touches.length === 1 && dragRef.current) { var touch = e.touches[0]; var x = touch.clientX - axisCache.current.x; var y = touch.clientY - axisCache.current.y; translateX.current = x + transformCache.current.x; translateY.current = y + transformCache.current.y; // 边界判断 if (translateX.current < boundaryState.left) { translateX.current = boundaryState.left; } else if (translateX.current > boundaryState.right) { translateX.current = boundaryState.right; } if (translateY.current < boundaryState.top) { translateY.current = boundaryState.top; } else if (translateY.current > boundaryState.bottom) { translateY.current = boundaryState.bottom; } var transform = "translate3d(".concat(props.direction !== 'y' ? translateX.current : 0, "px, ").concat(props.direction !== 'x' ? translateY.current : 0, "px, 0px)"); setCurrStyle({ transform: transform }); } }; var touchEnd = function touchEnd(e) { if (props.direction !== 'y' && props.attract && dragRef.current) { if (translateX.current < middleLine.current) { translateX.current = boundaryState.left; } else { translateX.current = boundaryState.right; } var transform = "translate3d(".concat(translateX.current, "px, ").concat(props.direction !== 'x' ? translateY.current : 0, "px, 0px)"); setCurrStyle({ transform: transform }); } }; useEffect(function () { eventCenter.once(getCurrentInstance().router.onReady, function () { timer.current = setTimeout(function () { getInfo(); }, 200); }); return function () { clearTimeout(timer.current); }; }, []); return React__default.createElement("div", _objectSpread(_objectSpread({ style: style, className: "".concat(b(), " ").concat(className) }, reset), {}, { ref: myDrag }), React__default.createElement("div", { onTouchStart: function onTouchStart(event) { return touchStart(event); }, ref: dragRef, onTouchMove: touchMove, onTouchEnd: touchEnd, // eslint-disable-next-line react/no-unknown-property style: currstyle }, children)); }; Drag.defaultProps = defaultProps; Drag.displayName = 'NutDrag'; export { Drag as D };