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

vue3簡單封裝input組件和統(tǒng)一表單數(shù)據(jù)詳解

 更新時間:2022年05月25日 15:02:22   作者:顏醬  
最近有一個需求是很多個表單添加,編輯等操作,會用到很多input輸入框,所以就想把input進行簡單封裝,這篇文章主要給大家介紹了關于vue3簡單封裝input組件和統(tǒng)一表單數(shù)據(jù)的相關資料,需要的朋友可以參考下

前言

vue3 支持用 jsx 實現(xiàn)組件,擺脫了 vue 文件式的組件,不再需要額外的指令,寫法非常接近 React,減少記憶負擔。

本文簡單的練習,用 vue3 組件封裝 input 組件和統(tǒng)一表單數(shù)據(jù)。

準備工作

vue create example創(chuàng)建項目,參數(shù)大概如下:

用原生 input

原生的 input,主要是 value 和 change,數(shù)據(jù)在 change 的時候需要同步。

App.tsx如下:

import { ref } from 'vue';

export default {
  setup() {
    // username就是數(shù)據(jù)
    const username = ref('張三');
    // 輸入框變化的時候,同步數(shù)據(jù)
    const onInput = ;
    return () => (
      <div>
        <input type="text"
            value={username.value}
            onInput={(e: any) => { username.value = e.target.value; }} />
        <div>input的值:{username.value}</div>
      </div>
    );
  },
};

封裝 Input

封裝 input 的好處,直接傳值,減少邏輯,不再需要額外的e.target,為后面的繼續(xù)封裝做準備。

// Input.tsx
import { defineComponent, ref } from 'vue';

// defineComponent定義組件,有props
const Input = defineComponent({
  props: {
    value: {
      required: true,
      type: String,
    },
    onChange: {
      required: true,
      type: Function,
    },
  },
  // 渲染用到props,需要在這里傳參
  setup(props) {
    // 值變化 的時候  調用傳過來的onChange從而同步父組件的 數(shù)據(jù)
    const onInput = (e: any) => {
      props.onChange && props.onChange(e.target.value);
    };
    return () => <input type="text" value={props.value} onInput={onInput} />;
  },
});

使用Input組件

import { ref } from 'vue';
import Input from './components/Input';
export default {
  setup() {
    // 數(shù)據(jù)
    const username: any = ref('張三');
    return () => (
      <div>
        {/* 使用組件,傳value和onChange */}
        <Input
          value={username.value}
          onChange={(value: string) => (username.value = value)} // 直接在這同步數(shù)據(jù)
        />
        <div>input的值:{username.value}</div>
      </div>
    );
  },
};

封裝表單數(shù)據(jù)

表單數(shù)據(jù),經常需要賦值、獲取值,這邊可以用類統(tǒng)一處理,在后面的組件賦值屬性的時候極其方便。

useForm的精華,在于proxy,訪問屬性的時候,返回field數(shù)據(jù),這在表單組件里可以簡潔使用。

/* eslint-disable @typescript-eslint/explicit-module-boundary-types */
/* eslint-disable @typescript-eslint/no-explicit-any */
import { ref, Ref } from "vue";
export class FormData<T> {
  private data: Ref<any>;
  constructor(data: T) {
    this.data = ref(data || null);
  }

  // 設置某個字段的值
  setValue(name: string, val: any): void {
    const next = { ...this.data.value, [name]: val };
    this.data.value = next;
  }

  // 獲取某個字段的值
  getValue(name: string): any {
    return this.data.value[name];
  }

  // 獲取整個值
  getValues() {
    return this.data.value;
  }

  // 設置整個值
  setValues(values: T) {
    this.data.value = values;
  }

  // 獲取field,字段和字段的修改事件
  getField(name: string) {
    return {
      value: this.data.value[name],
      onChange: (v: any) => {
        this.setValue(name, v);
      },
    };
  }
}

type FormDataProxy<T> = {
  [P in keyof T]: T[P];
};

export function useForm<T extends Record<string, any>>(data: T) {
  const form = new FormData(data);
  const ver = ref(0);

  const proxy = new Proxy(form, {
    // 寫proxy的目的是:form.username的時候,直接返回 form.getField(username)
    get(target, name) {
      switch (name) {
        case "getValues":
          return form.getValues.bind(form);
        case "setValues":
          return form.setValues.bind(form);
        default:
          return form.getField(name as string);
      }
    },
    // 寫form.username = xx  直接返回 form.setValue('username',xx)
    set(target, name, value) {
      switch (name) {
        case "getValues":
        case "setValues":
          break;
        default:
          form.setValue(name as string, value);
      }
      return true;
    },
  }) as any as FormDataProxy<T> & {
    setValues: (val: T) => void;
    getValues: () => Ref<T>;
  };
  return { form: proxy, ver };
}

使用表單數(shù)據(jù)

Input組件配合表單,使用效果奇佳。

import Input from './components/Input';
import { useForm } from './hooks/useForm';

// 使用組件
export default {
  setup() {
    // 數(shù)據(jù)
    const { form, ver } = useForm({ username: '張三', age: 33 });
    console.log(123, form, ver);
    return () => (
      <div>
        {/* 這里的form.username,實際是proxy返回的{value:xxx,onChange:fn} */}
        {/*  多表單組件的時候 這樣就非常方便了 */}
        <Input {...form.username} />
        <Input {...form.age} />

        <button
          onClick={() => {
            console.log(form.getValues());
          }}
        >
          提交
        </button>
      </div>
    );
  },
};

總結

到此這篇關于vue3簡單封裝input組件和統(tǒng)一表單數(shù)據(jù)的文章就介紹到這了,更多相關vue3封裝input組件內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • elementui中樹形表格切換展開不同層級的示例代碼

    elementui中樹形表格切換展開不同層級的示例代碼

    這篇文章主要介紹了elementui中樹形表格切換展開不同層級,本文通過示例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-08-08
  • 詳解Nuxt內導航欄的兩種實現(xiàn)方式

    詳解Nuxt內導航欄的兩種實現(xiàn)方式

    這篇文章主要介紹了詳解Nuxt內導航欄的兩種實現(xiàn)方式,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-04-04
  • vue+elementUi實現(xiàn)點擊地圖自動填充經緯度以及地點

    vue+elementUi實現(xiàn)點擊地圖自動填充經緯度以及地點

    這篇文章主要為大家詳細介紹了vue+elementUi實現(xiàn)點擊地圖自動填充經緯度以及地點,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-07-07
  • Vue中key的作用示例代碼詳解

    Vue中key的作用示例代碼詳解

    key的特殊attribute主要用在Vue的虛擬DOM算法,在新舊Nodes對比時辨識VNodes。這篇文章主要給大家介紹Vue中key的作用,感興趣的朋友跟隨小編一起看看吧
    2020-06-06
  • Vue自定義指令學習及應用詳解

    Vue自定義指令學習及應用詳解

    這篇文章主要為大家詳細介紹了Vue中自定義指令的學習以及如何利用Vue制作一個簡單的學生信息管理系統(tǒng),感興趣的小伙伴可以跟隨小編一起學習一下
    2023-05-05
  • 通過vue-router懶加載解決首次加載時資源過多導致的速度緩慢問題

    通過vue-router懶加載解決首次加載時資源過多導致的速度緩慢問題

    這篇文章主要介紹了vue-router懶加載解決首次加載時資源過多導致的速度緩慢問題,文中單獨給大家介紹了vue router路由懶加載問題,需要的朋友可以參考下
    2018-04-04
  • Vue中keyup.enter和blur事件沖突的問題及解決

    Vue中keyup.enter和blur事件沖突的問題及解決

    這篇文章主要介紹了Vue中keyup.enter和blur事件沖突的問題及解決,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-10-10
  • Vue封裝全局toast組件的完整實例

    Vue封裝全局toast組件的完整實例

    組件(Component)是 Vue.js 最強大的功能之一,組件可以擴展 HTML 元素,封裝可重用的代碼,這篇文章主要給大家介紹了關于Vue封裝全局toast組件,需要的朋友可以參考下
    2021-07-07
  • vue3.0項目快速搭建的完整步驟記錄

    vue3.0項目快速搭建的完整步驟記錄

    這篇文章主要給大家介紹了關于vue3.0項目快速搭建的相關資料,本文通過圖文以及實例代碼介紹的非常詳細,對大家學習或者使用vue3.0具有一定的參考學習價值,需要的朋友可以參考下
    2021-12-12
  • unix時間戳轉換的方法詳解

    unix時間戳轉換的方法詳解

    將 unix 時間戳轉換為日期時間和使用日期時間轉換為 unix 時間戳,在項目中常常用到,其中vue中的moment庫很是方便,下面小編就來為大家講講具體使用吧
    2023-09-09

最新評論

桃园县| 合肥市| 滦平县| 江源县| 台江县| 改则县| 旅游| 邵阳市| 兴海县| 霍林郭勒市| 仙游县| 宁海县| 通州区| 新竹市| 乌兰县| 阿克苏市| 闽清县| 霍州市| 嘉义市| 祁阳县| 永春县| 墨竹工卡县| 托克托县| 西乡县| 锡林郭勒盟| 左贡县| 乐业县| 平阳县| 措美县| 灵石县| 涿州市| 托克逊县| 普兰店市| 江达县| 凤翔县| 宕昌县| 无为县| 炉霍县| 昭苏县| 奉化市| 永济市|