2019-04-24 vue+iview实现省市区三级联动

表单代码

<html>
 <head></head>
 <body>
  <template> 
   <div class="page-address"> 
    <div class="address-title"> 
     <span>可用收货地址</span> 
    </div> 
    <div class="address-not" v-if="userAddress == null || userAddress.length == 0"> 
     <div class="address-not-msg"> 
      <span>您还未设置地址哦</span> 
     </div> 
     <div class="address-not-button"> 
      <button type="primary" @click="addModal = true">添加收货地址</button> 
      <modal v-model="addModal" width="600" :mask-closable="false"> 
       <p slot="header" style="color:#f60;text-align:center"> <span>新增收货地址</span> </p> 
       <div style="margin-left: 30px;font-size: 14px;"> 
        <span style="color:#CCD0D7">当前配送至:</span>
        <span style="font-weight: bold;margin-left: 20px;">中国大陆</span> 
       </div> 
       <div style="margin-top: 20px;"> 
        <!-- <Form ref="formValidate" :model="formValidate" :rules="ruleValidate" :label-width="80"> --> 
        <form ref="formValidate" :model="formValidate" :rules="ruleValidate" :label-width="90"> 
         <formitem label="收货人姓名" prop="name"> 
          <input v-model="formValidate.name" placeholder="长度不超过18个字符哦" /> 
         </formitem> 
         <formitem prop="province" label="省份"> 
          <select v-model="formValidate.province" placeholder="请选择省份" @on-change="changeProvince"> <option v-for="(item,index) in provinceArr" :key="item.value" :value="item.value">{{ item.label }}</option> </select> 
         </formitem> 
         <formitem prop="city" label="城市"> 
          <select v-model="formValidate.city" placeholder="请选择城市" @on-change="changeCity"> <option v-for="(item,index) in citiesArr" :key="item.value" :value="item.value">{{ item.label }}</option> </select> 
         </formitem> 
         <formitem prop="county" label="区县"> 
          <select v-model="formValidate.county" placeholder="请选择区县"> <option v-for="(item,index) in countyArr" :key="item.value" :value="item.value">{{ item.label }}</option> </select> 
         </formitem> 
         <formitem label="详细地址" prop="desc"> 
          <input v-model="formValidate.desc" type="textarea" :autosize="{minRows: 2,maxRows: 5}" placeholder="请输入详细地址信息,如街道,小区,门牌号,楼栋号,单元等信息" /> 
         </formitem> 
         <formitem label="手机号码" prop="mobile"> 
          <input v-model="formValidate.mobile" placeholder="请填写正确可用的手机号哦" /> 
         </formitem> 
         <formitem prop="interest"> 
          <checkbox v-model="formValidate.interest"> 
           <span>设置为默认收货地址</span> 
          </checkbox> 
         </formitem> 
         <formitem> 
          <button type="primary" @click="handleSubmit('formValidate')">添加</button> 
         </formitem> 
        </form> 
       </div> 
       <!-- 对话框页脚 删除按钮 --> 
       <div slot="footer"> 
       </div> 
      </modal> 
     </div> 
    </div> 
   </div> 
  </template> 
 </body>
</html>

关键代码

<html>
 <head></head>
 <body>
  <formitem prop="province" label="省份"> 
   <select v-model="formValidate.province" placeholder="请选择省份" @on-change="changeProvince"> <option v-for="(item,index) in provinceArr" :key="item.value" :value="item.value">{{ item.label }}</option> </select> 
  </formitem> 
  <formitem prop="city" label="城市"> 
   <select v-model="formValidate.city" placeholder="请选择城市" @on-change="changeCity"> <option v-for="(item,index) in citiesArr" :key="item.value" :value="item.value">{{ item.label }}</option> </select> 
  </formitem> 
  <formitem prop="county" label="区县"> 
   <select v-model="formValidate.county" placeholder="请选择区县"> <option v-for="(item,index) in countyArr" :key="item.value" :value="item.value">{{ item.label }}</option> </select> 
  </formitem> 
 </body>
</html>

使用@on-change事件进行联动
vue读取本地省市区json文件

created(){
      this.$axios.get('http://localhost:8080/static/json/provinces.json').then((data) => {
          this.provinceArr = data.data.data
      })
}

不知道有没更好的获取办法,网上找了好久,省市区json是在网上找的,然后自己修改了一点,链接:文件地址

**完整的js部分代码**
<script>
    export default {
        data(){
            var regPhone=/^((13[0-9])|(14[5|7])|(15([0-3]|[5-9]))|(18[0,5-9]))\d{8}$/
            const validatePhone = (rule, value, callback) => {
                if (value === '') {
                    callback(new Error('请填写手机号'));
                } else if (!regPhone.test(value)) {
                    callback(new Error('请输入正确手机号'));
                } else {
                    callback();
                }
            };
            return{
                isMultiple: false,
                provinceArr: [],
                citiesArr: [],
                countyArr:[],
                formValidate: {
                    province: '',
                    city: '',
                    county: '',
                    // 地址是否为默认地址
                    interest: false,
                    mobile: '',
                    // 地址详情
                    desc: ''
                },
                ruleValidate: {
                    name: [
                        { required: true, message: '收货人姓名不能为空哦', trigger: 'blur' },
                        { type: 'string', min: 2,max: 18, message: '收货人姓名应在2到18个字符哦', trigger: 'blur' }
                    ],
                    province: [
                        { required: true, message: '请选择收货地所属的省份', trigger: 'change' }
                    ],
                    city: [
                        { required: true, message: '请选择收货地所属的市', trigger: 'change' }
                    ],
                    county: [
                        { required: true, message: '请选择收货地所属的区县', trigger: 'change' }
                    ],
                    desc: [
                        { required: true, message: '请填写收货地的详细信息', trigger: 'blur' },
                        // { type: 'string', min: 20, message: 'Introduce no less than 20 words', trigger: 'blur' }
                    ],
                    mobile: [
                        { validator: validatePhone, trigger: 'blur' }
                    ]
                }
            }
        },
        created(){
            this.$axios.get('http://localhost:8080/static/json/provinces.json').then((data) => {
                this.provinceArr = data.data.data
            })
        },
        methods: {
            changeProvince(val){
            for(var i=0; i<this.provinceArr.length; i++){
                if(val == this.provinceArr[i].value ){
                    this.citiesArr = this.provinceArr[i].children
                    this.formValidate.county = ''
                    this.countyArr = []
                }
            }
        },
        changeCity(val){
            for(var i=0; i<this.citiesArr.length; i++){
                if(val == this.citiesArr[i].value ){
                    this.countyArr = this.citiesArr[i].children
                }
            }
        }
    }
}
</script>
image.png
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,686评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,668评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,160评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,736评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,847评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,043评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,129评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,872评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,318评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,645评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,777评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,470评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,126评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,861评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,095评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,589评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,687评论 2 351

推荐阅读更多精彩内容

  • 基于Vue的一些资料 内容 UI组件 开发框架 实用库 服务端 辅助工具 应用实例 Demo示例 element★...
    尝了又尝阅读 1,142评论 0 1
  • 最近在做表单的时候,要用到 省市区三级联动 的插件。 在网上搜了很多插件,但是感觉有的插件做的并不太好,并且有的插...
    _信仰zmh阅读 7,356评论 2 3
  • 早在一年多以前,我写过一篇微信小程序-省市区县三级联动选择器的文章,那时候小程序刚起步,网上找了很久没有相关的文献...
    生无可恋的程序员阅读 45,678评论 19 26
  • 33、JS中的本地存储 把一些信息存储在当前浏览器指定域下的某一个地方(存储到物理硬盘中)1、不能跨浏览器传输:在...
    萌妹撒阅读 2,079评论 0 2
  • 感赏儿子今天禁青毒知识大赛荣获一等奖,拿到名次,看到儿子久违的笑容。也看到自信的娃,感赏儿子晚上和同学聚餐能和同学...
    zzp张志平阅读 138评论 0 2