vue学习之mintui picker选择器实现省市二级联动示例

本文介绍了vue学习之mintui picker选择器实现省市二级联动示例,分享给大家,具体如下:

Mint UI 使用文档:https://mint-ui.github.io/docs/#/zh-cn2

Popup弹出框介绍:https://mint-ui.github.io/docs/#/zh-cn2/popup

Picker选择器介绍:https://mint-ui.github.io/docs/#/zh-cn2/picker

Datetime picker日期选择器介绍:https://mint-ui.github.io/docs/#/zh-cn2/datetime-picker

代码如下:

<!-- 页面模版 -->
<template>
 <div>
  <!--header-->
  <com-header :title="headerData.title" :toLink="headerData.toLink"></com-header>
  <!--header end-->
  <!--container-->
  <div class="ybb-yuyue">
   <div class="yy-item-box mine-me">
    <a class="mint-cell mint-field">
     <div class="mint-cell-left"></div>
     <div class="mint-cell-wrapper">
      <div class="mint-cell-title">
       <span class="mint-cell-text">头像</span>
      </div>
      <div class="mint-cell-value">
       <div class="mint-cell-value"></div>
       <img v-bind:src="data.photo" :onerror="headImg" class="img-box5">
      </div>
     </div>
    </a>
   </div>
   <div class="yy-item-box mine-me">
    <a class="mint-cell mint-field">
     <div class="mint-cell-left"></div>
     <div class="mint-cell-wrapper">
      <div class="mint-cell-title">
       <span class="mint-cell-text">姓名</span>
      </div>
      <div class="mint-cell-value">
       <div class="mint-cell-value">
        <input placeholder="请输入姓名" type="text" class="mint-field-core text-right" v-model="data.userName">
        <div class="mint-field-clear" style="display: none;"><i class="mintui mintui-field-error"></i></div>
       </div>
      </div>
     </div>
    </a>
    <a class="mint-cell mint-field">
     <div class="mint-cell-left"></div>
     <div class="mint-cell-wrapper">
      <div class="mint-cell-title">
       <span class="mint-cell-text">性别</span>
      </div>
      <div class="mint-cell-value">
       <div class="mint-cell-value is-link" @click="sexVisible = true">
        <input placeholder="请选择性别" type="text" class="mint-field-core text-right" readonly="readonly" v-model="data.sexText">
        <div class="mint-field-clear" style="display: none;"><i class="mintui mintui-field-error"></i></div>
       </div>
      </div>
      <i class="mint-cell-allow-right"></i>
      <mt-actionsheet :actions="sexs" v-model="sexVisible" cancel-text="取消"></mt-actionsheet>
     </div>
    </a>
    <a class="mint-cell mint-field">
     <div class="mint-cell-left"></div>
     <div class="mint-cell-wrapper">
      <div class="mint-cell-title">
       <span class="mint-cell-text">出生日期</span>
      </div>
      <div class="mint-cell-value">
       <div class="mint-cell-value is-link" @click="open('datePicker')">
        <input placeholder="请选择日期" type="text" class="mint-field-core text-right" readonly="readonly" v-model="data.birthday">
        <div class="mint-field-clear" style="display: none;"><i class="mintui mintui-field-error"></i></div>
       </div>
      </div>
      <i class="mint-cell-allow-right"></i>
      <mt-datetime-picker
       ref="datePicker"
       type="date"
       :startDate="startDate"
       :endDate="endDate"
       v-model="dateValue"
       @confirm="handleChange">
      </mt-datetime-picker>
     </div>
    </a>
   </div>
   <div class="yy-item-box mine-me">
    <a class="mint-cell mint-field">
     <div class="mint-cell-left"></div>
     <div class="mint-cell-wrapper">
      <div class="mint-cell-title">
       <span class="mint-cell-text">电话号码</span>
      </div>
      <div class="mint-cell-value">
       <div class="mint-cell-value">
        <input placeholder="请输入电话号码" type="text" readonly="readonly" class="mint-field-core text-right gray" v-model="data.mobile">
        <div class="mint-field-clear" style="display: none;"><i class="mintui mintui-field-error"></i></div>
       </div>
      </div>
     </div>
    </a>
    <a class="mint-cell mint-field">
     <div class="mint-cell-left"></div>
     <div class="mint-cell-wrapper">
      <div class="mint-cell-title">
       <span class="mint-cell-text">所在地区</span>
      </div>
      <div class="mint-cell-value">
       <div class="mint-cell-value is-link" @click="choiceArea">
        <input placeholder="请选择省市" type="text" class="mint-field-core text-right" readonly="readonly" v-model="data.areaText">
        <div class="mint-field-clear" style="display: none;"><i class="mintui mintui-field-error"></i></div>
       </div>
      </div>
      <i class="mint-cell-allow-right"></i>
      <mt-popup v-model="popupVisible" position="bottom" class="mint-popup-4">
       <div class="picker-toolbar">
        <span class="mint-datetime-action mint-datetime-cancel" @click="cancleaddress">取消</span>
        <span class="mint-datetime-action mint-datetime-confirm" @click="selectaddress">确定</span>
       </div>
       <mt-picker :slots="citySlots" @change="onCityChange" :visible-item-count="3"></mt-picker>
      </mt-popup>
     </div>
    </a>
    <a class="mint-cell mint-field">
     <div class="mint-cell-left"></div>
     <div class="mint-cell-wrapper">
      <div class="mint-cell-title">
       <span class="mint-cell-text">详细地址</span>
      </div>
      <div class="mint-cell-value">
       <div class="mint-cell-value">
        <input placeholder="街道、楼牌号等" type="text" class="mint-field-core text-right" v-model="data.address">
        <div class="mint-field-clear" style="display: none;"><i class="mintui mintui-field-error"></i></div>
       </div>
      </div>
     </div>
    </a>
   </div>
  </div>
  <div class="yuyue-submit">
   <button class="mint-button mint-button--default mint-button--large ybb-btn" @click="infoSave"><label class="mint-button-text title-1">保存</label></button>
  </div>
  <!--container end-->
 </div>
</template>
<script>
import {Toast} from 'mint-ui'
import validators from '../utils/validators'
import comHeader from 'components/comHeader'
import mineInfoService from 'SERVICES/mineInfoService' 

export default {
 components: {
  comHeader
 },
 data: () => ({
  headImg: 'this.src="' + require('../assets/img.png') + '"',
  headerData: {
   title: '我的资料',
   toLink: '/Mine'
  },
  popupVisible: false,
  sexVisible: false,
  areaPicker: '',
  areaList: [],
  data: {
   photo: '',
   userName: '',
   sex: '',
   sexText: '',
   mobile: '',
   birthday: '',
   privinceName: '',
   provinceId: '',
   cityName: '',
   cityId: '',
   address: '',
   areaText: ''
  },
  sexs: [],
  citySlots: [
   {
    flex: 1,
    values: Object.keys(address),
    className: 'slot1',
    textAlign: 'center'
   }, {
    divider: true,
    content: '-',
    className: 'slot2'
   }, {
    flex: 1,
    values: Object.values(address)[0],
    className: 'slot3',
    textAlign: 'center'
   }
  ],
  addressProvince: '',
  addressProvinceId: '',
  addressCity: '',
  addressCityId: '',
  dateValue: new Date(),
  startDate: new Date('1900-01-01'),
  endDate: new Date()
 }),
 created () {
  this.loadMineInfo()
  this.loadAreaList()
 },
 mounted () {
  this.sexs = [{
   name: '男',
   method: this.selectMan
  }, {
   name: '女',
   method: this.selectWoman
  }]
 },
 methods: {
  loadAreaList: function () {
   mineInfoService.loadAreaList().then(res => {
    if (res.t) {
     this.areaList = res.t
     address = this.areaList.areaList[0]
     provinceCodeList = this.areaList.provinceCodeList[0]
     cityCodeList = this.areaList.cityCodeList[0]
     this.citySlots[0].values = Object.keys(address)
     this.citySlots[2].values = Object.values(address)[0]
    } else {
     Toast('地区数据异常')
    }
   })
  },
  choiceArea: function () {
   this.popupVisible = true
   // 设置默认选中
   if (this.data.privinceName !== '' && this.data.cityName !== '') {
    this.areaPicker.setSlotValue(0, this.data.privinceName)
    this.areaPicker.setSlotValue(1, this.data.cityName)
    console.log(this.data.privinceName + '-' + this.data.cityName)
   }
  },
  cancleaddress: function () {
   this.popupVisible = false
   this.areaPicker.setSlotValue(0, this.data.privinceName)
   this.areaPicker.setSlotValue(1, this.data.cityName)
  },
  selectaddress: function () {
   this.popupVisible = false
   this.data.privinceName = this.addressProvince
   this.data.cityName = this.addressCity
   this.data.provinceId = this.addressProvinceId
   this.data.cityId = this.addressCityId
   this.data.areaText = this.data.privinceName + this.data.cityName
  },
  infoSave: function () {
   if (this.data.userName.trim() === '') {
    Toast('请输入姓名')
   } else if (this.data.userName.trim().length > 12) {
    Toast('姓名不能超过12个字符')
   } else if (this.data.sex.toString().trim() === '') {
    Toast('请选择性别')
   } else if (this.data.birthday.trim() === '') {
    Toast('请选择出生日期')
   } else if (this.data.mobile.trim() === '') {
    Toast('请输入电话号码')
   } else if (!validators.mobile(this.data.mobile.trim())) {
    Toast('电话号码不正确')
   } else if (this.data.areaText.toString().trim() === '') {
    Toast('请选择所在地区')
   } else if (this.data.address.trim() === '') {
    Toast('请输入详细地址')
   } else if (this.data.address.trim().length > 50) {
    Toast('详细地址不能超过50个字符')
   } else {
    this.doAdd()
   }
  },
  doAdd: function () {
   mineInfoService.updateAccount(this.data).then(res => {
    Toast('修改成功')
    this.$router.push('/Mine')
   })
  },
  loadMineInfo: function () {
   mineInfoService.loadMineInfo().then(res => {
    this.data.photo = res.t.member.photo || ''
    this.data.userName = res.t.member.userName || ''
    this.data.sex = res.t.member.sex || ''
    this.data.sexText = res.t.member.sex === '1' ? '男' : (res.t.member.sex === '0' ? '女' : '')
    this.data.mobile = res.t.member.mobile || ''
    this.data.birthday = res.t.member.birthday || ''
    this.data.area = res.t.member.area || ''
    this.data.address = res.t.member.address || ''
    this.dateValue = this.data.birthday
    this.data.privinceName = res.t.member.priviceName || ''
    this.data.cityName = res.t.member.cityName || ''
    this.data.provinceId = res.t.member.provinceId || ''
    this.data.cityId = res.t.member.cityId || ''
    this.data.areaText = this.data.privinceName + this.data.cityName
   })
  },
  onCityChange: function (picker, values) {
   this.areaPicker = picker
   /* 此处不直接使用this.data.privinceName、this.data.cityName、this.data.provinceId、this.data.cityId,由于在加载地区信息之后,我又重新设置了绑定到slots属性的值,此时也会触发@change事件,所以在nCityChange方法里需要用四个变量替代上述四个变量来记录当前选中的值,然后在点击确定之后的方法里将这四个值赋给上述四个变量。如果直接在该方法里使用上述四个变量来获取当前选中的值,可能导致数据错乱 */
   picker.setSlotValues(1, address[values[0]])
   this.addressProvince = values[0]
   this.addressCity = values[1]
   this.addressProvinceId = provinceCodeList[this.addressProvince] + ''
   this.addressCityId = cityCodeList[this.addressCity] + ''
  },
  open: function (picker) {
   this.dateValue = this.data.birthday
   this.$refs[picker].open()
  },
  handleChange: function (value) {
   this.data.birthday = window.moment(value).format('YYYY-MM-DD')
  },
  selectMan: function () {
   this.data.sex = '1'
   this.data.sexText = '男'
  },
  selectWoman: function () {
   this.data.sex = '0'
   this.data.sexText = '女'
  }
 }
} 

let address = {}
let provinceCodeList = {}
let cityCodeList = {}
</script>
<style scoped>
.mint-popup-4 {
  width: 100%;
}
.mint-popup-4 .picker-slot-wrapper, .page-popup .mint-popup-4 .picker-item {
  -webkit-backface-visibility: hidden;
  backface-visibility: hidden;
}
</style>

地区数据格式如下:

{
  "code": 200,
  "msg": "获取区域信息成功!",
  "t": {
    "areaList": [
      {
        "上海": [
          "上海"
        ],
        "北京": [
          "北京"
        ],
        "广东": [
          "广州",
          "深圳"
        ],
        "江苏": [
          "徐州",
          "南京"
        ],
        "福建": [
          "福州"
        ]
      }
    ],
    "provinceCodeList": [
      {
        "上海": [
          "120001"
        ],
        "北京": [
          "110001"
        ],
        "广东": [
          "130001"
        ],
        "江苏": [
          "130007"
        ],
        "福建": [
          "0100"
        ]
      }
    ],
    "cityCodeList": [
      {
        "上海": [
          "120002"
        ],
        "北京": [
          "110002"
        ],
        "广州": [
          "130002"
        ],
        "南京": [
          "130006"
        ],
        "深圳": [
          "518000"
        ],
        "福州": [
          "0200"
        ],
        "徐州": [
          "130009"
        ]
      }
    ]
  }
} 

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • vue mintui-Loadmore结合实现下拉刷新和上拉加载示例

    mintui是饿了么团队针对vue开发的移动端组件库,方便实现移动端的一些功能,这里只用了Loadmore功能实现移动端的上拉分页刷新,下拉加载数据,废话不说上代码. <template> <div class="main-body" :style="{'-webkit-overflow-scrolling': scrollMode}"> <v-loadmore :top-method="loadTop" :bott

  • vue中axios处理http发送请求的示例(Post和get)

    本文介绍了vue中axios处理http发送请求的示例(Post和get),分享给大家,具体如下: axios中文文档 https://github.com/mzabriskie/axios#using-applicationx-www-form-urlencoded-format   axios文档 在处理http请求方面,已经不推荐使用vue-resource了,而是使用最新的axios,下面做一个简单的介绍. 安装 使用node npm install axios 使用cdn <scrip

  • Vue 2.0学习笔记之Vue中的computed属性

    Vue中的 computed 属性称为 计算属性 .在这一节中,我们学习Vue中的计算属性如何使用?记得在学习Vue的模板相关的知识的时候,知道在模板内可以使用表达式,而且模板内的表达式是非常的便利,但这种遍历是有一定的限制的,它们实际上是用于一些简单的运算.也就是说,如果在模板中放入太多的逻辑会让模板过重而且难以维护.咱们先来看一个示例: <div id="app"> <h1>{{ message.split('').reverse().join('') }}

  • Vue中封装input组件的实例详解

    Vue中封装input组件 最近有点忙不过来 脱了很久,没有更新 抱歉.今天要将的时如何自定义封装input组件 ,博主知识发个简单的模板 码友们可以更具自己的实际项目添加需要的参数 我的项目中的UI图是这样的 代码如下 子组件的模板设置 <template> <div class="completion-input-box"> <span class="input-box-name">{{text}}</span>

  • 如何在ASP.NET Core应用程序运行Vue并且部署在IIS上详解

    前言 从.NET Core 1.0开始我们就将其应用到项目中,但是呢我对ASP.NET Core一些原理也还未开始研究,仅限于会用,不过园子中已有大量文章存在,借着有点空余时间,我们来讲讲如何利用ASP.NET Core结合Vue在IIS上运行. ASP.NET Core结合Vue部署于IIS 关于安装Vue和Webpack则不再叙述,我们直接来创建ASP.NET Core应用程序或者通过dotnet new mvc创建ASP.NET Core应用程序 接下来在上述应用程序下通过如下命令创建Vu

  • Vue中之nextTick函数源码分析详解

    1. 什么是Vue.nextTick()? 官方文档解释如下: 在下次DOM更新循环结束之后执行的延迟回调.在修改数据之后立即使用这个方法,获取更新后的DOM. 2. 为什么要使用nextTick? <!DOCTYPE html> <html> <head> <title>演示Vue</title> <script src="https://tugenhua0707.github.io/vue/vue1/vue.js"&

  • Vue 2.0入门基础知识之内部指令详解

    1.Vue.js介绍 当前前端三大主流框架:Angular.React.Vue.React前段时间由于许可证风波,使得Vue的热度蹭蹭地上升.另外,Vue友好的API文档更是一大特色.Vue.js是一个非常轻量级的工具,与其说是一个MVVM框架,不如说是一个js库.Vue.js具有响应式编程和组件化的特点.响应式编程,即保持状态和视图的同步,状态也可以说是数据吧:而其组件化的理念与React则一样,即"一切都是组件,组件化思想方便于模块化的开发,是前端领域的一大趋势. 2.内部指令 2-1.v-

  • 浅谈vue路径优化之resolve

    通过vue-cli来创建vue+webpack的项目时,已经有很多都配置好了,但是路径方面为了方便开发,还可以优化. 1. resolve.extensions 在webpack.base.conf.js中,我们可以看到resolve配置,其中的extengsions是一个数组,如下所示: extensions: ['.js', '.vue', '.json'], 通过这样的配置,我们在组件中过着路由中应用组件时,就可以更为方便的应用,比如: import Hello from '@compon

  • vue学习之mintui picker选择器实现省市二级联动示例

    本文介绍了vue学习之mintui picker选择器实现省市二级联动示例,分享给大家,具体如下: Mint UI 使用文档:https://mint-ui.github.io/docs/#/zh-cn2 Popup弹出框介绍:https://mint-ui.github.io/docs/#/zh-cn2/popup Picker选择器介绍:https://mint-ui.github.io/docs/#/zh-cn2/picker Datetime picker日期选择器介绍:https://

  • vue mint-ui 实现省市区街道4级联动示例(仿淘宝京东收货地址4级联动)

    本文介绍了vue mint-ui 实现省市区街道4级联动示例(仿淘宝京东收货地址4级联动) 先去下载一个"省份.城市.区县.乡镇" 四级联动数据,然后 引入 import { Picker } from 'mint-ui'; //前提是npm install mint-ui -S Vue.component(Picker.name, Picker); 组件使用 <mt-picker :slots="addressSlots" class="picke

  • Vue配合iView实现省市二级联动的示例代码

    在实现省市二级联动时,如果省份和城市写在一个数组对象中.可以根据,点击某个省份时获取到目标省份的id 是否同 数组中的某个对象id一致 来判断 iView中的on-change事件 on-change事件:即选中的Option变化时触发,默认返回 value.(value在这里只支持String和Number类型) 1.html部分 <template> <Form ref="formValidate" :model="formValidate"

  • JS实现简单省市二级联动

    刚始学习java刚好看到用js实现省市二级联动的效果,就想着写篇博客,顺便检验下自己的学习成果. 好了废话少说先看看实际效果: 技术分析: 要实现这个功能呢,首先要用到html+js 这里用建一个下拉列表,绑定onchange事件 <select onchange="changeCity(this.value)"> <option>--请选择--</option> <option value="0">湖北</op

  • AngularJS实现的省市二级联动功能示例【可对选项实现增删】

    本文实例讲述了AngularJS实现的省市二级联动功能.分享给大家供大家参考,具体如下: <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8"> <title>www.jb51.net 省市二级联动</title> </head> <style> *{ margin:0; padding:0; } .u

  • js实现的全国省市二级联动下拉选择菜单完整实例

    本文实例讲述了js实现的全国省市二级联动下拉选择菜单.分享给大家供大家参考.具体如下: 运行效果截图如下: 在线演示地址如下: http://demo.jb51.net/js/2015/js-province-city-cho-menu-codes/ 具体代码如下: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-

  • 省市二级联动小案例讲解

    在网页开发过程中,选择省市的时候,省市之间有关联,这是一个小小的二级联动案例 ,运用到HTML.css.php.js以及 AJAX的异步请求 首先建立city.php和province.php文件和connet.html,将二级联动的大概结构写出来,html代码如下: <label>省份:</label> <select id="province"> <option>请选择</option> </select> &

  • 基于javascript实现全国省市二级联动下拉选择菜单

    本文实例讲述了js实现全国省市二级联动下拉选择菜单,分享给大家供大家参考.具体如下: 效果图: 具体代码: <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=gb2312" /> <title>无标题文档</title> <script type="text/javascript"&g

  • javascript支持区号输入的省市二级联动下拉菜单

    省市二级联动下拉菜单,增加了区号输入.多组选项共用一组数据. 选择地区,可以获取区号,填写区号自动选取地区. 某些地市的区号收集中. 省份 选择城区 1)inti(0);findarea();"> 省份 选择城区 1)inti(1);findarea();"> var areaList={ "北京":[["选择城区","10"],["东城区",""],["西城区&q

  • jQuery+Asp.Net实现省市二级联动功能的方法

    本文实例讲述了jQuery+Asp.Net实现省市二级联动功能的方法.分享给大家供大家参考,具体如下: 页面html: <%@ Page Language="C#" AutoEventWireup="true" CodeFile="ddlAjax.aspx.cs" Inherits="ThreeAjaxDrop_ddlAjax" %> <!DOCTYPE html PUBLIC "-//W3C//D

随机推荐