欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

使用Vue Composition API寫出清晰、可擴(kuò)展的表單實現(xiàn)

 更新時間:2020年06月10日 08:30:02   作者:戎馬  
這篇文章主要介紹了使用Vue Composition API寫出清晰、可擴(kuò)展的表單實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

表單是前端開發(fā)中最棘手的部分之一,您可能會在其中發(fā)現(xiàn)很多混亂的代碼。

基于組件的框架,如 Vue.js,在提高前端代碼的可擴(kuò)展性方面做了很多工作,但是表單的問題仍然存在。

在本教程中,將向您展示新的 Vue Composition API(即將加入 Vue 3 中)如何使表單代碼更清晰、更具可擴(kuò)展性。

為什么表單代碼經(jīng)常很爛

像 Vue 這種基于組件的框架的關(guān)鍵設(shè)計模式是組件組合。

這種模式將應(yīng)用程序的特性抽象為獨立的、單一用途的組件,這些組件通信使用 props 和事件的方式。

然而,在此模式下,不能很好地對表單進(jìn)行抽象,因為表單的功能和狀態(tài)顯然不屬于任何一個組件,因此將其分離通常會導(dǎo)致與解決的問題一樣多的問題。

在 Vue 中表單代碼寫的爛的另一個重要原因是,直到 Vue2 之前, 還沒有提供強(qiáng)大的手段在組件之間重用代碼。重用代碼對表單來說很重要,因為表單輸入通常有明顯的不同,但在功能上有許多相似之處。

Vue2 提供的代碼重用的主要方法是 mixin,我認(rèn)為這是一個明顯的反模式。

Mixins 被認(rèn)為“有害”

早在2016年中期,丹·阿布拉莫夫(Dan Abramov)就寫了《mixin被認(rèn)為是有害的》(mixin Considered Harmful),他在書中辯稱,將 mixin 用于在 React 組件中重用邏輯是一種反模式,主張遠(yuǎn)離它們。

不幸的是,他提到的關(guān)于 React mixins 的缺點同樣適用于 Vue。在了解 Composition API 克服這些缺點之前,讓我們熟悉這些缺點。

命名沖突

使用 mixin 模式在運行時合并兩個對象,如果他們兩個都共享同名屬性,會發(fā)生什么?

const mixin = {
 data: () => ({
  myProp: null
 })
}
export default {
 mixins: [mixin],
 data: () => ({
  // 同名!
  myProp: null
 })
}

這就是合并策略發(fā)揮作用的地方。這是一組規(guī)則,用于確定當(dāng)一個組件包含多個具有相同名稱的選項時會發(fā)生什么。

Vue 組件的默認(rèn)(可選配置)合并策略指示本地選項將覆蓋 mixin 選項。不過也有例外,例如,如果我們有多個相同類型的生命周期鉤子,這些鉤子將被添加到一個鉤子數(shù)組中,并且所有的鉤子都將被依次調(diào)用。

盡管我們不應(yīng)該遇到任何實際的錯誤,但是在跨多個組件和 mixin 處理命名屬性時,編寫代碼變得越來越困難。一旦第三方 mixin 作為帶有自己命名屬性的 npm 包被添加進(jìn)來,就會特別困難,因為它們可能會導(dǎo)致沖突。

隱式依賴

mixin 和使用它的組件之間沒有層次關(guān)系。

這意味著組件可以使用 mixin 中定義的數(shù)據(jù)屬性(例如mySharedDataProperty),但是 mixin 也可以使用組件中定義的數(shù)據(jù)屬性(例如myLocalDataProperty)。這種情況通常是在 mixin 被用于共享輸入驗證時出現(xiàn)的,mixin 可能會期望一個組件有一個輸入值,它將在自己的 validate 方法中使用。

不過,這可能會引起一些問題。如果我們以后想重構(gòu)一個組件,改變了 mixin 需要的變量名稱,會發(fā)生什么情況呢?我們在看這個組件時,不會發(fā)現(xiàn)有什么問題。代碼檢查也不會發(fā)現(xiàn)它,只會在運行時看到錯誤。

現(xiàn)在想象一個有很多 mixin 的組件。我們可以重構(gòu)本地數(shù)據(jù)屬性嗎?或者它會破壞 mixin 嗎?我們得手動搜索才能知道。

mixins 的缺點是 Composition API 背后的主要推動因素之一,來看看它如何克服 mixin 的問題,寫出清晰、可擴(kuò)展的表單代碼。

在 Vue2 項目添加 Vue Composition API

通過 Vue CLI 創(chuàng)建一個項目,將 Composition API 作為插件添加到 Vue 2 項目中。

$ vue create composition-api-form
$ cd composition-api-form
$ npm i -S @vue/composition-api

接下來,在 main.js 中加入這個插件

import Vue from "vue";
import App from "./App.vue";

import VueCompositionApi from "@vue/composition-api";
Vue.use(VueCompositionApi);

new Vue({
 render: h => h(App)
}).$mount('#app');

創(chuàng)建輸入組件

為了使這個例子簡單,我們將創(chuàng)建一個僅包含輸入名字和電子郵件的獨立的組件。

$ touch src/components/InputName.vue
$ touch src/components/InputEmail.vue

設(shè)置 InputName 組件模板,包括一個 HTML 輸入元素,并使用 v-model 指令創(chuàng)建雙向綁定。

src/components/InputName.vue

<template>
 <div>
  <label>
   Name
   <input type="text" v-model="input" name="name" />
  </label>
 </div>
</template>
<script>
export default {
 name: 'InputName'
}
</script>

設(shè)置表單

將添加 novalidate 屬性,讓瀏覽器知道我們將提供自定義驗證。還將監(jiān)聽表單的 submit 事件,防止表單自動提交,并使用聲明的 onSubmit 方法處理該事件。

然后,添加 InputName 和 InputEmail 組件,并分別將本地狀態(tài)值 name 和 email 進(jìn)行綁定。

src/App.vue

<template>
 <div id="app">
  <form novalidate @submit.prevent="onSubmit">
   <InputName v-model="name" />
   <InputEmail v-model="email" />
   <button type="submit">Submit</button>
  </form>
 </div>
</template>
<script>
import InputName from "@/components/InputName";
import InputEmail from "@/components/InputEmail";
export default {
 name: 'App',
 components: {
  InputName,
  InputEmail
 }
}
</script>

接下來使用 Composition API 定義表單功能。在組件定義中添加 setup 方法,并使用 Composition API 提供的 ref 方法聲明兩個狀態(tài)變量 name 和 email。

然后聲明一個 onSubmit 函數(shù)來處理表單提交。

src/App.vue

// 其余省略
...
import { ref } from "@vue/composition-api";

export default {
 name: "App",
 setup () {
  const name = ref("");
  const email = ref("");
  function onSubmit() {
   // 這里可以寫提交后端的邏輯
   console.log(name.value, email.value);
  }
  return {
   name,
   email,
   onSubmit
  }
 },
 ...
}

設(shè)置輸入組件

接下來,將定義 InputName 組件的功能。

在組件上使用了 v-model 指令,就和組件創(chuàng)建了雙向綁定,在組件內(nèi)部的 props 上定義 value 來接收值,這只做了一半的工作。

創(chuàng)建一個 setup 函數(shù)。props 和組件實例被傳遞到這個方法中,使我們能夠訪問組件實例上的方法。

用解構(gòu)的方式在第二個參數(shù)中獲得 emit 方法。將需要它來完成 v-model 的雙向綁定的另一半工作,即觸發(fā) input 事件,修改綁定的值。

在此之前,聲明一個狀態(tài)變量 input,將綁定到我們在模板中聲明的 HTML 元素上。

該變量的值是待定義的合成函數(shù) useInputValidator 執(zhí)行后返回的值。此函數(shù)將處理所有常見的驗證邏輯。

把 prop.value 傳遞給這個方法作為第一個參數(shù),第二個參數(shù)是一個回調(diào)函數(shù),接收經(jīng)過驗證后的輸入值,在這個回調(diào)函數(shù)中觸發(fā) input 事件,修改 v-model 綁定的值,實現(xiàn)和父組件雙向綁定的功能。

src/components/InputName.vue

<template>
 <div>
  <label>
   Name
   <input type="text" v-model="input" name="name" />
  </label>
 </div>
</template>
<script>
import useInputValidator from "@/features/useInputValidator";

export default {
 name: "InputName",
 props: {
  value: String
 },
 setup (props, { emit }) {
  const { input } = useInputValidator(
   props.value, 
   value => emit("input", value)
  );
  // 綁定在元素上
  return {
   input
  }
 }
}
</script>

輸入框驗證功能

開始創(chuàng)建 useInputValidator 組合函數(shù),為此,首先創(chuàng)建一個 features 文件夾,然后為其創(chuàng)建一個模塊文件。

$ mkdir src/features
$ touch src/features/useInputValidator.js

在模塊文件中,將導(dǎo)出一個函數(shù),它需要兩個參數(shù): 從父表單接收到的值,用 startVal 接收;以及一個回調(diào)函數(shù),用 onValidate 接收。

函數(shù)需要返回一個 input 狀態(tài)變量,因此需要聲明它,通過調(diào)用 ref 并提供 startVal 的值進(jìn)行初始化。

在從函數(shù)返回 input 之前,觀察該值的變化,并調(diào)用 onValidate回調(diào),傳入最新的 input 的值。

src/features/useInputValidator.js

import { ref, watch } from "@vue/composition-api";

export default function (startVal, onValidate) {
 let input = ref(startVal);
 watch(input, value => { 
  onValidate(value);
 });
 return {
  input
 }
}

添加驗證器

下一步添加驗證器函數(shù)。對于 InputName 組件,只有一個驗證規(guī)則 minLength,確保輸入是三個字符或更多。尚未創(chuàng)建的 InputEmail 組件將需要電子郵件驗證規(guī)則。

將在 src 文件夾中創(chuàng)建模塊 validators.js,并寫這些驗證器。在實際的項目中,您可能會使用第三方庫。

不會詳細(xì)介紹 validator 函數(shù),但是有兩件重要的事情需要注意:

  • 這些是返回函數(shù)的函數(shù)。這樣的結(jié)構(gòu)允許我們通過傳遞成為閉包一部分的參數(shù)來定制驗證規(guī)則。
  • 每個驗證器返回的函數(shù)總是返回一個字符串(錯誤消息),如果沒有錯誤,則返回 null。

src/validators.js

const minLength = min => {
 return input => input.length < min 
 ? `Value must be at least ${min} characters` 
 : null;
};

const isEmail = () => {
 const re = /\S+@\S+\.\S+/;
 return input => re.test(input)
 ? null
 : "Must be a valid email address";
}

export { minLength, isEmail };

回到上面的組合函數(shù)所在文件 useInputValidator.js 中,我們希望使用需要的驗證,給函數(shù)添加另一個參數(shù),它是一組驗證函數(shù)。

在 input 監(jiān)視器內(nèi)部,使用數(shù)組的 map 方法調(diào)用驗證函數(shù),將 input 的當(dāng)前值傳遞給每個驗證器方法。

返回值將在一個新的狀態(tài)變量 errors 中捕獲,也將返回給所在組件使用。

src/features/useInputValidator.js

export default function (startVal, validators, onValidate) {
 const input = ref(startVal);
 const errors = ref([]);
 watch(input, value => {
  errors.value = validators.map(validator => validator(value));
  onValidate(value);
 });
 return {
  input,
  errors
 }
}

最后回到 InputName 組件,現(xiàn)在將為 useInputValidator 方法提供必需的三個參數(shù)。
第二個參數(shù)現(xiàn)在是一個驗證器數(shù)組,因此讓我們在適當(dāng)?shù)牡胤铰暶饕粋€數(shù)組,并傳入 minLength 方法。

minLength 是一個工廠函數(shù),調(diào)用并傳遞指定的最小長度。

現(xiàn)在我們還從合成函數(shù)返回的對象獲取 input 和 errors,它們都將從 setup 方法返回,以便在組件中可用。

src/components/InputName.vue

// 省略其他代碼
...
import { minLength } from "@/validators";
import useInputValidator from "@/features/useInputValidator";

export default {
 ...
 setup (props, { emit }) {
  const { input, errors } = useInputValidator(
   props.value, 
   [ minLength(3) ],
   value => emit("input", value)
  );
  return {
   input,
   errors
  }
 }
}

這是我們將添加到該組件的最后一個功能。在我們繼續(xù)之前,花點時間對比一下這段代碼比使用mixin可讀性強(qiáng)得多。

首先,可以清楚地看到狀態(tài)變量在哪里聲明和修改,而不必切換到單獨的 mixin 模塊文件。另外,不需要擔(dān)心局部變量和復(fù)合函數(shù)之間的名稱沖突。

顯示錯誤

進(jìn)入 InputName 組件的模板,有潛在的錯誤數(shù)組要顯示,將其委托給一個稱為 ErrorDisplay 的組件來顯示錯誤。

src/components/InputName.vue

<template>
 <div>
  <label>
   Name
   <input type="text" v-model="input" name="name" />
  </label>
  <ErrorDisplay :errors="errors" />
 </div>
</template>
<script>
...
import ErrorDisplay from "@/components/ErrorDisplay";

export default: {
 ...
 components: {
  ErrorDisplay
 }
}
</script>

ErrorDisplay 組件根據(jù)業(yè)務(wù)需要,可以自己定制。

重用代碼

這就是我們基于Composition API 寫的表單的基本功能。本教程的目標(biāo)是創(chuàng)建清晰且可擴(kuò)展的表單代碼,通過定義 InputEmail 組件,來證明我們已經(jīng)做到了這一點。

src/components/InputEmail

<template>
 <div>
  <label>
   Email
   <input type="email" v-model="input" name="email" />
  </label>
  <ErrorDisplay v-if="input" :errors="errors" />
 </div>
</template>
<script>
import useInputValidator from "@/features/useInputValidator";
import { isEmail } from "@/validators";
import ErrorDisplay from "./ErrorDisplay";

export default {
 name: "InputEmail",
 props: {
  value: String
 },
 setup (props, { emit }) {
  const { input, errors } = useInputValidator(
   props.value, 
   [ isEmail() ], 
   value => emit("input", value)
  );
  return {
   input,
   errors
  }
 },
 components: {
  ErrorDisplay
 }
}
</script>

原文:https://vuejsdevelopers.com/2020/03/31/vue-js-form-composition-api/
參考:https://css-tricks.com/how-the-vue-composition-api-replaces-vue-mixins/

到此這篇關(guān)于使用Vue Composition API寫出清晰、可擴(kuò)展的表單實現(xiàn)的文章就介紹到這了,更多相關(guān)Vue Composition API清晰、可擴(kuò)展的表單內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • vuex中的state、getters、mutations、actions之間的關(guān)系解讀

    vuex中的state、getters、mutations、actions之間的關(guān)系解讀

    這篇文章主要介紹了vuex中的state、getters、mutations、actions之間的關(guān)系,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-10-10
  • Vue實現(xiàn)登錄記住賬號密碼功能的思路與過程

    Vue實現(xiàn)登錄記住賬號密碼功能的思路與過程

    最近在學(xué)習(xí)vue,發(fā)現(xiàn)了vue的好多坑,下面這篇文章主要給大家介紹了關(guān)于Vue實現(xiàn)登錄記住賬號密碼功能的思路與過程,文中通過實例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2021-11-11
  • vue 封裝 Adminlte3組件的實現(xiàn)

    vue 封裝 Adminlte3組件的實現(xiàn)

    這篇文章主要介紹了vue 封裝 Adminlte3組件的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-03-03
  • 在vue中如何使用Mock.js模擬數(shù)據(jù)

    在vue中如何使用Mock.js模擬數(shù)據(jù)

    這篇文章主要介紹了在vue中如何使用Mock.js模擬數(shù)據(jù)問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-05-05
  • vue.js實現(xiàn)一個瀑布流的組件

    vue.js實現(xiàn)一個瀑布流的組件

    這篇文章主要為大家介紹了vue.js實現(xiàn)一個瀑布流的組件示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-06-06
  • vue自定義指令的創(chuàng)建和使用方法實例分析

    vue自定義指令的創(chuàng)建和使用方法實例分析

    這篇文章主要介紹了vue自定義指令的創(chuàng)建和使用方法,結(jié)合完整實例形式分析了vue.js創(chuàng)建及使用自定義指令的相關(guān)操作技巧與注意事項,需要的朋友可以參考下
    2018-12-12
  • vue+vant移動端顯示table表格加橫向滾動條效果

    vue+vant移動端顯示table表格加橫向滾動條效果

    vant移動端顯示table效果,增加復(fù)選框,可以進(jìn)行多選和全選,加橫向滾動條,可以看全部內(nèi)容,下面通過本文給大家分享vue+vant移動端顯示table表格加橫向滾動條效果,感興趣的朋友跟隨小編一起看看吧
    2024-06-06
  • Vue實現(xiàn)路由跳轉(zhuǎn)和嵌套

    Vue實現(xiàn)路由跳轉(zhuǎn)和嵌套

    本篇文章主要介紹了Vue實現(xiàn)路由跳轉(zhuǎn)和嵌套,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-06-06
  • 在Vue中使用icon 字體圖標(biāo)的方法

    在Vue中使用icon 字體圖標(biāo)的方法

    這篇文章主要介紹了在Vue中使用icon 字體圖標(biāo)的方法,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-06-06
  • Vue.js中的組件系統(tǒng)

    Vue.js中的組件系統(tǒng)

    這篇文章主要介紹了Vue.js之組件系統(tǒng),本文通過實例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-05-05

最新評論