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

UniApp表單校驗兩種方式對比詳解

 更新時間:2025年03月24日 11:30:39   作者:碼農研究僧  
本文對比了UniApp中表單校驗的命令式和聲明式兩種方式,通過實戰(zhàn)示例展示了它們的優(yōu)缺點,并有詳細的代碼示例供大家參考,需要的朋友可以參考下

以下主要針對Demo講解,從實戰(zhàn)中的體會

何為命令式 何為聲明式

  • 命令式的體驗,隨時都會有提交的按鈕,但是點擊提交才會顯示不滿足的條件!

  • 聲明式的體驗,不滿足條件時,按鈕框是灰色的!

  1. 命令式:
    提交邏輯復雜,需要異步校驗(如服務端唯一性檢查)
    表單字段多,依賴用戶行為觸發(fā)驗證
    需要復用校驗函數,或表單邏輯分散多處

  2. 聲明式:
    表單簡單明了
    用戶體驗優(yōu)先,提前告知無法提交的情況
    狀態(tài)可視化,一目了然

對比項命令式校驗(方法中校驗)聲明式校驗(computed + disabled 控制)
方式在 submit() 方法內通過 validateForm() 顯式校驗通過 computed 計算屬性實時判斷是否可提交
編程范式命令式(Imperative)聲明式(Declarative)
表達方式手動控制流程:如果失敗就 return false自動計算狀態(tài):按鈕根據是否滿足條件自動禁用
可復用性校驗邏輯聚焦在 validateForm(),但要手動調用校驗邏輯綁定在狀態(tài)中,按鈕等 UI 自動響應
用戶體驗用戶點擊“提交”后才提示不通過一目了然,提交按鈕禁用,無法誤觸提交
靈活性可以靈活插入額外邏輯,如提交前彈窗確認邏輯適合純狀態(tài)驅動,復雜流程需另外處理
適用場景需要流程控制、嵌套邏輯、異步校驗時更適合表單項簡單明確、狀態(tài)驅動時更適合

1. 實戰(zhàn)

實戰(zhàn)中抽取的Demo比較簡易:

命令式 submit 校驗方式(validateForm)

<template>
  <button type="primary" @click="submit">提交</button>
</template>

<script>
export default {
  data() {
    return {
      imgCntrF: [],
      damPhotoList: []
    };
  },
  methods: {
    validateForm() {
      if (!this.imgCntrF.length) {
        uni.showToast({ title: '請拍攝箱門照片', icon: 'none' });
        return false;
      }
      if (this.damPhotoList.length < 2) {
        uni.showToast({ title: '請至少拍攝 2 張照片', icon: 'none' });
        return false;
      }
      return true;
    },
    async submit() {
      if (!this.validateForm()) return;
      // 執(zhí)行提交邏輯
      console.log("提交成功");
    }
  }
}
</script>

聲明式 computed 控制按鈕狀態(tài)

<template>
  <button type="primary" :disabled="!canSubmit" @click="submit">提交</button>
</template>

<script>
export default {
  data() {
    return {
      photoList: {
        door: '',  // 對應 imgCntrF
        side: ''
      },
      damPhotoList: [],
      photoField: [
        { key: 'door', label: '箱門照片' },
        { key: 'side', label: '側面照片' }
      ]
    };
  },
  computed: {
    canSubmit() {
      return this.photoField.every(field => this.photoList[field.key]) &&
             this.damPhotoList.length >= 2;
    }
  },
  methods: {
    submit() {
      console.log("提交成功");
    }
  }
}
</script>

2. Demo

以UniApp( Vue2 語法 + script 寫法)

命令式校驗提交(Imperative)

<template>
  <view class="container">
    <view class="section">
      <text>箱門照片:</text>
      <button @click="selectBoxDoorPhoto">選擇照片</button>
      <image v-if="imgCntrF" :src="imgCntrF" class="img-preview" />
    </view>

    <view class="section">
      <text>破損照片:</text>
      <button @click="addDamPhoto">添加照片</button>
      <view class="photo-list">
        <image v-for="(photo, index) in damPhotoList" :key="index" :src="photo" class="img-preview" />
      </view>
    </view>

    <button type="primary" @click="submit">提交</button>
  </view>
</template>

<script>
export default {
  data() {
    return {
      imgCntrF: '', // 箱門照片 URL
      damPhotoList: [] // 破損照片 URL 列表
    };
  },
  methods: {
    selectBoxDoorPhoto() {
      uni.chooseImage({
        count: 1,
        success: (res) => {
          this.imgCntrF = res.tempFilePaths[0];
        }
      });
    },
    addDamPhoto() {
      uni.chooseImage({
        count: 1,
        success: (res) => {
          this.damPhotoList.push(res.tempFilePaths[0]);
        }
      });
    },
    validateForm() {
      if (!this.imgCntrF) {
        uni.showToast({ title: '請拍攝箱門照片', icon: 'none' });
        return false;
      }
      if (this.damPhotoList.length < 2) {
        uni.showToast({ title: '請至少拍攝 2 張破損照片', icon: 'none' });
        return false;
      }
      return true;
    },
    submit() {
      if (!this.validateForm()) return;

      // 模擬提交成功
      uni.showToast({ title: '提交成功', icon: 'success' });
    }
  }
};
</script>

<style>
.container {
  padding: 20rpx;
}
.section {
  margin-bottom: 30rpx;
}
.img-preview {
  width: 200rpx;
  height: 200rpx;
  margin-top: 10rpx;
}
.photo-list {
  display: flex;
  flex-wrap: wrap;
  gap: 10rpx;
}
</style>

聲明式按鈕控制提交(Declarative)

<template>
  <view class="container">
    <view class="section">
      <text>箱門照片:</text>
      <button @click="selectBoxDoorPhoto">選擇照片</button>
      <image v-if="photoList.door" :src="photoList.door" class="img-preview" />
    </view>

    <view class="section">
      <text>破損照片:</text>
      <button @click="addDamPhoto">添加照片</button>
      <view class="photo-list">
        <image v-for="(photo, index) in damPhotoList" :key="index" :src="photo" class="img-preview" />
      </view>
    </view>

    <button type="primary" :disabled="!canSubmit" @click="submit">提交</button>
  </view>
</template>

<script>
export default {
  data() {
    return {
      photoList: {
        door: '' // 箱門照片
      },
      damPhotoList: []
    };
  },
  computed: {
    canSubmit() {
      return !!this.photoList.door && this.damPhotoList.length >= 2;
    }
  },
  methods: {
    selectBoxDoorPhoto() {
      uni.chooseImage({
        count: 1,
        success: (res) => {
          this.photoList.door = res.tempFilePaths[0];
        }
      });
    },
    addDamPhoto() {
      uni.chooseImage({
        count: 1,
        success: (res) => {
          this.damPhotoList.push(res.tempFilePaths[0]);
        }
      });
    },
    submit() {
      uni.showToast({ title: '提交成功', icon: 'success' });
    }
  }
};
</script>

<style>
.container {
  padding: 20rpx;
}
.section {
  margin-bottom: 30rpx;
}
.img-preview {
  width: 200rpx;
  height: 200rpx;
  margin-top: 10rpx;
}
.photo-list {
  display: flex;
  flex-wrap: wrap;
  gap: 10rpx;
}
</style>

到此這篇關于UniApp表單校驗兩種方式對比詳解的文章就介紹到這了,更多相關UniApp表單校驗方式內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • JavaScript中比較兩個數組是否有相同元素(交集)的三種常用方法

    JavaScript中比較兩個數組是否有相同元素(交集)的三種常用方法

    這篇文章主要介紹了JavaScript中比較兩個數組是否有相同元素(交集)的三種常用方法,每種方法結合實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2025-08-08
  • Bootstrap學習筆記之js組件(4)

    Bootstrap學習筆記之js組件(4)

    這篇文章主要為大家詳細介紹了Bootstrap學習筆記之js組件,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-06-06
  • 判斷橫屏豎屏(三種)

    判斷橫屏豎屏(三種)

    本文主要介紹了通過HTML,CSS,JS三種判斷橫屏豎屏的方法。具有很好的參考價值,下面跟著小編一起來看下吧
    2017-02-02
  • JavaScript中的Transferable對象教程

    JavaScript中的Transferable對象教程

    Transferable對象是一種特殊類型的JavaScript對象,可以在不同的JavaScript上下文之間高效地傳輸,而不需要創(chuàng)建數據的副本,下面就來詳細的介紹一下
    2026-06-06
  • Uniapp實現下拉刷新的三種方式

    Uniapp實現下拉刷新的三種方式

    在小程序、h5等地方中,常常會用到下拉刷新這個功能,今天來講解實現這個功能的三種方式:全局下拉刷新,組件局部下拉刷新,嵌套組件下拉刷新,,文中通過代碼示例講解的非常詳細,需要的朋友可以參考下
    2025-02-02
  • Bootstrap fileinput文件上傳預覽插件使用詳解

    Bootstrap fileinput文件上傳預覽插件使用詳解

    這篇文章主要為大家詳細介紹了Bootstrap fileinput文件上傳預覽插件的使用方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-05-05
  • 微信js-sdk地理位置接口用法示例

    微信js-sdk地理位置接口用法示例

    這篇文章主要介紹了微信js-sdk地理位置接口用法,結合實例形式分析了js-sdk地理位置接口的定義與簡單使用方法,需要的朋友可以參考下
    2016-10-10
  • 使用JavaScript和C#中獲得referer

    使用JavaScript和C#中獲得referer

    經常使用其他腳本語言(ASP ASP.NET PHP等)獲取頁面的瀏覽來源,今天我們來研究下使用Javascript以及C#獲取頁面的referer。
    2014-11-11
  • JavaScript實現電燈開關小案例

    JavaScript實現電燈開關小案例

    這篇文章主要為大家詳細介紹了JavaScript實現電燈開關小案例,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-03-03
  • 你必須知道的Javascript知識點之"單線程事件驅動"的使用

    你必須知道的Javascript知識點之"單線程事件驅動"的使用

    本篇文章小編為大家介紹,你必須知道的Javascript知識點之"單線程事件驅動"的使用。需要的朋友參考下
    2013-04-04

最新評論

巍山| 彭州市| 碌曲县| 治县。| 阿瓦提县| 玉田县| 卢湾区| 合江县| 达孜县| 潞西市| 澎湖县| 乡宁县| 乌拉特前旗| 福泉市| 高州市| 平江县| 渝中区| 仁寿县| 南乐县| 韶关市| 宜宾县| 江门市| 龙山县| 枝江市| 绵竹市| 晴隆县| 浪卡子县| 永年县| 太白县| 刚察县| 石棉县| 嘉禾县| 荣成市| 宜春市| 抚州市| 静乐县| 黔西| 新乐市| 苗栗县| 延长县| 上饶县|