您好,登錄后才能下訂單哦!
這篇文章主要介紹了antd vue中怎么在form表單的自定義組件里使用v-decorator的相關知識,內容詳細易懂,操作簡單快捷,具有一定借鑒價值,相信大家閱讀完這篇antd vue中怎么在form表單的自定義組件里使用v-decorator文章都會有所收獲,下面我們一起來看看吧。
項目需要,在表單中上傳圖片,所以要自己定以一個上傳圖片的組件,直接在form中使用,但是普通的自定義組件無法使用表單的v-decorator。
轉自官方的一段話
this.form.getFieldDecorator(id, options) 和 v-decorator="[id, options]"
經過 getFieldDecorator或v-decorator 包裝的控件,表單控件會自動添加 value(或 valuePropName 指定的其他屬性) onChange(或 trigger 指定的其他屬性),數據同步將被 Form 接管,這會導致以下結果:
你不再需要也不應該用 onChange 來做同步,但還是可以繼續監聽 onChange 等事件。
你不能用控件的 value defaultValue 等屬性來設置表單域的值,默認值可以用 getFieldDecorator 或 v-decorator 里的 initialValue。
你不應該用 v-model,可以使用 this.form.setFieldsValue 來動態改變表單值。
大概描述一下就是,一旦在form下使用了v-decorator之后,就不需要使用v-model,其實實現上也有所相同,在自定義組件中需要自己定以model的東西,詳細可以查閱官網。
通俗來說,想使用v-decorator,就必須要有個value想子組件傳遞數據。
和一個change方法將子組件的數據變動告訴父組件,下面看部分代碼
model: { prop: 'value', event: 'change' }, props: { value: { type: String // 這個參數是v-decorator給子組件傳值用的 // 這里不要給默認值, 在form下使用會爆警告 Warning: SquareUpload `default value` can not collect, please use `option.initialValue` to set default value. } } watch: { // 監聽數據變化,及時提交給父組件 fileList: { deep: true, immediate: true, handler: function (newV, oldV) { // 向父組件更新 this.$emit('change', temp) } } }
注意:value不要給默認值,不然會爆警告default value can not collect, please use option.initialValue to set default value.
例子,封裝一個上傳圖片的組件,在form中使用
子組件
<template> <div class="clearfix"> <a-upload :showRemoveIcon="false" :action="url" list-type="picture-card" :file-list="fileList" @preview="handlePreview" @change="handleChange" > <div v-if="fileList.length < max && isShow"> <a-icon type="plus" /> <div class="ant-upload-text"> Upload </div> </div> </a-upload> <a-modal :visible="previewVisible" :footer="null" @cancel="handleCancel"> <img alt="example" :src="previewImage" /> </a-modal> </div> </template> <script> import config from '@/views/constant/constantConfig' function getBase64 (file) { return new Promise((resolve, reject) => { const reader = new FileReader() reader.readAsDataURL(file) reader.onload = () => resolve(reader.result) reader.onerror = error => reject(error) }) } export default { name: 'SquareUpload', model: { prop: 'value', event: 'change' }, props: { value: { type: String // 這個參數是v-decorator給子組件傳值用的 // 這里不要給默認值, 在form下使用會爆警告 Warning: SquareUpload `default value` can not collect, please use `option.initialValue` to set default value. }, // 上傳地址 url: { type: String, default: config.uploadUrl }, isShow: { type: Boolean, default: true }, // 最多上傳數量 max: { type: Number, default: 8 } }, data () { return { previewVisible: false, previewImage: '', fileList: [] } }, methods: { handleCancel () { this.previewVisible = false }, // 處理預覽 async handlePreview (file) { if (!file.url && !file.preview) { file.preview = await getBase64(file.originFileObj) } this.previewImage = file.url || file.preview this.previewVisible = true }, handleChange ({ file, fileList }) { this.fileList = fileList } }, watch: { // 監聽數據變化,及時提交給父組件 fileList: { deep: true, immediate: true, handler: function (newV, oldV) { if (this.fileList.length === 0) { return } this.fileList = newV const temp = this.fileList.filter(item => item.status !== 'uploading').map(item => (item.uid < 0 && item.name) || item.response.data.newFileName).join(',') // 向父組件更新 this.$emit('change', temp) } }, // 監聽父組件傳遞過來的圖片列表信息 value: { deep: true, immediate: true, handler: function (newV) { // 數據為空的三種情況 if (newV === null || newV === '' || newV === undefined) { this.fileList = [] return } let count = -1 let temp = [] const tempList = [] temp = newV.split(',') temp.forEach(item => { tempList.push({ uid: count, name: item, status: 'done', url: config.baseImgUrl + item }) count-- }) this.fileList = tempList } } } } </script> <style> /* you can make up upload button and sample style by using stylesheets */ .ant-upload-select-picture-card i { font-size: 32px; color: #999; } .ant-upload-select-picture-card .ant-upload-text { margin-top: 8px; color: #666; } </style>
父組件使用
<a-form-item label="上傳標題圖片" :labelCol="labelCol" :wrapperCol="wrapperCol"> <SquareUpload :isShow="!showable" v-decorator="['serveTitleImg', {rules: [{required: true, message: '請選擇圖片'}]}]"></SquareUpload> </a-form-item>
v-decorator是ant Design的控件驗證屬性
經過 getFieldDecorator 或 v-decroator 包裝的控件,表單控件會自動添加 value onChange 或者 trigger ,數據同步由Form接管,這會導致以下結果
你不在需要也不應該用 onChange 同步,但是可以繼續監聽 onChange事件
你不能用控件的 value defaultValue等屬性來設置表單域的值,默認值可以用 getFieldDecorator 或 v-decorator里的 initialValue
你不應該用 v-model 可以使用 this.form.setFieldsValue 來動態改變表單值
定義form:
<template> <div class="main"> <a-form id="formLogin" class="user-layout-login" ref="formLogin" :form="form" @submit="handleSubmit" > <a-form-item> <a-input size="large" type="text" placeholder="賬戶: " v-decorator="[ 'username', {initialValue:'',rules: [{ required: true, message: '請輸入帳戶名或郵箱地址' }, { validator: handleUsernameOrEmail }], validateTrigger: 'change'} ]" > <a-icon slot="prefix" type="user" : /> </a-input> </a-form-item> </a-form> </div> </template> <script> ... export default { ... data () { return { ... form: this.$form.createForm(this), } }, created () { }, ... } </script>
v-decroator取值
this.form.vaidateFields((err, values) => { console.log(values) // {username: ''} })
v-decroator賦值
this.form.setFieldsValue({ username: '設置值' })
清空表單數據
this.form.resetFields()
關于“antd vue中怎么在form表單的自定義組件里使用v-decorator”這篇文章的內容就介紹到這里,感謝各位的閱讀!相信大家對“antd vue中怎么在form表單的自定義組件里使用v-decorator”知識都有一定的了解,大家如果還想學習更多知識,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。