小程序自定义拖动排序(uniapp)

这篇具有很好参考价值的文章主要介绍了小程序自定义拖动排序(uniapp)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

小程序自定义拖动排序(uniapp)

1.用到的组件和事件
1)组件movable-area,movable-view
2) @touchend(拖动离开事件),movable-view的onChange事件,自定义克隆事件dragChange,自定义顶置事件overheadChange
注意:给每个盒子设定固定高度

过程:
点击拖动:设置可移动区域,循环数组,movable-view写要移动的盒子(用点击事件点击要移动的数据进行克隆,把数据从当前数组中摘取出来放入movable-view进行移动),再利用onChange事件捕捉x,y轴,利用设置的盒子高度和当前获取的y轴数据判断当前数组的下标。当手指离开触发拖动离开事件(把克隆数据插入数组的下标位置(onchange事件获取的下标)。
顶置:用splice方法返回删除的数组中的某一数据,再用unshift方法放到数组第一位。

可用参数

 kelongList = {};
  classClass = 0;
  sortList: Array<any> = [
    {
      labelLevel: 0,
      labelId: 0,
      tagName: "关于我的",
      campusShootingLabelType: 0,
      createUserType: 0,
    },
    {
      labelLevel: 0,
      labelId: 0,
      tagName: "我发布的",
      campusShootingLabelType: 0,
      createUserType: 0,
    },
  ];

  x = 0;
  y = 0;
  old = {
    x: 0,
    y: 0,
  };
  pagesX = 0;
  pagesY = 0;
  moveIndex = -1;
  monitor = 0; //初始值0:监听拖动的盒子可出现  1:显示拖动的盒子  2:不显示拖动的盒子
  kelongIndex = -1; //初始值 代表没有被移动的标签

1.movable-area指代可拖动的范围,在其中内嵌movable-view组件用于指示可拖动的区域。

 <movable-area>
      <view class="container">
        <view class="" v-for="(item, index) in sortList" :key="index">
          <!-- <view class="move_null" v-show="index == moveIndex"> </view> -->

          <view class="flex justify-between conBox padding-lg">
            <view class="title">{{ item.tagName }}</view>
            <view class="flex">
              <view class="Over" @click="overheadChange($event, index, item)">
                <text
                  v-if="index == 0"
                  class="lg text-orange cuIcon-check"
                ></text>
                <image
                  v-else
                  src="/pagesTaskLeave/static/overhead.png"
                  style="weight: 48rpx; height: 48rpx"
                ></image>
              </view>
              <view class="sort" @click="dragChange($event, index, item)"
                ><image
                  src="/pagesTaskLeave/static/antOutline.png"
                  style=""
                ></image
              ></view>
            </view>
          </view>
        </view>
        <view class="list_bottom"> </view>
      </view>

      <movable-view
        :x="x"
        :y="pagesY"
        direction="vertical"
        v-show="pagesX != 0 && pagesY != 0 && monitor == 1"
        @change="onChange"
      >
        <view class="bg-green flex justify-between moveBox" @touchend="tap">
          <view>{{ kelongList[0].tagName }}</view>
          <view style="margin-left: 186rpx">
            <image
              src="/pagesTaskLeave/static/overhead.png"
              style="width: 48rpx; height: 48rpx"
            ></image
          ></view>
          <view style="margin-right: 14rpx"
            ><image
              src="/pagesTaskLeave/static/antOutline.png"
              style="width: 48rpx; height: 48rpx"
            ></image
          ></view>
        </view>
      </movable-view>
    </movable-area>

2.点击进行克隆,并且数据放入movable-view就能移动

 // 克隆
  dragChange(e: any, index: any, item: any) {
    //如果有克隆下标,说明上一个移动还没结束,不对其他标签有克隆的点击事件
    console.log(index);
    if (this.kelongIndex != -1) {
      return;
    } else {
      console.log("kelongIndex:" + this.kelongList);
    }
    this.kelongIndex = index;
    this.monitor = 1;
    this.pagesX = e.detail.x;
    this.pagesY = e.detail.y - 120;
    console.log(e.detail.y);
    console.log(this.pagesY);
    // this.pagesY = parseInt(e.detail.y) - 140;
    var list = this.sortList.splice(index, 1);
    this.kelongList = list;
  }

3.onChange事件捕捉x,y轴,获取移动的下标

onChange(e: any) {
    this.old.x = e.detail.x;
    this.old.y = e.detail.y;

    for (var i = 0; i < 40; i++) {
      var start = i * 35;
      var end = (i + 1) * 35;
      if (this.old.y >= start && this.old.y < end) {
        this.moveIndex = i;
        break;
      }
    }
  }

4.手指离开触发拖动离开事件(把克隆数据插入数组的下标位置(onchange事件获取的下标)。

 //拖动离开事件
  tap(e: any) {
    console.log("移动下标" + this.moveIndex);
    if (this.moveIndex != -1) {
      var list: any = this.kelongList;
      this.sortList.splice(this.moveIndex, 0, list[0]);
      this.kelongList = {};
      this.monitor = 2;
      //确保不出现空
      for (let i = 0; i < this.sortList.length; i++) {
        if (this.sortList[i] == null || this.sortList[i] == undefined) {
          this.sortList.splice(i, 1);
          continue;
        }
      }
      var a = uni.setStorageSync("sort", this.sortList);
      this.moveIndex = -1;
      this.kelongIndex = -1;
    } else {
      var list: any = this.kelongList;
      this.sortList.splice(this.kelongIndex, 0, list[0]);
      this.kelongList = {};
      this.moveIndex = -1;
      this.monitor = 2;
      this.kelongIndex = -1;
    }
  }

顶置

//顶置
  overheadChange(e: any, index: any, item: any) {
    this.classClass = 1;
    var list = this.sortList.splice(index, 1);

    this.sortList.unshift(list[0]);

    var a = uni.setStorageSync("sort", this.sortList);
  }

全部代码文章来源地址https://www.toymoban.com/news/detail-504875.html

<template>
  <view>
    <!-- 顶部导航 -->
    <view>
      <cu-custom bgColor="bg-greenac70" isBack="true">
        <block slot="backText"></block>
        <block slot="content">分类管理</block>
      </cu-custom>
    </view>
    <view>
      <view class="flex justify-between padding-lg topBox">
        <view>分类名称</view>
        <view class="flex">
          <view class="Overhead">顶置</view>
          <view>拖动排序</view>
        </view>
      </view>
    </view>
    <movable-area>
      <view class="container">
        <view class="" v-for="(item, index) in sortList" :key="index">
          <!-- <view class="move_null" v-show="index == moveIndex"> </view> -->

          <view class="flex justify-between conBox padding-lg">
            <view class="title">{{ item.tagName }}</view>
            <view class="flex">
              <view class="Over" @click="overheadChange($event, index, item)">
                <text
                  v-if="index == 0"
                  class="lg text-orange cuIcon-check"
                ></text>
                <image
                  v-else
                  src="/pagesTaskLeave/static/overhead.png"
                  style="weight: 48rpx; height: 48rpx"
                ></image>
              </view>
              <view class="sort" @click="dragChange($event, index, item)"
                ><image
                  src="/pagesTaskLeave/static/antOutline.png"
                  style=""
                ></image
              ></view>
            </view>
          </view>
        </view>
        <view class="list_bottom"> </view>
      </view>

      <movable-view
        :x="x"
        :y="pagesY"
        direction="vertical"
        v-show="pagesX != 0 && pagesY != 0 && monitor == 1"
        @change="onChange"
      >
        <view class="bg-green flex justify-between moveBox" @touchend="tap">
          <view>{{ kelongList[0].tagName }}</view>
          <view style="margin-left: 186rpx">
            <image
              src="/pagesTaskLeave/static/overhead.png"
              style="width: 48rpx; height: 48rpx"
            ></image
          ></view>
          <view style="margin-right: 14rpx"
            ><image
              src="/pagesTaskLeave/static/antOutline.png"
              style="width: 48rpx; height: 48rpx"
            ></image
          ></view>
        </view>
      </movable-view>
    </movable-area>
  </view>
</template>

<script lang="ts">
import { Vue, Component } from "vue-property-decorator";
import RequestPageBase from "@/lib/request-page-base";
// import func from "vue-temp/vue-editor-bridge";
import { filter } from "vue/types/umd";
import Splash from "@/pages/splash/index.vue";

@Component({})
export default class 文件名称 extends RequestPageBase {
  kelongList = {};
  classClass = 0;
  sortList: Array<any> = [
    {
      labelLevel: 0,
      labelId: 0,
      tagName: "关于我的",
      campusShootingLabelType: 0,
      createUserType: 0,
    },
    {
      labelLevel: 0,
      labelId: 0,
      tagName: "我发布的",
      campusShootingLabelType: 0,
      createUserType: 0,
    },
  ];

  x = 0;
  y = 0;
  old = {
    x: 0,
    y: 0,
  };
  pagesX = 0;
  pagesY = 0;
  moveIndex = -1;
  monitor = 0; //初始值0:监听拖动的盒子可出现  1:显示拖动的盒子  2:不显示拖动的盒子
  kelongIndex = -1; //初始值 代表没有被移动的标签
  onLoad() {
    this.sortList = uni.getStorageSync("sort");
  }

  //拖动离开事件
  tap(e: any) {
    console.log("移动下标" + this.moveIndex);
    if (this.moveIndex != -1) {
      var list: any = this.kelongList;
      this.sortList.splice(this.moveIndex, 0, list[0]);
      this.kelongList = {};
      this.monitor = 2;
      //确保不出现空
      for (let i = 0; i < this.sortList.length; i++) {
        if (this.sortList[i] == null || this.sortList[i] == undefined) {
          this.sortList.splice(i, 1);
          continue;
        }
      }
      var a = uni.setStorageSync("sort", this.sortList);
      this.moveIndex = -1;
      this.kelongIndex = -1;
    } else {
      var list: any = this.kelongList;
      this.sortList.splice(this.kelongIndex, 0, list[0]);
      this.kelongList = {};
      this.moveIndex = -1;
      this.monitor = 2;
      this.kelongIndex = -1;
    }
  }
  // 克隆
  dragChange(e: any, index: any, item: any) {
    //如果有克隆下标,说明上一个移动还没结束,不对其他标签有克隆的点击事件
    console.log(index);
    if (this.kelongIndex != -1) {
      return;
    } else {
      console.log("kelongIndex:" + this.kelongList);
    }
    this.kelongIndex = index;
    this.monitor = 1;
    this.pagesX = e.detail.x;
    this.pagesY = e.detail.y - 120;
    console.log(e.detail.y);
    console.log(this.pagesY);
    // this.pagesY = parseInt(e.detail.y) - 140;
    var list = this.sortList.splice(index, 1);
    this.kelongList = list;
  }
  //顶置
  overheadChange(e: any, index: any, item: any) {
    this.classClass = 1;
    var list = this.sortList.splice(index, 1);

    this.sortList.unshift(list[0]);

    var a = uni.setStorageSync("sort", this.sortList);
  }

  onChange(e: any) {
    this.old.x = e.detail.x;
    this.old.y = e.detail.y;

    for (var i = 0; i < 40; i++) {
      var start = i * 35;
      var end = (i + 1) * 35;
      if (this.old.y >= start && this.old.y < end) {
        this.moveIndex = i;
        break;
      }
    }
  }
}
</script>

<style lang="less" scoped>
.move_null {
  width: 100%;
  height: 80rpx;
  // background-color: aqua;
}
.list_bottom {
  background-color: #f7f3f3;
  width: 100%;
  height: 80rpx;
}
movable-area {
  movable-view {
    width: 100%;
  }
  width: 100%;
  height: 100%;
  .moveBox {
    height: 80rpx;
    padding: 20rpx 30rpx 0 30rpx;
  }
}
.topBox {
  font-size: 28rpx;
  text-align: left;
  .Overhead {
    margin-right: 100rpx;
  }
}
.container {
  background-color: white;
  .conBox {
    align-items: center;
    height: 80rpx;
    font-size: 28rpx;
    text-align: left;
    border-bottom: 1px solid rgb(244, 242, 242);

    .Over {
      margin-right: 150rpx;
      width: 48rpx;
      height: 48rpx;
      font-size: 48rpx;
    }
    .sort {
      margin-right: 20rpx;
      width: 48rpx;
      height: 48rpx;
      image {
        width: 48rpx;
        height: 48rpx;
      }
    }
  }
}
</style>

到了这里,关于小程序自定义拖动排序(uniapp)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • uniapp微信小程序自定义弹窗组件

    写一个能够复用的弹窗组件,内容包括: \\\"标题\\\",\\\"图片\\\",\\\"描述内容\\\",\\\"按钮\\\". 且按钮可能会有多中功能(比如: 点击按钮可能只是关闭弹窗,或者关闭弹窗并跳转) 1.创建弹窗组件 popup-view 1.小编这里考虑组件全局都有可能会用到,就在主包的 components 文件夹下创建popup-view组件 2.组件内

    2024年02月04日
    浏览(30)
  • 【uniapp】小程序自定义一个通用的返回按钮组件

    左边箭头,右边文字可以自定义,但是不要太长,太长可以自己改 .back的width值,改宽一点。 用这个组件的时候首先要在pages.json里把导航栏变成自定义的: 组件:backPages.vue 使用的时候需要传按钮名:backtext = ‘返回或者自定义’ 需要import引入组件并注册components才行,示例

    2024年02月12日
    浏览(34)
  • uniapp&&微信小程序底部弹窗自定义组件

    个人项目地址: SubTopH前端开发个人站   (自己开发的前端功能和UI组件,一些有趣的小功能,感兴趣的伙伴可以访问,欢迎提出更好的想法,私信沟通,网站属于静态页面) SubTopH前端开发个人站 https://subtop.gitee.io/subtoph.github.io/#/home  基础弹窗效果组件 在页面使用 父组件

    2024年02月14日
    浏览(39)
  • uniapp自定义组件在h5显示,微信小程序不显示?

    引入自定义组件不显示,先检查引入是否正确,还不行就下面: 清除一下微信小程序的缓存,全部清除,再重新编译一次应该就行了 还不行,或是偶尔再出现,hbuilder项目关闭重启一下

    2024年02月11日
    浏览(43)
  • uniapp自定义全局loading组件(目前只适配微信小程序)

    1.首先在项目根目录创建vue.config.js文件代码如下; 2.main.js添加这段代码替换uniapp全局loading方法并且全局挂载组件 3.添加loading组件通过vuex控制组件loading状态

    2024年02月06日
    浏览(35)
  • Uniapp开发件微信小程序,自定义组件@click不起作用

    有的人说添加@click后面​ .native,我遇到的问题用这个方法并不行, 最后解决办法是在自定义组件内把事件把点击事件传递出去

    2024年02月11日
    浏览(32)
  • uniapp、小程序自定义选择日、周、月、季、年的时间选择器组件

    本组件用到了uni-ui的uni-popup弹窗组件 废话不多说直接上代码 https://ext.dcloud.net.cn/plugin?id=16387 https://ext.dcloud.net.cn/plugin?id=16387 属性参数说明 : ref用于控制picker的弹出与隐藏,组件内有open和close函数 参数名 作用 类型 默认值 type 控制打开piker时tabs默认显示的位置 String 月 time 显

    2024年03月14日
    浏览(30)
  • uniapp小程序自定义签名面板组件,小程序页面引用实现横屏签字(亲测有效)

    需求: uniapp小程序自定义签字面板组件, canvas手写签名画板, 小程序页面引用实现横屏签字 实现效果: 在项目中创建components文件夹, 在文件夹下创建my-sign组件, 组件下创建my-sign.vue和index.js my-sign.vue组件代码: index.js代码: 在pages.json中添加\\\"pageOrientation\\\": “landscape”, pageOrientation 设

    2024年02月05日
    浏览(31)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包