<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
vue3 支援用 jsx 實現元件,擺脫了 vue 檔案式的元件,不再需要額外的指令,寫法非常接近 React,減少記憶負擔。
本文簡單的練習,用 vue3 元件封裝 input 元件和統一表單資料。
用vue create example
建立專案,引數大概如下:
原生的 input,主要是 value 和 change,資料在 change 的時候需要同步。
App.tsx如下:
import { ref } from 'vue'; export default { setup() { // username就是資料 const username = ref('張三'); // 輸入框變化的時候,同步資料 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 的好處,直接傳值,減少邏輯,不再需要額外的e.target
,為後面的繼續封裝做準備。
// 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從而同步父元件的 資料 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() { // 資料 const username: any = ref('張三'); return () => ( <div> {/* 使用元件,傳value和onChange */} <Input value={username.value} onChange={(value: string) => (username.value = value)} // 直接在這同步資料 /> <div>input的值:{username.value}</div> </div> ); }, };
表單資料,經常需要賦值、獲取值,這邊可以用類統一處理,在後面的元件賦值屬性的時候極其方便。
useForm的精華,在於proxy,存取屬性的時候,返回field資料,這在表單元件裡可以簡潔使用。
/* 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 }; }
Input元件配合表單,使用效果奇佳。
import Input from './components/Input'; import { useForm } from './hooks/useForm'; // 使用元件 export default { setup() { // 資料 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元件和統一表單資料的文章就介紹到這了,更多相關vue3封裝input元件內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45