最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Vue.js實現(xiàn)可配置的登錄表單代碼詳解

 更新時間:2018年03月29日 08:34:37   作者:廖柯宇  
這篇文章主要介紹了Vue.js實現(xiàn)可配置的登錄表單實例代碼詳解,文中給大家補充介紹了vue.js 全選與取消全選的實例代碼,需要的朋友可以參考下

表單是后臺項目業(yè)務(wù)中的常用組件,這次重構(gòu)了登錄功能以滿足登錄方式可配置的需求,在此記錄和分享一下。

業(yè)務(wù)場景

在之前,項目只支持手機號+密碼登錄,前端是直接把表單寫死的,后來有客戶希望能支持驗證碼登錄,有的客戶還希望能有手機號+驗證碼+密碼的登錄方式…所以登錄方式的靈活性需要可配置的表單支持,于是我把登錄組件做了拆分。

 

以表單元素為粒度,分離出了手機號、密碼、短信驗證碼這幾個組件,它們內(nèi)部都有自己的表單驗證方法,通過組合可以快速完成登錄、注冊、找回密碼等表單組件。高內(nèi)聚低耦合、高內(nèi)聚低耦合…跟著念十遍~

.
├ common
├ captcha.vue
|  ├ password.vue
|  └ phone.vue
├ login
|  └ index.vue
├ register
|  └ index.vue
└ resetPassword
  └ index.vue

這里我們將login作為父組件,讀取服務(wù)端返回的登錄配置并在模板做條件渲染,登錄時調(diào)用子組件內(nèi)部的表單驗證,最后通過Vuex拿到數(shù)據(jù)調(diào)用接口。整個可配置登錄表單的邏輯就是醬子,接下來上代碼。

代碼

請求服務(wù)端配置數(shù)據(jù):

/* 參數(shù)說明:
 * 'password': 密碼登錄 
 * 'captcha': 短信驗證碼登錄
 * 'password_or_captcha': 密碼或短信登錄 
 * 'password_with_captcha': 密碼+短信登錄
 */
config: {
 login_methods: 'password'
}

登錄組件的核心渲染代碼(pug):

.login-card
 .login-header
   h3 登錄

 .login-content
  phone(ref="phone")
  password(
   v-if="isPasswordMode"
   ref="password"
  )
  captcha(
   v-if="isCaptchaMode"
   ref="captcha"
  )  
  template(v-if="isPasswordWithCaptchaMode")
   captcha(ref="captcha")
   password(ref="password")
  
  template(v-if="isPasswordOrCaptchaMode")
   ...
  el-button(@click="login") 登錄

登錄時需要三個步驟:表單驗證、組裝數(shù)據(jù)、調(diào)用接口:

async login () {
 if (!this.validate()) return
 const loginData = this.getLoginData()
 await this.postLogin(loginData)
 ...
}

登錄的表單驗證其實是對當前登錄方式中所有組件的 validate() 方法進行邏輯判斷:

validate () {
 const phone = this.$refs.phone.validate()
 let isPass = false
  
 if (this.isPasswordMode) {
  if (this.$refs.password) isPass = this.$refs.password.validate()
 }
  
 if (this.isCaptchaMode) {
  if (this.$refs.captcha) isPass = this.$refs.captcha.validate()
 }
  
 if (this.isPasswordWithCaptchaMode) ...
  
 if (this.isPasswordOrCaptchaMode) ...
  
 isPass = phone && isPass
 return isPass
}

每個子組件都是一個完整的表單,驗證也由自己完成,password組件模板:

.login-password
 el-form(
  :model="form"
  :rules="rules"
  ref="form"
  @submit.native.prevent=""
 )
  el-form-item(prop="password")
   el-input(
    v-model="form.password"
    type="password"
    name="password"
   )

W3C: When there is only one single-line text input field in a form, the user agent should accept Enter in that field as a request to submit the form.

需要注意,根據(jù) W3C標準 , 當一個form元素中只有一個輸入框時,在該輸入框中按下回車會自動提交表單。通過在 <el-form> 添加 @submit.native.prevent 可以阻止這一默認行為。

password組件的表單驗證:

validate () {
 let res = false
 this.$refs.form.validate((valid) => {
  res = valid
 })
 return res
}

最后從Vuex里拿到所有表單數(shù)據(jù),進行組裝:

computed: {
 ...mapState('login', {
  phone: state => state.phone,
  password: state => state.password,
  captcha: state => state.captcha
 }), 
},
methods: {
 ... 
 getLoginData () {
  let mode = ''
  const phone = this.phone
  ...
  const data = { phone }
  
  if (this.isPasswordMode) {
   mode = 'password'
   data.password = password
  }
  if (this.isCaptchaMode) {
   mode = 'captcha'
   data.captcha = captcha
  } 
  if (this.isPasswordWithCaptchaMode) ...  
  if (this.isPasswordOrCaptchaMode) ...  
  data.mode = mode
  return data
 }
}

補充:

vue.js 全選與取消全選的實例代碼

new Vue({
  el: '#app',
  data: {
    checked: false,
    checkedNames: [],
    checkedArr: ["Runoob", "Taobao", "Google"]
  },
  methods: {
    changeAllChecked: function() {
      if (this.checked) {
        this.checkedNames = this.checkedArr
      } else {
        this.checkedNames = []
      }
    }
  },
  watch: {
    "checkedNames": function() {
      if (this.checkedNames.length == this.checkedArr.length) {
        this.checked = true
      } else {
        this.checked = false
      }
    }
  }
})

相關(guān)文章

  • vue項目打包之開發(fā)環(huán)境和部署環(huán)境的實現(xiàn)

    vue項目打包之開發(fā)環(huán)境和部署環(huán)境的實現(xiàn)

    這篇文章主要介紹了vue項目打包之開發(fā)環(huán)境和部署環(huán)境的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-04-04
  • vue-cli項目中使用Mockjs詳解

    vue-cli項目中使用Mockjs詳解

    這篇文章主要介紹了vue-cli項目中使用Mockjs詳解,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-05-05
  • Vue中關(guān)于this指向的問題示例詳解

    Vue中關(guān)于this指向的問題示例詳解

    在Vue中,方法體里用this調(diào)用vue實例的數(shù)據(jù),有時會指向window,導致調(diào)用失敗報錯,這篇文章主要介紹了Vue中關(guān)于this指向的問題 ,需要的朋友可以參考下
    2022-07-07
  • Vue參數(shù)的增刪改實例詳解

    Vue參數(shù)的增刪改實例詳解

    這篇文章主要為大家詳細介紹了Vue參數(shù)的增刪改實例,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-03-03
  • vue $nextTick實現(xiàn)原理深入詳解

    vue $nextTick實現(xiàn)原理深入詳解

    這篇文章主要介紹了vue $nextTick實現(xiàn)原理深入詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-10-10
  • Vue實現(xiàn)base64編碼圖片間的切換功能

    Vue實現(xiàn)base64編碼圖片間的切換功能

    這篇文章主要介紹了Vue實現(xiàn)base64編碼圖片間的切換功能,本文給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-12-12
  • Vue中使用mixins混入方式

    Vue中使用mixins混入方式

    這篇文章主要介紹了Vue中使用mixins混入方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-08-08
  • 淺談vue實現(xiàn)數(shù)據(jù)監(jiān)聽的函數(shù) Object.defineProperty

    淺談vue實現(xiàn)數(shù)據(jù)監(jiān)聽的函數(shù) Object.defineProperty

    本篇文章主要介紹了淺談vue實現(xiàn)數(shù)據(jù)監(jiān)聽的函數(shù) Object.defineProperty,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-06-06
  • vue中監(jiān)聽input框獲取焦點及失去焦點的問題

    vue中監(jiān)聽input框獲取焦點及失去焦點的問題

    這篇文章主要介紹了vue中監(jiān)聽input框獲取焦點,失去焦點的問題,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-07-07
  • vue.js實現(xiàn)含搜索的多種復(fù)選框(附源碼)

    vue.js實現(xiàn)含搜索的多種復(fù)選框(附源碼)

    這篇文章主要給大家介紹了利用vue.js實現(xiàn)含搜索的多種復(fù)選框的相關(guān)資料,文中給出了簡單的介紹,但提供了完整的實例源碼供大家下載學習,相信對大家具有一定的參考價值,需要的朋友們下面來一起看看吧。
    2017-03-03

最新評論

霍城县| 泾源县| 盐源县| 长海县| 湖州市| 阿拉善右旗| 章丘市| 荃湾区| 柳江县| 常山县| 会宁县| 西乡县| 岗巴县| 广东省| 沙田区| 平度市| 利川市| 蒙山县| 宁南县| 台南市| 莱阳市| 丘北县| 慈溪市| 广州市| 泰安市| 红安县| 丹江口市| 九龙县| 郴州市| 兴文县| 新干县| 芦山县| 太仓市| 哈巴河县| 南投市| 宜昌市| 休宁县| 崇信县| 广河县| 贵港市| 宁夏|