成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Vue 2升級 Vue 3初探小細節

開發 前端
我們來講講一個例子在Vue 2中的實現,舉個栗子吧,開發過程中我們只會用到省、市、區,這里的區也可以看做是三、四線城市中的縣,若我們想要基于縣動態創建鎮、村,更有甚者,在全國各地在鎮下還劃分不同的區域,我們通過Vue結合ElementUI來實現此例子,

 [[414230]]

本文轉載自微信公眾號「JeffckyShare」,作者Jeffcky。轉載本文請聯系JeffckyShare公眾號。

首先,我們來講講一個例子在Vue 2中的實現,舉個栗子吧,開發過程中我們只會用到省、市、區,這里的區也可以看做是三、四線城市中的縣,若我們想要基于縣動態創建鎮、村,更有甚者,在全國各地在鎮下還劃分不同的區域,我們通過Vue結合ElementUI來實現此例子

Vue 2 + ElementUI

由于示例代碼比較多,這里我們首先直接看效果,如下:

具體代碼如下所示,太多?忽略不看,我們只講解核心問題

  1. <el-dialog :modal="dialogModal" :title="townTitle" @close="closeDialog" :visible.sync="dialogVisible" :close-on-click-modal="false"  width="800px" top="10vh" center> 
  2.  <el-row> 
  3.   <el-form label-width="40px" ref="form" size="mini"
  4.    <el-form-item> 
  5.     <el-button size="small" @click="createMultipleTown" icon="el-icon-plus">添加鎮</el-button> 
  6.    </el-form-item> 
  7.    <el-form-item v-for="(town, tindex) in form.towns" :key="tindex" style="border: 1px dashed #AAAAAA;margin:10px 0 20px 0;"
  8.     <el-row style="margin:20px 0 20px 0;"
  9.      <el-col :span="19"
  10.       <el-button type="danger" size="small" icon="el-icon-delete" @click="removeTown(tindex)">移除鎮</el-button> 
  11.      </el-col> 
  12.     </el-row> 
  13.     <el-row style="margin:20px 0 20px 0;"
  14.      <el-col :span="4"
  15.       鎮名稱 
  16.      </el-col> 
  17.      <el-col :span="19"
  18.       <el-input maxlength="30" v-model="town.townName" placeholder="請輸入鎮名稱"></el-input> 
  19.      </el-col> 
  20.     </el-row> 
  21.     <el-row style="margin-bottom:20px;"
  22.      <el-col :span="4"
  23.       區域、村 
  24.      </el-col> 
  25.      <el-col :span="20"
  26.       <el-radio-group v-model="town.option"
  27.         <el-radio @change="dynamicAddRegion(tindex)" label="添加區域"></el-radio> 
  28.         <el-radio label="添加村" @change="dynamicAddVillage(tindex)"></el-radio> 
  29.       </el-radio-group
  30.      </el-col> 
  31.     </el-row> 
  32.     <el-row v-for="(region, rindex) in town.regions"  :key="rindex" style="margin-bottom:20px;"
  33.      <el-row> 
  34.       <el-col :span="4"
  35.         {{region.regionTitle}} 
  36.       </el-col> 
  37.       <el-col :span="5" style="margin-right:20px;" v-show="town.townRegionVisible"
  38.        <el-input size="small" maxlength="30" v-model="region.regionName" placeholder="請輸入區域名稱"></el-input> 
  39.       </el-col> 
  40.       <el-col :span="5" style="margin-right:20px;"
  41.        <el-tooltip class="item" effect="dark" content="輸入村名稱并回車,即可連續添加" placement="top"
  42.         <el-input  size="small" maxlength="30" v-model="region.villageName" @keyup.enter.native="getVillage(tindex, rindex)" placeholder="請輸入村名稱"></el-input> 
  43.        </el-tooltip> 
  44.       </el-col> 
  45.       <el-col :span="5" v-show="!town.townRegionVillageVisible"
  46.        <el-button size="small" icon="el-icon-plus"  @click="continueAddRegion(tindex)">追加區域</el-button> 
  47.       </el-col> 
  48.       <el-col :span="3"  v-show="!town.townRegionVillageVisible" style="width:100px;"
  49.        <el-button size="small" type="danger" icon="el-icon-delete"  @click="removeRegion(tindex, rindex)">移除區域</el-button> 
  50.       </el-col> 
  51.      </el-row> 
  52.      <el-row> 
  53.       <el-col :span="4"
  54.        <span>&nbsp;&nbsp;</span> 
  55.       </el-col> 
  56.       <el-col :span="20"
  57.        <el-tag  :key="tagindex" v-for="(tag, tagindex) in region.tags" closable :disable-transitions="false" style="margin:10px 10px 0 0;"  @close="handleClose(tindex, rindex, tagindex)"
  58.         {{tag}} 
  59.        </el-tag> 
  60.       </el-col> 
  61.      </el-row> 
  62.     </el-row> 
  63.    </el-form-item> 
  64.   </el-form> 
  65.  </el-row> 
  66.  <el-row v-show="saveButtonVisible"
  67.   <el-col :span="20"
  68.    <span>&nbsp;&nbsp;&nbsp;&nbsp;</span> 
  69.   </el-col> 
  70.   <el-col :span="2"
  71.    <el-button  @click="save" type="primary">確定</el-button> 
  72.   </el-col> 
  73.   <el-col :span="1"
  74.    <el-button  @click="cancel">取消</el-button> 
  75.   </el-col> 
  76.  </el-row> 
  77. </el-dialog> 

直接看如下定義數據結構可得知,存在三層遍歷,第一層遍歷從鎮開始,第二層遍歷從鎮下區域開始,最后一層遍歷則是區域下的村(即上述標簽)

  1. form: { 
  2.   areaId: 0, 
  3.   towns: [ 
  4.    { 
  5.       townName: ''
  6.       regions: [{ 
  7.       regionTitle: ''
  8.       regionName: ''
  9.       villageName: ''
  10.       tags: [] 
  11.     }] 
  12.    } 
  13.   ]} 

在Vue 2中一直存在的問題則是無法監聽數組,若我沒記錯的話,Vue 2是通過Object.defineProperty()來監聽對象,也就是后臺語言中對應的屬性get和set方法

結合上述示例圖和代碼,當我們輸入村名稱時,然后回車,則將村名稱添加到村數組中去,然后通過el-tag標簽進行遍歷渲染

接下來問題來了,此時我們想要刪除村,所以點擊村標簽的刪除圖標,毫無疑問直接將區域下的村數組通過索引將其移除即可,但是,但是,根本無法移除,因為此時區域下的村是一個數組,Vue 2無法監聽得到,也就是我們在數組中給對應村移除時,但頁面上無法同步刪除,移除方法如下:

  1. handleClose (tindex, rindex, tagindex) { 
  2.    let self = this 
  3.    let region = self.form.towns[tindex].regions[rindex] 
  4.    region.tags.splice(tagindex, 1) 
  5. }, 

那么在Vue 2中如何解決這個問題呢?根據我們的示例來看,我們將輸入的村名稱即文本框綁定回車事件,然后將文本框綁定的模型數據添加到村數組中去,所以此時我們假裝先再次在文本框上綁定一個“占位符”,然后緊接著將其置空,給Vue 2一種“錯覺”剛才的數據沒綁定上,所以上述刪除標簽方法,變成如下即可解決:

  1. handleClose (tindex, rindex, tagindex) { 
  2.     let self = this 
  3.     let region = self.form.towns[tindex].regions[rindex] 
  4.     region.tags.splice(tagindex, 1) 
  5.     // 添加文本準備添加“一個占位符”,以便于頁面上能刪除標簽 
  6.     region.villageName = '占位符' 
  7.     region.villageName = '' 
  8. }, 

Vue 3 + ElementPlus

空閑之余,試了試Vue 3結合ElementPlus,這個問題得到了解決,在Vue 3中通過proxy(代理)方式監聽所有屬性,當然也就包括數組,然后在Vue 3中相關鍵盤事件等,比如回車,都已通過v-on:key.enter來綁定事件實現

 

責任編輯:武曉燕 來源: JeffckyShare
相關推薦

2020-05-21 09:17:51

Vue 3Vue代碼

2013-08-06 09:35:21

Office 365微軟

2017-07-20 11:18:22

Vue.jsMVVMMVC

2022-12-09 09:39:20

Vue3Vue2

2016-09-21 13:32:13

JavascriptWeb前端

2021-07-08 05:13:28

Windows 11操作系統微軟

2009-06-23 08:35:12

微軟Windows 7操作系統

2009-08-16 09:25:55

Windows 7系統升級

2009-06-05 08:55:16

2012-05-11 09:54:23

微軟Windows 8

2012-12-12 09:53:50

Windows 8

2009-09-17 08:39:52

Windows 7系統升級

2010-05-06 09:57:45

RHEL 5.5升級

2025-05-30 06:57:53

2017-10-24 13:02:29

2009-05-27 08:36:34

2012-02-28 15:07:19

CSS3

2021-06-26 06:29:14

Vue 2Vue 3開發

2020-10-20 18:42:17

Vue 3.0vue2.x數據

2009-12-28 16:39:56

Fedora 9
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 欧美一级大片免费看 | 欧美不卡一区二区三区 | 99精品福利视频 | 91资源在线 | 中文字幕免费观看 | 香蕉国产在线视频 | 久久精品一区二区三区四区 | 国产精品99久久久久久久久 | 国产精品免费一区二区 | 亚洲午夜小视频 | 日韩高清在线观看 | 久久不卡 | 精品久久久久久久久亚洲 | 国产高清视频在线播放 | 亚洲成在线观看 | 国产日韩欧美中文字幕 | 久久伊人免费视频 | 永久av | 精品日韩一区 | 久久久91 | 操操日 | 亚洲精品在线免费 | 国产欧美日韩精品在线观看 | 亚洲天堂日韩精品 | 麻豆久久| 久久久久成人精品 | 精品区 | 天天色影视综合 | 国产精品亚洲成在人线 | 日本成人一区二区 | 91在线免费视频 | 午夜免费在线电影 | 欧美一区二区三区在线观看视频 | 2020天天操| 成人高清在线 | 久久狼人天堂 | 日韩精品免费视频 | 91香蕉视频在线观看 | 91精品中文字幕一区二区三区 | 国产色在线 | 国产精品乱码一二三区的特点 |