自定义VUE与原生js手机端分页操作

VUE分页配置

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
  <link rel="stylesheet" href="https://unpkg.com/vant@2.12/lib/index.css" />
  <script src="https://unpkg.com/vue@2.6/dist/vue.min.js"></script>
  <script src="https://unpkg.com/vant@2.12/lib/vant.min.js"></script>
  <script src="https://lib.baomitu.com/jquery/1.12.4/jquery.min.js"></script>
  <style>
    .dlineui_header {
      width: 100%;
      line-height: 40px;
      background: #fff;
    }

    .dlineui_header .header_box {
      display: flex;
      justify-content: space-between;
    }

    .box_check {
      padding: 10px;
    }

    .box_check .van-checkbox__icon {
      background: #fff;
      border-radius: 50px;
    }

    .content {
      padding-bottom: 60px;
    }

    .content .content_box {
      width: 95%;
      margin: 0 auto;
      margin-top: 10px;
      border-radius: 10px;
      background: #fff;
      padding: 10px;
      display: flex;
      align-items: center;
      height: 50px;
    }

    .content .content_box .img {
      width: 40px;
      height: 40px;
      border-radius: 5px;
      overflow: hidden;
      margin-right: 5px;
    }

    .avatar_Wrap {
      width: 40px;
      height: 40px;
      border-radius: 5px;
    }

    .avatar_Wrap .avatar {
      width: 100%;
      height: 100%;
    }

    .content .content_box .content_box_time {
      display: flex;
      justify-content: space-between;
      padding: 10px 10px;
      border-radius: 5px;
    }

    .title {
      flex: 1;
      margin-left: 10px;
      display: flex;
      flex-direction: column;
      justify-content: space-between;
    }

    .van-search {
      padding: 10px 0;
    }

    .van-search .van-search__content {
      border-radius: 50px;
      background-color: #edf0f8;
    }


    .time {
      text-align: right;
      padding-left: 15px;
      color: #919191;
      font-size: 16px;
    }

    .bottom {
      position: fixed;
      bottom: 0;
      width: 100%;
      max-width: 640px;
      margin: 0 auto;
      height: 60px;
      font-size: 18px;
      text-align: center;
      background: #fff;
      display: flex;
      justify-content: center;
      align-items: center;
    }


    .find .van-cell {
      width: 90%;
      margin: 0 auto;
      background: #eee;
      border-radius: 50px;
      line-height: 15px;
    }
  </style>
</head>
<!-- 定制页头 开始 -->
<script>
  $("#header .header_title").html("发放证书");
  $("title").html("发放证书");
</script>
<!-- 定制页头 结束 -->

<body>
  <div id="app">
    <van-sticky>
      <div class="dlineui_header">
        <div class="header_box" id="J_header_stype">
          <div class="header_leftarea">
            <div class="btn_back">
              1
            </div>
          </div>
          <div class="header_title">
            <span>已报俱乐部</span>
          </div>
          <div></div>
        </div>
        <div class="top_seach">
          <form action="">
            <van-search v-model="keyword" :clearable="false" label="" placeholder="请输入搜索关键词" @search="onSearch">
              <template #right-icon>
                <van-icon name="clear" style="cursor: pointer;" @click="onclear" v-if="keyword != ''" />
              </template>
            </van-search>
          </form>
        </div>
      </div>
    </van-sticky>
    <!-- 内容 全选反选 -->
    <div class="box_check" style="display: flex;align-items: center;">
      <van-checkbox v-model="checked">全选</van-checkbox>
      <span style="color: #9d9d9d;margin-left: 20px;">已选 <span style="color: #ccc;">({{selectmamth}})</span></span>
    </div>


    <div class="content" style="height: 70vh;overflow: auto;" @scroll="loadImg($event)">
      <!-- <van-list v-model="loading" :finished="finished" finished-text="没有更多了" @load="onLoad" :offset='100'> -->
      <div class="content_box" v-for="(it,id) in list" :key="it.id" @click="btncheck(it,id)">
        <div style="margin-right:10px;">
          <van-checkbox v-model="it.checked" @change="changechecked(it)"></van-checkbox>
        </div>
        <div class="img" v-if="it.logos">
          <img :src="it.logos" alt="" srcset="" style="width: 100%;height: 100%;">
        </div>
        <div v-else class="avatar_Wrap">
          <div class="avatar"></div>
        </div>
        <div class="title">
          <div style="color: #383838;font-size: 14px;padding-bottom: 3px;word-wrap: break-word;word-break: break-all;">
            {{it.name}}</div>
          <div style="font-size: 14px;color: #919191;display: flex;justify-content: space-between;">
            <span>已报 {{it.order_count}}</span>
            <span>人数限制 {{it.join_peoplenumber}}</span>
            <span style="color: #3370EE;">{{it.riding_distance_total}}KM</span>
          </div>
        </div>
      </div>
      <!-- </van-list> -->
    </div>
    <!-- 最底部 -->
    <div class="bottom">
      <van-button round type="info" block @click="btnshow">批量修改俱乐部参与人数上限</van-button>
    </div>

    <!-- 弹框 -->
    <van-dialog v-model="show" title="人数限制" show-cancel-button @confirm="btn">
      <div class="find" style="padding: 15px 0;">
        <van-field v-model="maxvalue" label="" placeholder="请输入人数限制" />
      </div>
    </van-dialog>
  </div>
</body>
<script>
  // $("#J_header_stype .btn_back").html('<a class="back btn" href="javascript:history.back();"><img src="<?php echo base_url(); ?>static/index/club/img/back.png?v1" class="back_arrow"><span></span></a>');
  new Vue({
    el: '#app',
    template: ``,
    data: {
      club: "<?php echo $one_club_id; ?>",
      // clubList: _club_name_arr,
      //
      show: false,
      maxvalue: '',
      keyword: '',
      checked: false,
      // 列表
      page: 1,
      page_size: 10,
      list: [],
      loading: false,
      finished: false,


      // 选中的id集合
      checkIds: []
    },
    watch: {
      checked(val, value) {
        if (val) {
          this.list.forEach(it => it.checked = true);
        } else {
          this.list.forEach(it => it.checked = false);
        }
      }
    },
    computed: {
      selectmamth() {
        let num = 0
        this.list.forEach(it => {
          if (it.checked) {
            num++
          }
        })
        return num
      },
    },
    mounted() {
      this.getList(true);
    },
    methods: {
      changechecked(it) {
        const _this = this;
        if (_this.checkIds.length > 0) {
          const index = _this.checkIds.findIndex(item => item == it.id)
          if (index < 0) {
            _this.checkIds.push(it.id)
          }else{
            _this.checkIds.splice(index,1)
          }
        } else {
          _this.checkIds.push(it.id)
        }
        console.log(_this.checkIds,789)
      },
      // 下滑分页
      loadImg(event) {
        const _this = this;
        let el = event.target;
        if (el.scrollTop + el.clientHeight >= el.scrollHeight) {
          _this.page++;
          if (_this.list.length < 10) {
            _this.page = 1;
            return;
          } else {
            _this.getList(false);
          }
        }
      },
      //选择
      btncheck(it, id) {
        if (it.checked) {
          this.list[id].checked = false
        } else {
          this.list[id].checked = true
        }
      },
      // 内容
      // onLoad() {
      //   const _this = this
      //   _this.getList(false)
      // },
      // 搜索
      onSearch() {
        const _this = this
        _this.getList(true)
      },
      // 清除
      onclear() {
        const _this = this
        // console.log(_this.keyword, 123)
        _this.keyword = ''
        _this.getList(true)
      },
      // 数据列表
      getList(val) {
        const _this = this
        if (val) {
          _this.page = 1
          _this.list = []
          _this.page_size = 10
        }
        // https://club.giant.com.cn/index.php/activity/appactivity_getclub_ajax/932711.html?page=0&keyword=&ctime=1709222400&end_date=1711900799&cdate=1708221864
        $.ajax({
          type: "get",
          // datatype: "json",
          // url: "<?php echo site_url('Activity_riding/hand_to_ajax'); ?>",
          url: 'index.json',
          // data: tmp_params,
          beforeSend: function () { },
          success: function (data) {
            if (typeof data != "object") {
              data = $.parseJSON(data);
            }
            if (data.status == 1) { //成功
              for (var i = 0; i < data.data.length; i++) {
                data.data[i].checked = false

                _this.list.push(data.data[i])
              }
              _this.loading = false;
              // 数据全部加载完成
              if (data.data.length < _this.page_size) {
                _this.finished = true;
              } else {
                _this.page++;
                _this.finished = false;
              }
              // 清空回显选中状态
              if (_this.keyword == '') {
                _this.checkIds && _this.checkIds.map((v, i) => {
                  // console.log(v, _this.list, 1111)
                  const index = _this.list.findIndex(item => item.id == v)
                  if (index > -1) _this.list[index].checked = true;
                })
              }else{
                _this.checkIds && _this.checkIds.map((v, i) => {
                  // console.log(v, _this.list, 1111)
                  const index = _this.list.findIndex(item => item.id == v)
                  if (index > -1) _this.list[index].checked = true;
                })
              }
            } else {
              _this.finished = true;
              _this.loading = false;
              $.fn.poptips({
                con: data.msg ? data.msg : '网络不稳定,请您稍后刷新重试',
                btnOKClick: function () { }
              });
            }
          },
          error: function (data, status, e) {
            _this.finished = true;
            _this.loading = false;
          }
        });
      },
      // 弹框
      btnshow() {
        const _this = this
        _this.show = true
      },
      // 提交
      btn() {
        const _this = this
        if (_this.maxvalue == '') {
          $.fn.poptips({
            con: '请输入人数限制',
            btnOKClick: function () { }
          });
          return
        }

        // 拼接id
        let str = ''
        _this.list.forEach(it => {
          if (it.checked) {
            str += it.id + ','
          }
        })
        var tmp_params = {
          activity_id: "<?php echo $activity_id; ?>",
          user_ids: str,
          club_id: _this.club,
        }
        $.ajax({
          type: "POST",
          datatype: "json",
          url: "<?php echo site_url('Activity_riding/hand_to_cert'); ?>",
          data: tmp_params,
          beforeSend: function () { },
          success: function (data) {
            if (typeof data != "object") {
              data = $.parseJSON(data);
            }
            if (data.status == 1) { //成功
              $.fn.poptips({
                con: data.msg,
                btnOKClick: function () {
                  //window.location.reload();
                  _this.getList(true)
                }
              });
            } else {
              $.fn.poptips({
                con: data.msg ? data.msg : '网络不稳定,请您稍后刷新重试',
                btnOKClick: function () {
                  //window.location.reload();
                  _this.getList(true)
                }
              });
            }
          },
          error: function (data, status, e) {

            return false;
          }
        });
      }
    },
  });
  // 通过 CDN 引入时不会自动注册 Lazyload 组件
  // 可以通过下面的方式手动注册
  Vue.use(vant.Lazyload);
</script>

</html>
{
	"sql": 1,
	"status": 1,
	"data": [{
		"aid": "176086",
		"logos": "https:\/\/giant-images.oss-cn-shanghai.aliyuncs.com\/club\/club\/15833798925659344.jpg",
		"name": "\u6377\u5b89\u7279\u9752\u5e74\u8defCYCLING WORLD",
		"id": "1811",
		"riding_distance_total": "337,499",
		"order_count": "261"
	}, {
		"aid": "178429",
		"logos": "https:\/\/club-static.giant.com.cn\/index\/club\/img\/logo.png",
		"name": "\u5eca\u574a\u4f53\u80b2\u573a\u6377\u5b89\u7279\u4f53\u9a8c\u4e2d\u5fc3",
		"id": "3797",
		"riding_distance_total": "216,617",
		"order_count": "222"
	}, {
		"aid": "176012",
		"logos": "https:\/\/giant-images.oss-cn-shanghai.aliyuncs.com\/club\/club\/15842023713356087.jpg",
		"name": "\u6d1b\u9633\u6377\u5b89\u7279\u9a91\u53cb\u9a7f\u7ad9\u5355\u8f66\u4ff1\u4e50\u90e8",
		"id": "4147",
		"riding_distance_total": "198,223",
		"order_count": "137"
	}, {
		"aid": "178220",
		"logos": "https:\/\/giant-images.oss-cn-shanghai.aliyuncs.com\/club\/club\/14846655282676040.jpg",
		"name": "\u4e34\u6c7e\u6377\u5b89\u7279\u5355\u8f66\u4ff1\u4e50\u90e8",
		"id": "587",
		"riding_distance_total": "188,110",
		"order_count": "177"
	}, {
		"aid": "178434",
		"logos": "https:\/\/giant-images.oss-cn-shanghai.aliyuncs.com\/club\/club\/15702441233462988.jpg",
		"name": "\u5043\u5e08\u6377\u5b89\u7279\u9a91\u53cb\u4ff1\u4e50\u90e8",
		"id": "7164",
		"riding_distance_total": "180,214",
		"order_count": "68"
	}, {
		"aid": "178418",
		"logos": "https:\/\/club-static.giant.com.cn\/index\/club\/img\/logo.png",
		"name": "\u67a3\u5e84\u6377\u5b89\u7279\u65e0\u9650\u5355\u8f66\u4ff1\u4e50\u90e8",
		"id": "750",
		"riding_distance_total": "170,613",
		"order_count": "134"
	}, {
		"aid": "176090",
		"logos": "https:\/\/giant-images.oss-cn-shanghai.aliyuncs.com\/club\/club\/1609474912201145.jpg",
		"name": "\u5510\u53bf\u6377\u5b89\u7279\u4ff1\u4e50\u90e8",
		"id": "940",
		"riding_distance_total": "168,632",
		"order_count": "227"
	}, {
		"aid": "175980",
		"logos": "https:\/\/giant-images.oss-cn-shanghai.aliyuncs.com\/club\/club\/16167268817033795.jpg",
		"name": "\u6377\u5b89\u7279\u78c1\u53bf\u4e50\u9a91\u5355\u8f66\u4ff1\u4e50\u90e8",
		"id": "971",
		"riding_distance_total": "150,743",
		"order_count": "65"
	}, {
		"aid": "176013",
		"logos": "https:\/\/club-static.giant.com.cn\/index\/club\/img\/logo.png",
		"name": "\u6377\u5b89\u7279\u5eca\u574a\u5efa\u56fd\u9053CYCLING WORLD",
		"id": "799",
		"riding_distance_total": "149,386",
		"order_count": "207"
	}, {
		"aid": "176057",
		"logos": "https:\/\/giant-images.oss-cn-shanghai.aliyuncs.com\/club\/club\/16042056799086036.jpg",
		"name": "\u5bff\u5149\u4e1c\u57ce\u6377\u5b89\u7279\u4ff1\u4e50\u90e8",
		"id": "812",
		"riding_distance_total": "141,069",
		"order_count": "127"
	}]
}

原生html+css+js 分页配置

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>无限滚动列表</title>
  <style>
    /* styles.css */
    body {
      font-family: Arial, sans-serif;
      margin: 0;
      padding: 0;
    }

    .scrollable {
      width: 100%;
      height: 300px;
      /* 设置适当的高度 */
      overflow-y: scroll;
      border: 1px solid #ccc;
    }

    .content {
      padding: 20px;
      border-bottom: 1px solid #ddd;
    }
  </style>
</head>

<body>
  <div id="scrollableDiv" class="scrollable">
    <!-- 这里可以放很多内容来测试滚动 -->
    <div class="content">Content 1</div>
    <div class="content">Content 2</div>
    <div class="content">Content 3</div>
    <div class="content">Content 4</div>
    <div class="content">Content 1</div>
    <div class="content">Content 2</div>
    <div class="content">Content 3</div>
    <div class="content">Content 4</div>
    <div class="content">Content 1</div>
    <div class="content">Content 2</div>
    <div class="content">Content 3</div>
    <div class="content">Content 4</div>
    <div class="content">Content 1</div>
    <div class="content">Content 2</div>
    <div class="content">Content 3</div>
    <div class="content">Content 4</div>
    <div class="content">Content 1</div>
    <div class="content">Content 2</div>
    <div class="content">Content 3</div>
    <div class="content">Content 4</div>
    <div class="content">Content 1</div>
    <div class="content">Content 2</div>
    <div class="content">Content 3</div>
    <div class="content">Content 4</div>
    <div class="content">Content 1</div>
    <div class="content">Content 2</div>
    <div class="content">Content 3</div>
    <div class="content">Content 4</div>
    <!-- 添加更多内容 -->
  </div>
  <script>
    // scripts.js
    document.addEventListener('DOMContentLoaded', function () {
      const scrollableDiv = document.getElementById('scrollableDiv');

      function isBottom(div) {
        return div.scrollHeight - div.scrollTop === div.clientHeight;
      }

      function handleScroll() {
        if (isBottom(scrollableDiv)) {
          console.log('触底了');
          // 在这里添加你希望触发的操作
        }
      }

      scrollableDiv.addEventListener('scroll', handleScroll);
    });


  </script>
</body>

</html>

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

黑白两客

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值