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';
相关推荐
A923A4 分钟前
【小兔鲜电商前台 | 项目笔记】第八天
前端·vue.js·笔记·项目·小兔鲜
DYuW5gBmH16 分钟前
Chrome DevTools MCP 让 AI 无缝接管浏览器调试会话
前端·chrome·chrome devtools
echome88821 分钟前
JavaScript Promise 与 async/await 实战:5 个高频异步编程场景的优雅解决方案
开发语言·javascript·ecmascript
qq12_81151751544 分钟前
Java Web 影城会员管理系统系统源码-SpringBoot2+Vue3+MyBatis-Plus+MySQL8.0【含文档】
java·前端·mybatis
摸鱼仙人~1 小时前
Math.js 使用教程
开发语言·javascript·ecmascript
weixin199701080162 小时前
《中控网商品详情页前端性能优化实战》
前端·性能优化
wuhen_n2 小时前
LangChain Agents 实战:构建智能文件管理助手
前端·javascript·人工智能·langchain·ai编程
Vfw3VsDKo2 小时前
Flink源码阅读:Netty通信
java·前端·flink
别抢我的锅包肉2 小时前
【FastAPI】 + SQLAlchemy 异步 ORM 实现完整 CRUD 操作
前端·fastapi
. . . . .2 小时前
抽象语法树 AST
javascript