vue2实现移动端级联选择器

本文详述了如何使用Vue2构建移动端的级联选择器,包括简易版和高级版组件的源码解析,参数、事件及方法说明,并提供了使用示例和省市区JSON数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

级联选择器,用于多层级数据的选择,典型场景为省市区选择

1 简易版

1.1效果展示

在这里插入图片描述

1.2 组件源码

<template>
  <div>
    <!-- 遮罩层,支持点击遮罩关闭级联选择 -->
    <div
      v-show="visible"
      class="mask"
      @click="close"
    />
    <transition name="fade">
      <!-- 级联选择部分 -->
      <div
        v-show="visible"
        class="cascader"
      >
        <!-- 顶部标题 -->
        <div class="title">
          {
  
  { title }}
          <!-- 关闭按钮 -->
          <i 
            v-if="leftIcon"
            :class="['back', {
    
    'arrow': leftIcon === 'arrow', 'cross': leftIcon === 'cross'}]"
            @click="close"
          />
        </div>
        <!-- 展示各级选择的结果 -->
        <ul class="nav-list line">
          <template v-for="(item, index) in (tabIndex + 1)">
            <li
              :key="index"
              :class="['nav-list-item', {
    
    'active': index === tabIndex, 'more-hidden': moreHidden}]"
              @click="changeIndex(index)"
            >
              {
  
  { (selectedOptions[index] && selectedOptions[index][fieldNames.text]) || placeholderText }}
            </li>
          </template>
        </ul>
        <!-- 展示当前级列表数据 -->
        <ol 
          class="select-list"
          ref="selectListRef"
        >
          <template v-for="(item, index) in pickerDataArr[tabIndex]">
            <li
              :key="index"
              class="select-list-item line"
              @click="selectItem(item)"
            >
              {
  
  { item[fieldNames.text] }}
            </li>
          </template>
        </ol>
      </div>
    </transition>
  </div>
</template>

<script>
export default {
     
     
  name: 'cascaderPicker',
  props: {
     
     
    // 是否显示级联选择器,支持 .sync 修饰符
    visible: {
     
     
      type: Boolean,
      default: false
    },
    // 可选项数据源
    options: {
     
     
      type: Array,
      default: () => []
    },
    // 顶部标题
    title: {
     
     
      type: String,
      default: ''
    },
    // 各级未选中时的提示文案	 
    placeholderText: {
     
     
      type: String,
      default: '请选择'
    },
    // 各级选择的结果文字展示溢出是否隐藏
    moreHidden: {
     
     
      type: Boolean,
      default: false
    },
    // 自定义选择层级数
    level: {
     
     
      type: Number,
      default: 3
    },
    // 自定义options结构中的字段
    fieldNames: {
     
     
      type: Object,
      default: () => ({
     
     
        text: 'text',
        value: 'value',
        chlidren: 'children'
      })
    },
    // 关闭图标:arrow(左箭头)/cross(交叉)
    leftIcon: {
     
     
      type: String,
      default: 'arrow'
    }  
  },
  data() {
     
     
    return {
     
     
      // 当前选择级索引
      tabIndex: 0,
      // 各级选择的结果组合
      selectedOptions: [],
      // 每一级列表组合
      pickerDataArr: []
    }
  },
  watch: {
     
     
    tabIndex () {
     
     
      // 列表滚动置零
      this.$refs['selectListRef'].scrollTop = 0
    },
    // 每次弹起组件时重置数据
    visible (val) {
     
     
      if (val) {
     
     
        this.tabIndex = 0
        this.selectedOptions = []
        this.pickerDataArr = []
        // 默认展示第一级列表数据(最外层)
        this.pickerDataArr.push(this.options)
      }
    }
  },
  methods: {
     
     
    changeIndex (index) {
     
     
      // 往回从新选择,加visible条件防止关闭级联选择器动画误触
      if (this.visible && index < this.tabIndex) {
     
     
        // 删除选中当前级开始的结果
        this.selectedOptions.splice(index)
        // 删除选中当前级下一级的列表数据
        this.pickerDataArr.splice(index + 1)
        this.tabIndex = index
      }
    },
    selectItem (item) {
     
     
      // 关闭级联选择器动画防重
      if(!this.visible) return
      // 保存选择的结果
      this.selectedOptions
### Vue 移动端级联选择器实现方式 在 Vue 中,可以通过 `el-cascader` 组件或其他第三方库来实现移动端级联选择器功能。以下是几种常见的实现方式: #### 使用 Element Plus 的 Cascader 组件 Element Plus 提供了一个强大的级联选择器组件——Cascader[^3]。它允许开发者自定义数据源以及配置项,从而满足不同的业务需求。 以下是一个简单的代码示例展示如何使用该组件: ```vue <template> <div> <el-cascader v-model="selectedValue" :options="options" :props="{ checkStrictly: true }" @change="handleChange"> </el-cascader> </div> </template> <script> export default { data() { return { selectedValue: [], options: [ { value: 'zhinan', label: '指南', children: [ { value: 'shejiyuanze', label: '设计原则' }, { value: 'daohang', label: '导航' } ] } ] }; }, methods: { handleChange(value) { console.log('Selected Value:', value); } } }; </script> ``` 此代码片段展示了如何通过设置 `checkStrictly` 来控制父子节点之间的关联关系[^1]。 --- #### 自定义实现级联选择器逻辑 如果需要更灵活的功能(如多选、父子不关联等),可以基于原生 Vue 构建自己的级联选择器。这种情况下,通常会结合 JSON 数据结构作为基础数据源,并手动处理事件绑定和状态管理。 例如,可以从 GitHub 上获取中国的行政区划数据文件[^2]并将其转换为适合使用的格式。之后按照如下方式进行开发: ```javascript // 假设已加载 pcas-code.json 文件到变量 chinaData const cascaderOptions = chinaData.map(province => ({ value: province.code, label: province.name, children: province.children?.map(city => ({ value: city.code, label: city.name })) })); ``` 随后,在模板部分创建一个动态渲染的选择框列表即可完成基本功能扩展。 --- #### 推荐的第三方插件 除了官方提供的解决方案之外,还有一些优秀的社区维护工具可以帮助快速搭建复杂的交互效果: - **Vant**: Vant 是由有赞前端团队开源的一套轻量级移动端 UI 框架,其内置了丰富的组件支持,其中包括 CascadePicker 功能模块。 - **MintUI**: 同样适用于构建高性能移动应用界面的设计体系之一,也具备类似的控件可供选用。 这些框架均提供了详细的文档说明和技术支持服务,能够有效降低项目初期的研发成本。 --- ### 总结 无论是采用成熟的第三方类库还是自行编码实践,都需要依据实际应用场景权衡利弊后再做决定。对于初学者而言,优先考虑利用现有的成熟方案往往更加高效便捷;而对于追求极致性能或者特殊定制化需求,则可能需要投入更多精力去探索底层原理与优化策略。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值