GeneralShell.vue 5.0 KB

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