uniapp 省市区三级联动

1. uniapp 省市区三级联动

  在uniapp中实现省市区三级联动的方法。首先,在根目录创建一个存放省市区js文件,定义省市区数据。然后,在页面中使用picker组件,设置mode为multiSelector,绑定省市区数据。通过监听picker的change和columnchange事件,实现省市区数据的联动选择。最后,将选择的省市区数据显示在页面上。该方法简单易用,适用于需要省市区选择的场景。

1.1. 组件city-picker.vue

javascript 复制代码
<template>
  <view>
    <picker class="city-picker-layout"
            mode="multiSelector"
            range-key="name"
            :range="array"
            :value="value"
            @change="bindPickerChange"
            @columnchange="columnchange">
      <slot></slot>
    </picker>
  </view>
</template>
<script>
import AllAddress from '/api/city'

let selectCode =  ['', '', '']
let selectValue = ['', '', '']
export default {
  name: 'modal',
  data() {
    return {
      value: [0, 0, 0],
      array: [],
      index: 0
    }
  },
  created() {
    this.initSelect()
  },
  props: {},
  methods: {
    // 初始化地址选项
    initSelect() {
      this.updateSourceDate() // 更新源数据
          .updateAddressDate() // 更新结果数据
      setTimeout(() => {
        this.$forceUpdate()  // 触发双向绑定
      }, 0)
    },
    // 地址控件改变控件
    columnchange(d) {
      this.updateSelectIndex(d.detail.column, d.detail.value) // 更新选择索引
          .updateSourceDate() // 更新源数据
          .updateAddressDate() // 更新结果数据
          .$forceUpdate()  // 触发双向绑定
    },

    /**
     * 更新源数据
     * */
    updateSourceDate() {
      this.array = []
      this.array[0] = AllAddress.map(obj => {
        return {
          name: obj.name
        }
      })
      this.array[1] = AllAddress[this.value[0]]
          .cityList.map(obj => {
            return {
              name: obj.name
            }
          })
      this.array[2] = AllAddress[this.value[0]]
          .cityList[this.value[1]]
          .areaList.map(obj => {
            return {
              name: obj.name
            }
          })
      return this
    },

    /**
     * 更新索引
     * */
    updateSelectIndex(column, value) {
      let arr = JSON.parse(JSON.stringify(this.value))
      arr[column] = value
      if (column === 0) {
        arr[1] = 0
        arr[2] = 0
      }
      if (column === 1) {
        arr[2] = 0
      }
      this.value = arr
      return this
    },

    /**
     * 更新结果数据
     * */
    updateAddressDate() {
      selectCode[0] = this.array[0][this.value[0]].code
      selectCode[1] = this.array[1][this.value[1]].code
      selectCode[2] = this.array[2][this.value[2]].code
      selectValue[0] = this.array[0][this.value[0]].name
      selectValue[1] = this.array[1][this.value[1]].name
      selectValue[2] = this.array[2][this.value[2]].name
      return this
    },

    /**
     * 点击确定
     * */
    bindPickerChange(e) {
      this.$emit('change', {
        index: this.value,
        cityVale: selectValue,
        cityCode: selectCode,
        array: this.array
      })
      return this
    }
  }
}
</script>
<style lang="scss" scoped>
.city-picker-layout {
  display: flex;
  justify-content: space-between;
}
</style>

1.2. 页面cityPicker.vue

javascript 复制代码
<template>
  <view>
    <view class="content">
      <city-picker @change="change">
        <text class="text"> {{ txt }}</text>
      </city-picker>
    </view>
  </view>
</template>
<script>
import CityPicker from '/components/city-picker.vue'//引入自定义插件
export default {
  components: {
    CityPicker
  },
  data() {
    return {
      txt: '选择地址', //省市区选中的值
      title: 'Hello'
    }
  },
  onLoad() {

  },
  methods: {
    change(data) {
      console.log("data===",data)
      this.txt = data.cityVale.join('')
      console.log(data.cityVale.join(''))
    }
  }
}
</script>
<style>
.text{
  font-size: 16px;
  color: #2c3e50;
}
</style>

1.3. 数据city.js

javascript 复制代码
// An highlighted block
var foo = 'bar';
相关推荐
NutShell Wang5 分钟前
Wails v3 Beta 实战:用显式对象模型重写你的第一个 Go 桌面应用
前端·人工智能·go·vibe coding
daols886 分钟前
vue 甘特图 vxe-gantt 任务条拖拽自动更新日期
javascript·vue.js·甘特图
cindershade7 分钟前
前端国际化工程实践:语言包拆分、动态加载与日期数字格式统一
前端
kisbad15 分钟前
Day 036|OpenAI Agents SDK 快速开始:今天跑通第一个 Agent
java·前端·javascript
qq_2676128919 分钟前
Gitee CodePecker行业场景化落地指南:金融、车联网与IoT双引擎选型与工程化路径
前端·gitee·自动化
初晨未凉27 分钟前
elementui自定义内容图片预览
前端
无糖可可果2 小时前
从零读懂一个 Next.js 全栈笔记应用
前端
Maxkim2 小时前
DeepSeek Harness 源码深度分析:像 VS Code 一样插件化的 Agent 框架
前端·架构
xiaominlaopodaren2 小时前
three.js地图数学基础(八):浮点精度
javascript·gis·three.js
喜欢睡觉2 小时前
从零看懂一个 Next.js 笔记应用
前端