vue省市区三级联动-封装集成

这里我只获取省/市/区三个联动等级的地址文件,并将其导入【static.stRegion】的文件夹中:

图四

四、省/市/区联动

1、获取地址文件数据

以上是准备阶段,接下来才进入主题。这里先实现获取省市区的数据,首先创建一个叫【zmRegion.js】的文件类:

图五

将实现方法写在【zmRegion.js】的文件中:


//引入省市区数据json文件

import provinces from '../../static/stcRegion/provinces';

import cities from '../../static/stcRegion/cities';

import areas from '../../static/stcRegion/areas';



export function zmGetProvincesArr() {



  let provinceArr = [];

  provinces.forEach(function (item) {

    let obj = {};

    obj.name = item.name;

    obj.code = item.code;

    provinceArr.push(obj);

  });

  return provinceArr;

}



export function zmGetCitiesArr(provinceCode) {

  console.log("省:" + provinceCode);

  if (!provinceCode){

    provinceCode = '11'

  }

  let cityArr = [];

  cities.forEach(function (item) {

    if (item.provinceCode == provinceCode) {

      let obj = {};

      obj.name = item.name;

      obj.code = item.code;

      obj.provinceCode = item.provinceCode;

      cityArr.push(obj);

    }

  });

  return cityArr;

}



export function zmGetAreaArr(cityCode) {

  console.log("市:" + cityCode);

  if (!cityCode){

    cityCode = '1101'

  }

  let areaArr = [];

  areas.forEach(function (item) {

    if (item.cityCode == cityCode) {

      let obj = {};

      obj.name = item.name;

      obj.code = item.code;

      obj.provinceCode = item.provinceCode;

      obj.cityCode = item.cityCode;

      areaArr.push(obj);

    }

  });

  return areaArr;

}



2、选择器组件化

获取数据后,就要想办法将其显示在页面上,考虑到地址选择器是一个比较独立的功能,将其写成一个组件,方便使用的时候直接引入。这里我在【components.compntTools】的文件夹中,创建了一个【addressPopupTool.vue】的文件:

图六

其实现方法如下:


<template>



  <div class="content">

    <label class="title">{{ region }}</label>

    <mt-picker :slots="myAddressSlots" valueKey="name" :visibleItemCount="5" @change="addressChange"

               :itemHeight="40"></mt-picker>

  </div>



</template>



<script>



  //引入省/市/区数据json文件

  import { zmGetProvincesArr,zmGetCitiesArr,zmGetAreaArr } from '../../plugins/jsTools/zmRegion'



  export default {

    name: "addressPopupTool",

    data() {

      return {

        region: '',//三级地址

        province: '',//省

        city: '',//市

        area: '',//县

        provinceCode: '',//省级代码

        cityCode: '', //市级代码

        areaCode: '',//县级代码



        regionInit: false,//禁止地区选择器自动初始化,picker组件会默认进行初始化,导致一进入页面就会默认选中一个初始3级地址



        myAddressSlots: [//省

          {

            flex: 1,

            values: zmGetProvincesArr(), //省份数组

            className: 'slot1',

            textAlign: 'center'

          },

          //分隔符

          {

            divider: true,

            content: '',

            className: 'slot2'

          },

          //市

          {

            flex: 1,

            values: zmGetCitiesArr('11'),

            className: 'slot3',

            textAlign: 'center'

          },

          {

            divider: true,

            content: '',

            className: 'slot4'

          },

          //县

          {

            flex: 1,

            values: zmGetAreaArr('1101'),

            className: 'slot5',

            textAlign: 'center'

          }

        ],

      }

    },



    methods: {



      addressChange(picker, values) {

        // console.table(picker);

        // console.table(values);

        if (this.regionInit) {

          //取值并赋值

          if (values[0] && values[1]  && values[2]) {



            this.region = values[0]["name"] + values[1]["name"] + values[2]["name"];

            this.province = values[0]["name"];

            this.city = values[1]["name"];

            this.county = values[2]["name"];

            this.provinceCode = values[0]["code"];

            this.cityCode = values[1]["code"];

            this.countyCode = values[2]["code"];



            // console.log("省:")

            // console.table(picker.getSlotValues(0));

            // console.log("省/市/区:")

            // console.table(picker.getValues());



            //给市、县赋值

            picker.setSlotValues(1, zmGetCitiesArr(values[0]["code"]));

            picker.setSlotValues(2, zmGetAreaArr(values[1]["code"]));



            this.$emit("getRegion", this.region)

          }else {

            console.log("数据不全");

          }



        } else {

          this.regionInit = true;

        }

      },



    },

  }



</script>



<style scoped>



  div.content {

    text-align: center;

  }



  label.title {

    margin-left: 10px;

    margin-right: 10px;

    width: 80%;

    background: white;

    font-size: 1rem;

    color: #7f828b;

  }



</style>





3、调用组件

基础准备都做好之后,接下来就是调用组件,实现地址选择器:

图七

其实现方法如下:


<template>



  <div class="content">

    <label class="title">{{ region }}</label>

    <mt-picker :slots="myAddressSlots" valueKey="name" :visibleItemCount="5" @change="addressChange"

               :itemHeight="40"></mt-picker>

  </div>



</template>



<script>



  //引入省/市/区数据json文件

  import { zmGetProvincesArr,zmGetCitiesArr,zmGetAreaArr } from '../../plugins/jsTools/zmRegion'



  export default {

    name: "addressPopupTool",

    data() {

      return {

        region: '',//三级地址

        province: '',//省

        city: '',//市

        area: '',//县

        provinceCode: '',//省级代码

        cityCode: '', //市级代码

        areaCode: '',//县级代码



        regionInit: false,//禁止地区选择器自动初始化,picker组件会默认进行初始化,导致一进入页面就会默认选中一个初始3级地址



        myAddressSlots: [//省

          {

            flex: 1,

            values: zmGetProvincesArr(), //省份数组

            className: 'slot1',

            textAlign: 'center'

          },

          //分隔符

          {

            divider: true,

            content: '',

            className: 'slot2'

          },

          //市

          {

            flex: 1,

            values: zmGetCitiesArr('11'),

            className: 'slot3',

            textAlign: 'center'

          },

          {

            divider: true,

            content: '',

            className: 'slot4'

          },

          //县

          {

            flex: 1,

            values: zmGetAreaArr('1101'),

            className: 'slot5',

            textAlign: 'center'

          }

        ],

      }

    },



    methods: {



      addressChange(picker, values) {

        // console.table(picker);

        // console.table(values);

        if (this.regionInit) {

          //取值并赋值

          if (values[0] && values[1]  && values[2]) {



            this.region = values[0]["name"] + values[1]["name"] + values[2]["name"];

            this.province = values[0]["name"];

            this.city = values[1]["name"];

            this.county = values[2]["name"];

            this.provinceCode = values[0]["code"];

            this.cityCode = values[1]["code"];

            this.countyCode = values[2]["code"];



            // console.log("省:")

            // console.table(picker.getSlotValues(0));

            // console.log("省/市/区:")

            // console.table(picker.getValues());



            //给市、县赋值

            picker.setSlotValues(1, zmGetCitiesArr(values[0]["code"]));

            picker.setSlotValues(2, zmGetAreaArr(values[1]["code"]));



            this.$emit("getRegion", this.region)

          }else {

            console.log("数据不全");

          }



        } else {

          this.regionInit = true;

        }

      },



    },

  }



</script>



<style scoped>



  div.content {

    text-align: center;

  }



  label.title {

    margin-left: 10px;

    margin-right: 10px;

    width: 80%;

    background: white;

    font-size: 1rem;

    color: #7f828b;

  }



</style>





### 关于代码随想录 Day04 的学习资料与解析 #### 一、Day04 主要内容概述 代码随想录 Day04 的主要内容围绕 **二叉树的遍历** 展开,包括前序、中序和后序三种遍历方式。这些遍历可以通过递归实现,也可以通过栈的方式进行迭代实现[^1]。 #### 二、二叉树的遍历方法详解 ##### 1. 前序遍历(Pre-order Traversal) 前序遍历遵循访问顺序:根节点 -> 左子树 -> 右子树。以下是基于递归的实现: ```python def preorderTraversal(root): result = [] def traversal(node): if not node: return result.append(node.val) # 访问根节点 traversal(node.left) # 遍历左子树 traversal(node.right) # 遍历右子树 traversal(root) return result ``` 对于迭代版本,则可以利用显式的栈来模拟递归过程: ```python def preorderTraversal_iterative(root): stack, result = [], [] current = root while stack or current: while current: result.append(current.val) # 访问当前节点 stack.append(current) # 将当前节点压入栈 current = current.left # 转向左子树 current = stack.pop() # 弹出栈顶元素 current = current.right # 转向右子树 return result ``` ##### 2. 中序遍历(In-order Traversal) 中序遍历遵循访问顺序:左子树 -> 根节点 -> 右子树。递归实现如下: ```python def inorderTraversal(root): result = [] def traversal(node): if not node: return traversal(node.left) # 遍历左子树 result.append(node.val) # 访问根节点 traversal(node.right) # 遍历右子树 traversal(root) return result ``` 迭代版本同样依赖栈结构: ```python def inorderTraversal_iterative(root): stack, result = [], [] current = root while stack or current: while current: stack.append(current) # 当前节点压入栈 current = current.left # 转向左子树 current = stack.pop() # 弹出栈顶元素 result.append(current.val) # 访问当前节点 current = current.right # 转向右子树 return result ``` ##### 3. 后序遍历(Post-order Traversal) 后序遍历遵循访问顺序:左子树 -> 右子树 -> 根节点。递归实现较为直观: ```python def postorderTraversal(root): result = [] def traversal(node): if not node: return traversal(node.left) # 遍历左子树 traversal(node.right) # 遍历右子树 result.append(node.val) # 访问根节点 traversal(root) return result ``` 而迭代版本则稍复杂一些,通常采用双栈法或标记法完成: ```python def postorderTraversal_iterative(root): if not root: return [] stack, result = [root], [] while stack: current = stack.pop() result.insert(0, current.val) # 插入到结果列表头部 if current.left: stack.append(current.left) # 先压左子树 if current.right: stack.append(current.right) # 再压右子树 return result ``` #### 三、补充知识点 除了上述基本的二叉树遍历外,Day04 还可能涉及其他相关内容,例如卡特兰数的应用场景以及组合问题的基础模板[^2][^4]。如果遇到具体题目,可以根据实际需求调用相应算法工具。 --- ####
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值