亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

基于elementUI使用v-model實現經緯度輸入的vue組件

2019-11-19 11:36:03
字體:
來源:轉載
供稿:網友
  • 綁定一個 [12.34,-45.67] (東經西經,南緯北緯 正負表示) 形式的經緯度數組,能夠按度分秒進行編輯,效果如下所示,點擊東經,北緯可切換。
  • 經緯度的 度轉度分秒
  • 能夠獲取度分秒格式數據  

Coordinates組件實現

模板

一個span顯示東經西經,三個輸入框輸入度分秒

<template> <div class="coordinates">  <!-- 經度 -->  <div class="item">   <span class="itude"      @click="itudeChange(true)">{{ longFlag | longitudeName }}</span>   <el-input v-model.number="longitude[0]"        @change="change(true,0)"        size="mini">    <i slot="suffix">°</i>   </el-input>   <el-input v-model.number="longitude[1]"        @change="change(true,1)"        size="mini">    <i slot="suffix">′</i>   </el-input>   <el-input v-model.number="longitude[2]"        @change="change(true,2)"        size="mini">    <i slot="suffix">″</i>   </el-input>  </div>  <!-- 緯度 -->  <div class="item">   <span class="itude"      @click="itudeChange(false)">{{ latFlag | latitudeName }}</span>   <el-input v-model.number="latitude[0]"        @change="change(false,0)"        size="mini">    <i slot="suffix">°</i>   </el-input>   <el-input v-model.number="latitude[1]"        @change="change(false,1)"        size="mini">    <i slot="suffix">′</i>   </el-input>   <el-input v-model.number="latitude[2]"        @change="change(false,2)"        size="mini">    <i slot="suffix">″</i>   </el-input>  </div> </div></template>

實現

props: 父組件傳入的參數 value ,驗證合法性 經度絕對值小于180,緯度絕對值小于90,數組長度為2

value: { //綁定的 value type: Array, require: true, validator: function (value) {  let len = value.length > 0 && value.length === 2  let isvalid = Math.abs(value[0]) < 180 && Math.abs(value[1]) < 90  return len && isvalid }, default: function () {  return [] }}

model: prop為 value 時不用實現 model 但是this.$emit(event,arg) 傳入的event需要為 'input',這里要注意

model: {  prop: 'value', event: 'input'},

v-model實現: 使用this.$emit(event,arg)修改父組件的數據

/** * v-model 綁定事件 雙向綁定實現 */returnBackFn () { let longitude = parseFloat(this.longFlag + this.Dms2D(this.longitude)); let latitude = parseFloat(this.latFlag + this.Dms2D(this.latitude)); let array = [longitude, latitude] this.$emit('input', array);},

Coordinates組件完整代碼

<template> <div class="coordinates">  <!-- 經度 -->  <div class="item">   <span class="itude"      @click="itudeChange(true)">{{ longFlag | longitudeName }}</span>   <el-input v-model.number="longitude[0]"        @change="change(true,0)"        size="mini">    <i slot="suffix">°</i>   </el-input>   <el-input v-model.number="longitude[1]"        @change="change(true,1)"        size="mini">    <i slot="suffix">′</i>   </el-input>   <el-input v-model.number="longitude[2]"        @change="change(true,2)"        size="mini">    <i slot="suffix">″</i>   </el-input>  </div>  <!-- 緯度 -->  <div class="item">   <span class="itude"      @click="itudeChange(false)">{{ latFlag | latitudeName }}</span>   <el-input v-model.number="latitude[0]"        @change="change(false,0)"        size="mini">    <i slot="suffix">°</i>   </el-input>   <el-input v-model.number="latitude[1]"        @change="change(false,1)"        size="mini">    <i slot="suffix">′</i>   </el-input>   <el-input v-model.number="latitude[2]"        @change="change(false,2)"        size="mini">    <i slot="suffix">″</i>   </el-input>  </div> </div></template><script>require('math')export default { name: 'Coordinates', props: {  value: { //綁定的 value   type: Array,   require: true,   validator: function (value) {    let len = value.length > 0 && value.length === 2    let isvalid = Math.abs(value[0]) < 180 && Math.abs(value[1]) < 90    return len && isvalid   },   default: function () {    return []   }  } }, // model: { // prop為 value 時不用實現 model 但是this.$emit(event,arg) 傳入的event需要為 'input' //  prop: 'value', //  event: 'returnBack' // }, data () {  return {   longitude: [], // 經度   latitude: [],  // 緯度   longFlag: '+', //表示東經西經   latFlag: '+',  //表示南緯北緯  } }, created: function () {  this.initData(); }, filters: {  longitudeName (value) {   return value === '+' ? "東經" : "西經"  },  latitudeName (value) {   return value === '+' ? "南緯" : "北緯"  } }, watch: {  /**  * 監測父組件綁定的value  */  value () {   this.initData();  } }, computed: {  // 轉換為  東經 XXX°XX′XX″  格式   // 返回一個經緯度的數組  formatString () {   let longitude = (this.longFlag === '+' ? "東經 " : "西經 ") + this.longitude[0] + '°' + this.longitude[1] + '′' + this.longitude[2] + '″';   let latitude = (this.latFlag === '+' ? "南緯 " : "北緯 ") + this.latitude[0] + '°' + this.latitude[1] + '′' + this.latitude[2] + '″';   return [longitude, latitude]  } }, methods: {  /**   * 東經西經,南緯北緯 change事件   */  itudeChange (flag) {   flag ? (this.longFlag = (this.longFlag === '+' ? '-' : '+')) : (this.latFlag = (this.latFlag === '+' ? '-' : '+'))   this.returnBackFn()  },  /**   * 初始化數據,父組件修改綁定的value時調用   */  initData () {   this.longitude = this.D2Dms(Math.abs(this.value[0]));   this.latitude = this.D2Dms(Math.abs(this.value[1]));   this.longFlag = this.value[0] < 0 ? '-' : '+'   this.latFlag = this.value[1] < 0 ? '-' : '+'  },  /**   * 輸入框change事件,數據合法性驗證   */  change (flag, index) {   let name = '', max = 0   flag ? [name, max] = ['longitude', 179] : [name, max] = ['latitude', 89]   index ? max = 59 : null   let value = parseInt(this[name][index], 10)   if (isNaN(value)) {    value = 0;   }   value = value < 0 ? 0 : value   value = value > max ? max : value   this.$set(this[name], index, value)   this.returnBackFn()  },  /**   * v-model 綁定事件 雙向綁定實現   */  returnBackFn () {   let longitude = parseFloat(this.longFlag + this.Dms2D(this.longitude));   let latitude = parseFloat(this.latFlag + this.Dms2D(this.latitude));   let array = [longitude, latitude]   this.$emit('input', array);  },  /**  * 度轉度分秒  */  D2Dms (d_data = 0) {   var degree = parseInt(d_data);   var min = parseInt((d_data - degree) * 60);   var sec = parseInt((d_data - degree) * 3600 - min * 60);   return [degree, min, sec];  },  /**  * 度分秒轉度  */  Dms2D (dms_data = [0, 0, 0]) {   let d = parseFloat(dms_data[0]);   let m = parseFloat(dms_data[1]);   let s = parseFloat(dms_data[2]);   return this.keepFourDecimal(d + m / 60 + s / 60 / 60);  },  /**  * 保留四位小數,小于四位精度可能丟失  */  keepFourDecimal (num) {   var result = parseFloat(num);   if (isNaN(result)) {    return 0;   }   result = Math.round(num * 10000) / 10000;   return result;  } },}</script><style lang="less" scoped>@color-border: #9e9e9e;@height: 28px;.coordinates { border: 1px solid @color-border; width: fit-content; display: inline-flex;}.item:nth-of-type(1) { border-right: 1px solid @color-border;}.el-input { width: 40px;}.itude { height: @height; line-height: @height; display: inline-block; padding-left: 5px; cursor: pointer; user-select: none;}i { font-size: 18px; color: gray;}</style><style lang="less">.el-input__inner { text-align: center; border: none; border-radius: unset;}.el-input--suffix .el-input__inner { padding: 0;}</style>

測試代碼 index.vue

<template> <div id="example">  <Coordinates ref="coordinates"         v-model="value"></Coordinates>  <el-button @click="changeValue"        type="primary">   change value  </el-button>  <br>  <span>value:{{value.toString()}}</span>  <br>  <span>度分秒格式:{{formatString.toString()}}</span>  <el-button @click="refresh"        type="primary">   refresh  </el-button> </div></template><script>import Coordinates from '@/components/Coordinates'export default { name: 'index', components: {  Coordinates }, data () {  return {   value: [12.34, -45.67],   formatString: []  } }, mounted () {  this.refresh () }, methods: {  changeValue () {   this.$set(this.value, 0, (this.value[0] + 2) >= 180 ? 0 : (this.value[0] + 2))   this.$set(this.value, 1, (this.value[1] + 2) >= 90 ? 0 : (this.value[1] + 2))   setTimeout(() => {    refresh ()   }, 10);  },  refresh () {   // 獲取度分秒格式   this.formatString = this.$refs.coordinates.formatString  } }}</script><style lang="less" scoped>#example { padding: 20px;}.el-button { margin: 20px;}span { font-size: 17px;}</style>

效果

修改子組件值 父組件的value會改變,修改父組件的value,子組件會自動修改, [change value] 按鈕 可以修改value [refresh] 按鈕 通過ref獲取度分秒格式的經緯度

總結

以上所述是小編給大家介紹的基于elementUI使用v-model實現經緯度輸入的vue組件,希望對大家有所幫助,如果大家有任何疑問歡迎給我留言,小編會及時回復大家的!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产精品视频网| 亚洲黄色在线观看| 久久亚洲国产成人| 久久久久免费精品国产| 97热在线精品视频在线观看| 色综合久久久久久中文网| 亚洲乱码国产乱码精品精天堂| 国产男女猛烈无遮挡91| 日韩免费高清在线观看| www亚洲精品| 欧美精品手机在线| 136fldh精品导航福利| 国产精品91久久久| 欧美黑人国产人伦爽爽爽| 91精品国产色综合久久不卡98| 国产午夜精品一区理论片飘花| 色噜噜久久综合伊人一本| 精品欧美国产一区二区三区| 亚洲a区在线视频| 欧美视频二区36p| 日韩中文在线中文网三级| 色综合91久久精品中文字幕| 欧美亚洲视频在线观看| 精品久久久久久久久中文字幕| 啪一啪鲁一鲁2019在线视频| 伊人久久久久久久久久久久久| 日韩高清电影免费观看完整版| www.xxxx欧美| 国产视频福利一区| 日韩久久免费电影| 黑人巨大精品欧美一区二区免费| 青青青国产精品一区二区| 亚洲跨种族黑人xxx| 亚洲欧洲日韩国产| 欧美区在线播放| 亚洲精品视频网上网址在线观看| 在线国产精品播放| 九九久久国产精品| 精品亚洲精品福利线在观看| 一本大道亚洲视频| 欧美成人国产va精品日本一级| 欧美大胆a视频| 欧美在线视频一区二区| y97精品国产97久久久久久| 精品偷拍一区二区三区在线看| 亚洲电影免费观看高清| 亚洲欧洲在线看| 欧美性猛交xxxx乱大交3| 久99久在线视频| 日韩性生活视频| 一区三区二区视频| 日本一区二三区好的精华液| 国产69久久精品成人| 97成人精品视频在线观看| 国内成人精品一区| 亚洲第一区中文字幕| 亚洲夜晚福利在线观看| 久久久久99精品久久久久| 久久久精品999| 热久久美女精品天天吊色| 日韩精品在线观看视频| 精品一区二区三区电影| 国产欧美在线视频| 欧美福利小视频| 亚洲一区二区中文| 亚洲一区999| 日韩精品免费在线播放| 久久网福利资源网站| 日韩在线观看精品| 精品国产乱码久久久久久虫虫漫画| 久久久久亚洲精品| 中文字幕日韩在线视频| 久久久免费av| 欧美激情国产精品| 日韩成人av网| 国产精品日日摸夜夜添夜夜av| 欧美激情视频一区二区三区不卡| 日韩av免费在线观看| 亚洲欧美国产一区二区三区| 97视频色精品| 欧美激情亚洲自拍| 日韩第一页在线| 欧美午夜宅男影院在线观看| 国产一区二区成人| 欧美激情免费观看| 欧美性受xxxx白人性爽| 国产精品日韩在线一区| 欧美在线视频播放| 亚洲男人天堂九九视频| 国产精品99久久久久久www| 欧美精品aaa| 国产性猛交xxxx免费看久久| 亚洲国产成人在线播放| 色播久久人人爽人人爽人人片视av| 91精品久久久久久久久| 欧美有码在线观看视频| 国产精品www| 亚洲国产成人精品一区二区| 91精品国产色综合久久不卡98口| 亚洲深夜福利网站| 成人黄色免费网站在线观看| www.欧美免费| 26uuu另类亚洲欧美日本一| 日韩av片电影专区| 欧美日韩国产二区| 深夜福利一区二区| 亚洲国产精品高清久久久| 日韩最新在线视频| 国产精品久久久久999| 欧美日韩亚洲一区二区三区| 亚洲电影成人av99爱色| 亚洲欧美另类人妖| 久久伊人色综合| 久久人人爽人人爽人人片av高清| 国产精品美女久久久免费| 国产一区二区三区视频在线观看| 亚洲第一中文字幕| 久久久久久97| 亚洲福利视频在线| 搡老女人一区二区三区视频tv| 亚洲一区二区三区四区在线播放| 国产精品网站视频| 国产精品久久二区| 中文字幕久精品免费视频| 欧美成人亚洲成人日韩成人| 午夜精品久久17c| 国产精品久久中文| 欧美高清视频在线播放| 国产一区二区三区在线播放免费观看| 97久久精品视频| 欧美国产亚洲视频| 精品综合久久久久久97| 欧美日韩午夜视频在线观看| 久久国产一区二区三区| 久久人91精品久久久久久不卡| 成人性生交大片免费看视频直播| 国产亚洲精品久久久久久777| 久久久视频精品| 亚洲国产婷婷香蕉久久久久久| 国产主播精品在线| 欧美老少配视频| 国产亚洲视频在线观看| 91精品视频免费观看| 欧美激情小视频| 午夜精品久久久久久久99热浪潮| 日韩精品免费一线在线观看| 亚洲午夜国产成人av电影男同| 亚洲永久在线观看| 亚洲欧洲一区二区三区在线观看| 亚洲国产成人精品女人久久久| 国产suv精品一区二区三区88区| 久久久噜噜噜久久| 一本色道久久综合狠狠躁篇怎么玩| 亚洲免费一在线| 狠狠色狠色综合曰曰| 精品伊人久久97| 国产精品视频1区| 国产在线观看精品一区二区三区| 在线观看欧美www| 亚洲在线视频福利| 亚洲永久在线观看| 九九热这里只有精品6| 色妞在线综合亚洲欧美| www.亚洲一二|