ソースを参照

Merge branch 'v4' of https://github.com/jdf2e/nutui into v4

Ymm0008 3 年 前
コミット
e82a6a8ec5

+ 185 - 0
src/packages/__VUE/addresslist/components/GeneralShell.taro.vue

@@ -0,0 +1,185 @@
+<template>
+  <div class="nut-address-list-general" v-if="!swipeEdition">
+    <component :is="renderCompontent()" @touchstart="holddownstart" @touchend="holddownend" @touchmove="holddownmove">
+      <template v-slot:contentTop>
+        <slot name="contentInfo"></slot>
+      </template>
+      <template v-slot:contentIcon>
+        <slot name="contentIcons"></slot>
+      </template>
+      <template v-slot:contentAddr>
+        <slot name="contentAddrs"></slot>
+      </template>
+    </component>
+    <div class="nut-address-list-general__mask" v-if="longPress && showMaskRef" @click="maskClick">
+      <slot name="longpressAll">
+        <div class="nut-address-list-general__mask-copy" @click="copyCLick">
+          <div class="nut-address-list-mask-contain"> 复制<br />地址 </div>
+        </div>
+        <div class="nut-address-list-general__mask-set" @click="setDefault">
+          <div class="nut-address-list-mask-contain"> 设置<br />默认 </div>
+        </div>
+        <div class="nut-address-list-general__mask-del" @click="delLongClick">
+          <div class="nut-address-list-mask-contain"> 删除<br />地址 </div>
+        </div>
+      </slot>
+    </div>
+    <div class="nut-address-list__mask-bottom" v-if="showMaskRef" @click="hideMaskClick"></div>
+  </div>
+  <nut-swipe v-else>
+    <div class="nut-address-list-swipe">
+      <component :is="renderCompontent()" @touchmove="swipemove" @touchstart="swipestart">
+        <template v-slot:contentTop>
+          <slot name="contentInfo"></slot>
+        </template>
+        <template v-slot:contentIcon>
+          <slot name="contentIcons"></slot>
+        </template>
+        <template v-slot:contentAddr>
+          <slot name="contentAddrs"></slot>
+        </template>
+      </component>
+    </div>
+    <template #right>
+      <slot name="swiperightbtn">
+        <nut-button shape="square" style="height: 100%" type="danger" @click="swipeDelClick">删除</nut-button>
+      </slot>
+    </template>
+  </nut-swipe>
+</template>
+<script lang="ts">
+import { ref, h } from 'vue';
+import { createComponent } from '@/packages/utils/create';
+const { create } = createComponent('address-list-general');
+import ItemContents from './ItemContents.taro.vue';
+import Button from '../../button/index.taro.vue';
+import Swipe from '../../swipe/index.taro.vue';
+
+export default create({
+  props: {
+    item: {
+      type: Object,
+      default: {}
+    },
+    longPress: {
+      type: Boolean,
+      default: false
+    },
+    swipeEdition: {
+      type: Boolean,
+      default: false
+    }
+  },
+  emits: ['delIcon', 'editIcon', 'itemClick', 'longDown', 'longCopy', 'longSet', 'longDel', 'swipeDel'],
+  components: {
+    ItemContents,
+    [Button.name]: Button,
+    [Swipe.name]: Swipe
+  },
+
+  setup(props, { emit }) {
+    const renderCompontent = () => {
+      return h(ItemContents, {
+        item: props.item,
+        onDelIcon(event: Event) {
+          delClick(event);
+        },
+        onEditIcon(event: Event) {
+          editClick(event);
+        },
+        onItemClick(event: Event) {
+          itemClick(event);
+        }
+      });
+    };
+    let loop: any = null;
+    const moveRef = ref(false);
+    const showMaskRef = ref(false);
+
+    const delClick = (event: Event) => {
+      emit('delIcon', event, props.item);
+      event.stopPropagation();
+    };
+    const editClick = (event: Event) => {
+      emit('editIcon', event, props.item);
+      event.stopPropagation();
+    };
+    const itemClick = (event: Event) => {
+      if (moveRef.value) return;
+      emit('itemClick', event, props.item);
+      event.stopPropagation();
+    };
+    const delLongClick = (event: Event) => {
+      emit('longDel', event, props.item);
+      event.stopPropagation();
+    };
+    const holdingFunc = (event: Event) => {
+      loop = 0;
+      showMaskRef.value = true;
+      emit('longDown', event, props.item);
+    };
+    // 长按功能实现
+    const holddownstart = (event: Event) => {
+      loop = setTimeout(() => {
+        holdingFunc(event);
+      }, 300);
+    };
+    const holddownmove = () => {
+      // 滑动不触发长按
+      clearTimeout(loop);
+    };
+    const holddownend = () => {
+      // 删除定时器,防止重复注册
+      clearTimeout(loop);
+    };
+    const hideMaskClick = () => {
+      showMaskRef.value = false;
+    };
+    const copyCLick = (event: Event) => {
+      emit('longCopy', event, props.item);
+      event.stopPropagation();
+    };
+    const setDefault = (event: Event) => {
+      emit('longSet', event, props.item);
+      event.stopPropagation();
+    };
+    const maskClick = (event: Event) => {
+      if (loop != 0) {
+        // 排除长按时触发点击的情况
+        showMaskRef.value = false;
+      }
+      event.stopPropagation();
+      event.preventDefault();
+    };
+    const swipeDelClick = (event: Event) => {
+      emit('swipeDel', event, props.item);
+      event.stopPropagation();
+    };
+    const swipestart = () => {
+      moveRef.value = false;
+    };
+    const swipemove = () => {
+      moveRef.value = true;
+    };
+
+    return {
+      renderCompontent,
+      showMaskRef,
+      itemClick,
+      editClick,
+      delClick,
+      delLongClick,
+      holddownstart,
+      holddownmove,
+      holddownend,
+      copyCLick,
+      hideMaskClick,
+      setDefault,
+      maskClick,
+      swipeDelClick,
+      swipestart,
+      swipemove
+    };
+  }
+});
+</script>

+ 6 - 2
src/packages/__VUE/addresslist/components/GeneralShell.vue

@@ -50,8 +50,10 @@
 <script lang="ts">
 import { ref, h } from 'vue';
 import { createComponent } from '@/packages/utils/create';
-const { create } = createComponent('addresslist-general');
+const { create } = createComponent('address-list-general');
 import ItemContents from './ItemContents.vue';
+import Button from '../../button/index.vue';
+import Swipe from '../../swipe/index.vue';
 
 export default create({
   props: {
@@ -70,7 +72,9 @@ export default create({
   },
   emits: ['delIcon', 'editIcon', 'itemClick', 'longDown', 'longCopy', 'longSet', 'longDel', 'swipeDel'],
   components: {
-    ItemContents
+    ItemContents,
+    [Button.name]: Button,
+    [Swipe.name]: Swipe
   },
 
   setup(props, { emit }) {

+ 64 - 0
src/packages/__VUE/addresslist/components/ItemContents.taro.vue

@@ -0,0 +1,64 @@
+<template>
+  <div class="nut-address-list-item" @click="contentsClick">
+    <div class="nut-address-list-item__info">
+      <div class="nut-address-list-item__info-contact">
+        <slot name="contentTop">
+          <div class="nut-address-list-item__info-contact-name">{{ item.addressName }}</div>
+          <div class="nut-address-list-item__info-contact-tel">{{ item.phone }}</div>
+          <div class="nut-address-list-item__info-contact-default" v-if="item.defaultAddress">{{
+            translate('default')
+          }}</div>
+        </slot>
+      </div>
+      <div class="nut-address-list-item__info-handle">
+        <slot name="contentIcon">
+          <Del name="del" class="nut-address-list-item__info-handle-del" @click="delClick"></Del>
+          <Edit name="edit" class="nut-address-list-item__info-handle-edit" @click="editClick"></Edit>
+        </slot>
+      </div>
+    </div>
+    <div class="nut-address-list-item__addr">
+      <slot name="contentAddr">
+        {{ item.fullAddress }}
+      </slot>
+    </div>
+  </div>
+</template>
+<script lang="ts">
+import { createComponent } from '@/packages/utils/create';
+const { create } = createComponent('address-list-item');
+const { translate } = createComponent('address-list');
+import { Del, Edit } from '@nutui/icons-vue-taro';
+export default create({
+  components: { Del, Edit },
+  props: {
+    item: {
+      type: Object,
+      default: {}
+    }
+  },
+  emits: ['delIcon', 'editIcon', 'itemClick'],
+
+  setup(props, { emit }) {
+    const delClick = (event: Event) => {
+      emit('delIcon', event, props.item);
+      event.stopPropagation();
+    };
+    const editClick = (event: Event) => {
+      emit('editIcon', event, props.item);
+      event.stopPropagation();
+    };
+    const contentsClick = (event: Event) => {
+      emit('itemClick', event, props.item);
+      event.stopPropagation();
+    };
+
+    return {
+      delClick,
+      editClick,
+      contentsClick,
+      translate
+    };
+  }
+});
+</script>

+ 2 - 2
src/packages/__VUE/addresslist/components/ItemContents.vue

@@ -26,8 +26,8 @@
 </template>
 <script lang="ts">
 import { createComponent } from '@/packages/utils/create';
-const { create } = createComponent('addresslist-item');
-const { translate } = createComponent('addresslist');
+const { create } = createComponent('address-list-item');
+const { translate } = createComponent('address-list');
 import { Del, Edit } from '@nutui/icons-vue';
 export default create({
   components: { Del, Edit },

+ 2 - 4
src/packages/__VUE/addresslist/index.taro.vue

@@ -39,10 +39,9 @@
 import { reactive, onMounted, ref, watch, computed } from 'vue';
 import { createComponent } from '@/packages/utils/create';
 const { componentName, create, translate } = createComponent('address-list');
-import GeneralShell from './components/GeneralShell.vue';
+import GeneralShell from './components/GeneralShell.taro.vue';
 import { floatData } from '@/packages/utils/util';
 import Button from '../button/index.taro.vue';
-import Swipe from '../swipe/index.taro.vue';
 export default create({
   props: {
     data: {
@@ -68,8 +67,7 @@ export default create({
   },
   components: {
     GeneralShell,
-    [Button.name]: Button,
-    [Swipe.name]: Swipe
+    [Button.name]: Button
   },
   emits: ['delIcon', 'editIcon', 'itemClick', 'longCopy', 'longSet', 'longDel', 'swipeDel', 'add'],
 

+ 1 - 3
src/packages/__VUE/addresslist/index.vue

@@ -42,7 +42,6 @@ const { componentName, create, translate } = createComponent('address-list');
 import GeneralShell from './components/GeneralShell.vue';
 import { floatData } from '@/packages/utils/util';
 import Button from '../button/index.vue';
-import Swipe from '../swipe/index.vue';
 export default create({
   props: {
     data: {
@@ -68,8 +67,7 @@ export default create({
   },
   components: {
     GeneralShell,
-    [Button.name]: Button,
-    [Swipe.name]: Swipe
+    [Button.name]: Button
   },
   emits: ['delIcon', 'editIcon', 'itemClick', 'longCopy', 'longSet', 'longDel', 'swipeDel', 'add'],