uni-app实现列表拖动排序的代码,要求兼容小程序和APP【跨平台开发教程uniapp教程(米饭科技-app小程序h5源码)】

28 篇文章 0 订阅
22 篇文章 0 订阅

1. uni-app实现列表拖动排序

拖动排序的代码

以下是实现列表拖动排序的代码,要求兼容小程序和APP的示例:

<template>
  <view class="container">
    <view
      class="item"
      v-for="(item, index) in list"
      :key="item.id"
      :ref="'item-' + index"
      :data-index="index"
      :style="{ transform: 'translateY(' + item.translateY + 'px)' }"
      @touchstart="onTouchStart(index, $event)"
      @touchmove="onTouchMove($event)"
      @touchend="onTouchEnd"
    >
      {{ item.name }}
    </view>
  </view>
</template>

<script>
export default {
  data() {
    return {
      list: [
        { id: 1, name: 'item 1', translateY: 0, startY: 0 },
        { id: 2, name: 'item 2', translateY: 0, startY: 0 },
        { id: 3, name: 'item 3', translateY: 0, startY: 0 },
        { id: 4, name: 'item 4', translateY: 0, startY: 0 },
      ],
      curIndex: -1,
    };
  },
  methods: {
    onTouchStart(index, event) {
      this.list.forEach((item) => {
        item.translateY = 0;
      });
      this.curIndex = index;
      this.list[index].startY = event.touches[0].clientY;
    },
    onTouchMove(event) {
      const {
        clientY
      } = event.touches[0];
      const translateY = clientY - this.list[this.curIndex].startY;
      this.list[this.curIndex].translateY = translateY;
      if (translateY > 0) {
        for (let i = this.curIndex + 1, len = this.list.length; i < len; i++) {
          const distance = i - this.curIndex;
          if (this.list[i].translateY !== distance * 60) {
            this.list[i].translateY = distance * 60;
          }
        }
      } else if (translateY < 0) {
        for (let i = this.curIndex - 1; i >= 0; i--) {
          const distance = this.curIndex - i;
          if (this.list[i].translateY !== distance * -60) {
            this.list[i].translateY = distance * -60;
          }
        }
      }
    },
    onTouchEnd() {
      const curItem = this.list[this.curIndex];
      const curY = curItem.translateY;
      const distance = Math.round(curY / 60);
      const targetIndex = this.curIndex + distance;
      if (targetIndex >= 0 && targetIndex < this.list.length && targetIndex !== this.curIndex) {
        const moveItem = this.list.splice(this.curIndex, 1)[0];
        this.list.splice(targetIndex, 0, moveItem);
        this.$forceUpdate();
      } else {
        this.list[this.curIndex].translateY = 0;
      }
      this.curIndex = -1;
    },
  },
};
</script>

<style>
.container {
  display: flex;
  flex-direction: column;
  align-items: center;
}
.item {
  width: 100%;
  height: 60px;
  line-height: 60px;
  border-bottom: 1px solid #eee;
  text-align: center;
  background-color: #fff;
  font-size: 16px;
  user-select: none;
}
</style>

此示例中,使用touch事件处理列表项的拖动排序,通过计算移动距离,实现了列表项的位置重排。同时借助translateY属性,使得列表项在拖动过程中能够有平滑的移动效果。

在小程序中使用该组件时,需要在page.json中添加如下配置:

{
  "usingComponents": {
    "drag-sort-list": "/components/drag-sort-list/drag-sort-list"
  }
}

在app中使用该组件时,直接在页面中引入即可。


源码获取方法:

需要完整源码的朋友,希望你能点赞+收藏+评论,然后私信我即可~

会员学习群:

可添加学习会员小助手咨询(微信:mifankeji77)

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
uni-app中,可以通过自定义指令来实现自适应DPR加载图片,并且可以兼容小程序H5App。具体步骤如下: 1. 在项目的`main.js`中注册自定义指令: ```javascript import Vue from 'vue'; import App from './App'; Vue.config.productionTip = false; // 注册自定义指令 Vue.directive('adapt-img', { bind: function (el, binding) { let dpr = uni.getSystemInfoSync().pixelRatio; let value = binding.value; if (value) { if (dpr >= 3 && value.indexOf('@3x') !== -1) { el.setAttribute('src', value.replace('@3x', '')); } else if (dpr >= 2 && value.indexOf('@2x') !== -1) { el.setAttribute('src', value.replace('@2x', '')); } else { el.setAttribute('src', value); } } }, }); App.mpType = 'app'; const app = new Vue({ ...App, }); app.$mount(); ``` 这里注册了一个名为`adapt-img`的自定义指令,当该指令绑定到元素上时,会根据当前设备的DPR加载对应的图片。这里使用了uni-app提供的`uni.getSystemInfoSync().pixelRatio`来获取当前设备的DPR,从而实现兼容小程序H5App的效果。 2. 在需要使用自适应DPR加载图片的地方,将自定义指令`adapt-img`绑定到`<img>`标签上,并设置图片路径: ```html <template> <div class="demo"> <img v-adapt-img src="@/static/img/[email protected]" /> </div> </template> <style> .demo img { width: 100px; height: 100px; } </style> ``` 这里将自定义指令`adapt-img`绑定到`<img>`标签上,并设置图片路径为`@/static/img/[email protected]`。在绑定指令时,可以将图片路径作为指令的值传递过去。 3. 在图片文件夹中,只需要提供@2x和@3x倍图即可,不需要提供@1x倍图。 这样,当页面加载时,自定义指令会根据当前设备的DPR加载对应的图片,如果当前设备的DPR为1,则会加载原始图片。 需要注意的是,如果图片文件名中包含了`@2x`或`@3x`,需要在指令中进行判断并替换。如果图片文件名中没有包含`@2x`或`@3x`,则直接加载原始图片。同时,由于uni-app兼容性特性,该自定义指令可以兼容小程序H5App

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值