GeneralShell.vue 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185
  1. <template>
  2. <div class="nut-address-list-general" v-if="!swipeEdition">
  3. <component :is="renderCompontent()" @touchstart="holddownstart" @touchend="holddownend" @touchmove="holddownmove">
  4. <template v-slot:contentTop>
  5. <slot name="contentInfo"></slot>
  6. </template>
  7. <template v-slot:contentIcon>
  8. <slot name="contentIcons"></slot>
  9. </template>
  10. <template v-slot:contentAddr>
  11. <slot name="contentAddrs"></slot>
  12. </template>
  13. </component>
  14. <div class="nut-address-list-general__mask" v-if="longPress && showMaskRef" @click="maskClick">
  15. <slot name="longpressAll">
  16. <div class="nut-address-list-general__mask-copy" @click="copyCLick">
  17. <div class="nut-address-list-mask-contain"> 复制<br />地址 </div>
  18. </div>
  19. <div class="nut-address-list-general__mask-set" @click="setDefault">
  20. <div class="nut-address-list-mask-contain"> 设置<br />默认 </div>
  21. </div>
  22. <div class="nut-address-list-general__mask-del" @click="delLongClick">
  23. <div class="nut-address-list-mask-contain"> 删除<br />地址 </div>
  24. </div>
  25. </slot>
  26. </div>
  27. <div class="nut-address-list__mask-bottom" v-if="showMaskRef" @click="hideMaskClick"></div>
  28. </div>
  29. <nut-swipe v-else>
  30. <div class="nut-address-list-swipe">
  31. <component :is="renderCompontent()" @touchmove="swipemove" @touchstart="swipestart">
  32. <template v-slot:contentTop>
  33. <slot name="contentInfo"></slot>
  34. </template>
  35. <template v-slot:contentIcon>
  36. <slot name="contentIcons"></slot>
  37. </template>
  38. <template v-slot:contentAddr>
  39. <slot name="contentAddrs"></slot>
  40. </template>
  41. </component>
  42. </div>
  43. <template #right>
  44. <slot name="swiperightbtn">
  45. <nut-button shape="square" style="height: 100%" type="danger" @click="swipeDelClick">删除</nut-button>
  46. </slot>
  47. </template>
  48. </nut-swipe>
  49. </template>
  50. <script lang="ts">
  51. import { ref, h } from 'vue';
  52. import { createComponent } from '@/packages/utils/create';
  53. const { create } = createComponent('address-list-general');
  54. import ItemContents from './ItemContents.vue';
  55. import Button from '../../button/index.vue';
  56. import Swipe from '../../swipe/index.vue';
  57. export default create({
  58. props: {
  59. item: {
  60. type: Object,
  61. default: {}
  62. },
  63. longPress: {
  64. type: Boolean,
  65. default: false
  66. },
  67. swipeEdition: {
  68. type: Boolean,
  69. default: false
  70. }
  71. },
  72. emits: ['delIcon', 'editIcon', 'itemClick', 'longDown', 'longCopy', 'longSet', 'longDel', 'swipeDel'],
  73. components: {
  74. ItemContents,
  75. [Button.name]: Button,
  76. [Swipe.name]: Swipe
  77. },
  78. setup(props, { emit }) {
  79. const renderCompontent = () => {
  80. return h(ItemContents, {
  81. item: props.item,
  82. onDelIcon(event: Event) {
  83. delClick(event);
  84. },
  85. onEditIcon(event: Event) {
  86. editClick(event);
  87. },
  88. onItemClick(event: Event) {
  89. itemClick(event);
  90. }
  91. });
  92. };
  93. let loop: any = null;
  94. const moveRef = ref(false);
  95. const showMaskRef = ref(false);
  96. const delClick = (event: Event) => {
  97. emit('delIcon', event, props.item);
  98. event.stopPropagation();
  99. };
  100. const editClick = (event: Event) => {
  101. emit('editIcon', event, props.item);
  102. event.stopPropagation();
  103. };
  104. const itemClick = (event: Event) => {
  105. if (moveRef.value) return;
  106. emit('itemClick', event, props.item);
  107. event.stopPropagation();
  108. };
  109. const delLongClick = (event: Event) => {
  110. emit('longDel', event, props.item);
  111. event.stopPropagation();
  112. };
  113. const holdingFunc = (event: Event) => {
  114. loop = 0;
  115. showMaskRef.value = true;
  116. emit('longDown', event, props.item);
  117. };
  118. // 长按功能实现
  119. const holddownstart = (event: Event) => {
  120. loop = setTimeout(() => {
  121. holdingFunc(event);
  122. }, 300);
  123. };
  124. const holddownmove = () => {
  125. // 滑动不触发长按
  126. clearTimeout(loop);
  127. };
  128. const holddownend = () => {
  129. // 删除定时器,防止重复注册
  130. clearTimeout(loop);
  131. };
  132. const hideMaskClick = () => {
  133. showMaskRef.value = false;
  134. };
  135. const copyCLick = (event: Event) => {
  136. emit('longCopy', event, props.item);
  137. event.stopPropagation();
  138. };
  139. const setDefault = (event: Event) => {
  140. emit('longSet', event, props.item);
  141. event.stopPropagation();
  142. };
  143. const maskClick = (event: Event) => {
  144. if (loop != 0) {
  145. // 排除长按时触发点击的情况
  146. showMaskRef.value = false;
  147. }
  148. event.stopPropagation();
  149. event.preventDefault();
  150. };
  151. const swipeDelClick = (event: Event) => {
  152. emit('swipeDel', event, props.item);
  153. event.stopPropagation();
  154. };
  155. const swipestart = () => {
  156. moveRef.value = false;
  157. };
  158. const swipemove = () => {
  159. moveRef.value = true;
  160. };
  161. return {
  162. renderCompontent,
  163. showMaskRef,
  164. itemClick,
  165. editClick,
  166. delClick,
  167. delLongClick,
  168. holddownstart,
  169. holddownmove,
  170. holddownend,
  171. copyCLick,
  172. hideMaskClick,
  173. setDefault,
  174. maskClick,
  175. swipeDelClick,
  176. swipestart,
  177. swipemove
  178. };
  179. }
  180. });
  181. </script>