uniapp开发微信小程序底部地区选择弹框

这篇具有很好参考价值的文章主要介绍了uniapp开发微信小程序底部地区选择弹框。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

个人项目地址: SubTopH前端开发个人站

(自己开发的前端功能和UI组件,一些有趣的小功能,感兴趣的伙伴可以访问,欢迎提出更好的想法,私信沟通,网站属于静态页面)

uniapp开发微信小程序底部地区选择弹框,uni-app,微信小程序,vue.js,前端组件,地区选择组件

SubTopH前端开发个人站https://subtop.gitee.io/subtoph.github.io/#/home

以上 👆 是个人前端项目,欢迎提出您的建议😊

实现效果

uniapp开发微信小程序底部地区选择弹框,uni-app,微信小程序,vue.js,前端组件,地区选择组件

功能介绍:

  1. 支持默认值直接显示滚动定位
  2. 选择上一次后,下一级重置请选择
  3. 选中样式可自定义
  4. 点击确认可校验省市县时候全部选择

 直接上代码模板部分(利用uniapp中的picker-view进一步封装)

<template>
  <view>
    <view
      class="tui-actionsheet-class tui-actionsheet"
      :class="[show ? 'tui-actionsheet-show' : '']"
    >
      <view class="regional-selection">
        <view class="selection-top">
          <text class="top-title">请选择地址区域</text>
          <image
            src="/static/image/bar-close.png"
            class="close-img"
            @tap="handleClickMask"
          />
        </view>
        <view class="selection-title">
          <text>省份</text>
          <text>城市</text>
          <text>区县</text>
        </view>
        <!-- 区域滚动选择 -->
        <picker-view
          class="picker-view"
          indicator-style="height:40px"
          mask-style="background-image: linear-gradient(to top, #ffffffcc,#fff, #fff)"
          @change="bindPickerChange"
          :value="value"
        >
          <!-- 省 -->
          <picker-view-column>
            <view
              class="item"
              :class="{ active: activeProvince === index }"
              v-for="(item, index) in provinces"
              :key="item.key"
              >{{ item.label }}</view
            >
          </picker-view-column>
          <!-- 市 -->
          <picker-view-column>
            <view
              class="item"
              :class="{ active: activeCity === index }"
              v-for="(item, index) in citys"
              :key="item.key"
              >{{ item.label }}</view
            >
          </picker-view-column>
          <!-- 县 -->
          <picker-view-column>
            <view
              class="item"
              :class="{ active: activeCounty === index }"
              v-for="(item, index) in countys"
              :key="item.key"
              >{{ item.label }}</view
            >
          </picker-view-column>
        </picker-view>
        <button type="default" class="confirm-btn" @click="confirmSelect">
          确认
        </button>
      </view>
    </view>
    <!-- 遮罩层 -->
    <view
      class="tui-actionsheet-mask"
      :class="[show ? 'tui-mask-show' : '']"
      @tap="handleClickMask"
    ></view>
  </view>
</template>

javaScript部分代码

<script>
import { reactive, toRefs, onBeforeMount, onMounted, nextTick } from "vue";
import { different } from "@/utils/common.js";
import {
  getEconomize,
  getMarket,
  getCounty,
} from "@/api/modules/common.api.js";   
// 以上省市县的接口,可根据开发实际情况前端写死或者后端请求数据
export default {
  name: "tuiActionsheet",
  props: {
    //点击遮罩 是否可关闭
    maskClosable: {
      type: Boolean,
      default: true,
    },
    //显示操作菜单
    show: {
      type: Boolean,
      default: false,
    },
    // 初始化显示的地区
    currentAddress: {
      type: Array,
    },
  },
  setup(props, ctx) {
    watch(
      () => props.show,
      (val) => {
        if (val) {
          data.provinces = [{ key: "0", label: "请选择" }];
          data.citys = [{ key: "1", label: "请选择" }];
          data.countys = [{ key: "2", label: "请选择" }];
          data.inCurrentAddress = props.currentAddress;
          inGetEconomize();
        }
      }
    );

    const data = reactive({
      inCurrentAddress: [],
      value: [0, 0, 0],
      provinces: [{ key: "0", label: "请选择" }],
      citys: [{ key: "1", label: "请选择" }],
      allCitys: [], //保存已请求的数据
      countys: [{ key: "2", label: "请选择" }],
      allCountys: [],
      activeProvince: 0,
      activeCity: 0,
      activeCounty: 0,
    });
    onBeforeMount(() => {});
    onMounted(() => {});
    // 获取省
    const inGetEconomize = () => {
      // 获取省数据
      getEconomize({ data: {} }).then((res) => {
        if (res.code) return;
        data.provinces.push(...res.data);
        dataHandle("provinces", 0);
      });
    };
    // 获取市
    const inGetCitys = (code) => {
      getMarket({ data: { marketCode: code } }).then((res) => {
        if (res.code) return;
        data.citys.push(...res.data);
        dataHandle("citys", 1);
      });
    };
    // 获取县
    const inGetCountys = (code) => {
      getCounty({ data: { countyCode: code } }).then((res) => {
        if (res.code) return;
        data.countys.push(...res.data);
        dataHandle("countys", 2);
      });
    };
    const dataHandle = (attribute, col) => {
      // data[attribute].unshift();
      const echo = data.inCurrentAddress[col];
      let index = data[attribute].findIndex((item) => item.label === echo);
      index = index < 0 ? 0 : index;
      setActiveStyle(col, index);
      const key = data[attribute][index].key;
      if (col === 0) {
        inGetCitys(key); //获取市
      }
      if (col === 1) {
        inGetCountys(key); //获取县
      }
    };
    // 设置选中值和样式
    const setActiveStyle = (column, index) => {
      nextTick(() => {
        // 设置初始化选中
        data.value[column] = index;
        setActiveValue(data.value);
      });
    };
    // 滚动选择
    const bindPickerChange = (e) => {
      const changeIndex = different(data.value, e.detail.value);
      data.value = e.detail.value;
      setActiveValue(data.value);
      changeSelectHandle(changeIndex);
    };
    const changeSelectHandle = (index) => {
      if (index === 0) {
        data.citys = data.citys.splice(0, 1);
        inGetCitys(data.provinces[data.value[0]].key); //获取市
      }
      if (index === 1) {
        data.countys = data.countys.splice(0, 1);
        if (data.citys.length) {
          inGetCountys(data.citys[data.value[1]].key); //获取县
        }
      }
    };
    // 设置选中项的index控制选中样式
    const setActiveValue = (arr) => {
      data.activeProvince = arr[0];
      data.activeCity = arr[1];
      data.activeCounty = arr[2];
    };
    // 确认选择
    const confirmSelect = () => {
      const { provinces, citys, countys, value } = data;
      const index = value.indexOf(0);
      if (index !== -1) {
        let msg;
        switch (index) {
          case 1:
            msg = "请选择城市";
            break;
          case 2:
            msg = "请选择区县";
            break;
          default:
            msg = "请选择省份";
        }

        uni.showToast({
          icon: "none",
          title: msg,
        });
      } else {
        const confirmArr = [
          provinces[value[0]],
          citys[value[1]],
          countys[value[2]],
        ];
        ctx.emit("confirm", confirmArr);
        handleClickCancel();
      }
    };
    // 点击遮罩层
    const handleClickMask = () => {
      if (!props.maskClosable) return;
      handleClickCancel();
    };
    // 点击取消
    const handleClickCancel = () => {
      ctx.emit("chooseCancel");
    };
    return {
      confirmSelect,
      handleClickMask,
      handleClickCancel,
      bindPickerChange,
      ...toRefs(data),
    };
  },
};
</script>

different方法判断数组中某个值的改变下标

export const different = (arr1, arr2) => {
    let index
    for (let i = 0; i < arr1.length; i++) {
        if (arr1[i] !== arr2[i]) {
            index = i
        }
    }
    return index
}

css样式代码


<style scoped lang="less">
.tui-actionsheet {
  width: 100%;
  position: fixed;
  left: 0;
  right: 0;
  bottom: 0;
  z-index: 9999;
  visibility: hidden;
  transform: translate3d(0, 100%, 0);
  transform-origin: center;
  transition: all 0.3s ease-in-out;
  // background: #eaeaec;
  min-height: 100rpx;
}

.tui-actionsheet-show {
  transform: translate3d(0, 0, 0);
  visibility: visible;
}
.regional-selection {
  position: relative;
  text-align: center;
  height: 818rpx;
  background: #fff;
  border-radius: 32rpx 32rpx 2rpx 2rpx;
  overflow: hidden;
  .selection-top {
    height: 100rpx;
    line-height: 100rpx;
    position: absolute;
    top: 0;
    z-index: 9999;
    width: 100%;
    border-bottom: 1rpx solid #f4f6f9;
    .top-title {
      text-align: center;
      font-size: 30rpx;
      color: #262626;
      font-weight: 600;
    }
    .close-img {
      position: absolute;
      width: 50rpx;
      height: 50rpx;
      right: 24rpx;
      top: 25rpx;
    }
  }
  .selection-title {
    position: absolute;
    top: 100rpx;
    height: 100rpx;
    line-height: 100rpx;
    z-index: 9999;
    width: 100%;
    font-size: 30rpx;
    display: flex;
    color: #262626;
    justify-content: space-around;
  }
  .picker-view {
    width: 750rpx;
    height: 560rpx;
    margin-top: 20px;

    /deep/.uni-picker-view-content {
      padding: 0rpx 0 !important;
    }
    .item {
      height: 40px !important;
      line-height: 40px;
      text-align: center;
      font-size: 26rpx;
      color: #606266;
      font-weight: normal !important;
      &.active {
        color: #0080ff;
        font-size: 30rpx;
      }
    }
  }

  .confirm-btn {
    margin-top: 30rpx;
    height: 88rpx;
    width: 690rpx;
    font-size: 30rpx;
    border-radius: 16rpx;
    line-height: 88rpx;
    background: #0080ff;
    color: #fff;
    &::after {
      border: none;
    }
  }
}

.tui-actionsheet-mask {
  position: fixed;
  top: 0;
  left: 0;
  right: 0;
  bottom: 0;
  background: rgba(0, 0, 0, 0.6);
  z-index: 9996;
  transition: all 0.3s ease-in-out;
  opacity: 0;
  visibility: hidden;
}

.tui-mask-show {
  opacity: 1;
  visibility: visible;
}
</style>

效果预览文章来源地址https://www.toymoban.com/news/detail-650882.html

到了这里,关于uniapp开发微信小程序底部地区选择弹框的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • uniapp - [微信小程序平台] 实现输入支付密码键盘弹框,uniapp小程序端底部弹起密码输入键盘组件效果,类似电商平台支付密码、弹出支付密码输入框、交易密码(详细示例源码,一键复制开箱即用!)

    在uniapp微信小程序端平台,详细实现底部弹出输入支付密码框组件,自定义密码输入框键盘功能(密码自动带星号、黑点保护隐私,自定义数字键盘),类似电商在付款时输入支付密码的组件。 直接复制组件源码,改下样式就能用了。 复制运行即可查看效果。

    2024年02月03日
    浏览(111)
  • uniapp android底部弹框

    uniapp android底部弹框,带有动画效果

    2024年02月14日
    浏览(36)
  • uni-app开发微信小程序

    编辑器:HubilderX 运行环境:微信开发者工具 技术栈:uni-app + vue + uView + uCharts + LeanCloud 创建微信小程序项目时,我才用了vue前端框架 PS:用的是HbuilderX编辑器 1. 注册微信小程序 注册完后,获取微信小程序的AppID,并在manifest.json文件配置; 2. 导入uView和uCharts组件库 使用uni-

    2024年02月16日
    浏览(84)
  • 前端Uni-app开发微信小程序|微信小程序手机商城

    作者主页:编程指南针 作者简介:Java领域优质创作者、CSDN博客专家 、CSDN内容合伙人、掘金特邀作者、阿里云博客专家、51CTO特邀作者、多年架构师设计经验、腾讯课堂常驻讲师 主要内容:Java项目、Python项目、前端项目、人工智能与大数据、简历模板、学习资料、面试题库

    2024年02月12日
    浏览(54)
  • 如何使用uni-app开发微信小程序

    uni-app 是一个使用 Vue.js 开发所有前端应用的框架。开发者编写一套代码,可发布到 iOS、Android、H5、以及各种小程序(微信/支付宝/百度/头条/QQ/钉钉/淘宝)、快应用等多个平台。 详细的 uni-app 官方文档,请翻阅https://uniapp.dcloud.net.cn uni-app 官方推荐使用 HBuilderX 来开发 uni-ap

    2024年02月10日
    浏览(115)
  • 微信小程序chooseImage无法唤起选择弹框

    用uniapp打包发布的H5,在浏览器、开发者工具、IOS和部分安卓里都正常,但在微信小程序原生的web-view里,鸿蒙系统下无法唤起选择弹框(之前是可以的,最近鸿蒙更新了一下2.0.0.230就不行了)。无论是使用uni.chooseImage、还是uni-file-picker,都没反应。 原因:无论是chooseImage还是

    2024年02月05日
    浏览(58)
  • UNI-APP开发微信小程序的基本流程

    需提前准备的工具:HBuilder X ,微信开发者工具 登录小程序官网,如已有账号,则直接登录。 无账号,申请完账号后,进入账号填写相关信息,获取appId。 获取appId:【开发-开发管理-开发设置】 【文件】-【新建】-【项目】: 点击【manifest.json】,将微信小程序的配置信息填

    2024年02月06日
    浏览(45)
  • uni-app 开发微信小程序 自动化编译/启动项目

          最近开发一个uni-app的小程序项目,因为习惯使用vscode 而项目不得不借助hbuderx 运行,微信开发工具调试,偶尔还需要使用 ios模拟器, 8g内存的mac 就变的异常卡顿,所以就研究了下通过npm命令去编译、 运行等工程化配置, 这样就不用运行hbuderx 减少内存使用,顺便 

    2024年02月07日
    浏览(50)
  • VUE(uni-app框架)开发微信小程序③-显示隐藏

    uni-app控制显示隐藏的方式有两种,【v-if】 和   【v-show】 v-if:通过控制虚拟dom树的节点来达到控制式样的显示和隐藏,当参数为false的时候,该节点被删掉,当为true的时候则显示。 v-show:通过css样式中的dispaly:none来控制元素的显示和隐藏 代码如下: 显示效果如下:  通

    2024年02月16日
    浏览(55)
  • uni-app使用HBuilder X工具和微信小程序工具开发微信小程序

    选择uni-app的原因是什么 需要使用到的工具 关于HBuilder X工具和微信小程序工具的介绍  怎么下载HBuilder X工具和微信小程序工具  如何使用HBuilderX工具 如何使用微信小程序工具  结尾 什么是uni-app uni-app是一个使用vue.js开发所有前端应用的框架,开发者编写一套代码,可发布到

    2024年02月08日
    浏览(64)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包