中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

antd?vue中怎么在form表單的自定義組件里使用v-decorator

發布時間:2023-04-21 15:05:17 來源:億速云 閱讀:79 作者:iii 欄目:開發技術

這篇文章主要介紹了antd vue中怎么在form表單的自定義組件里使用v-decorator的相關知識,內容詳細易懂,操作簡單快捷,具有一定借鑒價值,相信大家閱讀完這篇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 antd vue的理解

    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”知識都有一定的了解,大家如果還想學習更多知識,歡迎關注億速云行業資訊頻道。

    向AI問一下細節

    免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

    AI

    九台市| 平江县| 湘潭县| 东乡族自治县| 醴陵市| 独山县| 佛山市| 双峰县| 饶阳县| 永德县| 商河县| 台湾省| 东源县| 精河县| 康保县| 汝城县| 日土县| 车险| 衢州市| 祁东县| 瓮安县| 平安县| 卓资县| 安远县| 金乡县| 资源县| 崇阳县| 伊川县| 南汇区| 无为县| 健康| 天祝| 漳州市| 翼城县| 西充县| 汝城县| 望都县| 普格县| 东至县| 揭西县| 鸡泽县|