vue handsontable 插件 如何驗證該行內的某項內容是否填寫 !


<template>
    <div>
    <hot-table
            ref="searchForm"
            :data="hotSettings.dataList"
            :context-menu="hotSettings.contextMenu"
            :col-headers="hotSettings.colHeaders"
            :start-rows="hotSettings.startRows"
            :start-cols="hotSettings.startCols"
            :row-headers="hotSettings.rowHeaders"
            :row-heights="hotSettings.rowHeights"
            :manual-row-resize="hotSettings.manualRowResize"
            :manual-column-resize="hotSettings.manualColumnResize"
            :manual-row-move="hotSettings.manualRowMove"
            :columns="hotSettings.columns"
            :before-remove-row="hotSettings.beforeRemoveRow"
            :after-create-row="hotSettings.afterCreateRow"
            :after-change="afterChangeMe"
            class="table_hot"
            license-key="non-commercial-and-evaluation"
            />


        <button @click="saveSubmit">xxx</button>
    </div>
</template>

<script>
import { HotTable } from '@handsontable-pro/vue'
import Handsontable from 'handsontable'

const validatorList = (rule, value, callback) => {
    for (let i = 0; i < value.length; i++) {
        if (!value[i].region || !value[i].destination) {
            callback(new Error('請輸入價格表中所有信息, 多余的可通過鼠標右擊進行刪除行'))
            return
        }
    }
    callback()
}

const riseWeightVal = function (value, callback) {
    if (/^\d+(?=\.{0,1}\d+$|$)/.test(value) || value === '') {
        callback(true)
    } else {
        alert('請輸入數字')
        callback(false)
    }
}

export default {
  name: 'app',
  components: {
      HotTable
  },
  data() {
      return {
        //   addressList: [{
        //       area: []
        //   }],
          arr:[],
          demo:['a','b','c','d'],
          hotSettings: {
              dataList: [],  //
              colHeaders:  [ '數據名稱','單位', '小數位', '最小值', '最大值', '最小原始值','最大原始值','寄存器類型','寄存器地址','數據格式','數據位','字節順序','UnitidID'],
              startRows: 8,
              startCols: 6,
              rowHeaders: true,
              rowHeights: 40,
              manualRowResize: true,
              manualColumnResize: true,
              manualRowMove: true,
              customBorders: true,
              columns: [      //data: dataList數組中對應的 鍵,readOnly: 只讀, type: 屬於什么類型 例:text, numeric, validator: 數據驗證
                    {
                        data: 'name',  //data上傳對應字段
                    }, 
                    {
                        data: 'unit', //id
                        type: 'dropdown', //下拉選擇
                        source: ['BMW', 'Chrysler', 'Nissan', 'Suzuki', 'Toyota', 'Volvo'],
                        strict: false   //是否嚴格匹配
                    },
                    {
                        data: 'decimalPlace', //id
                        type: 'dropdown', //下拉選擇
                        source: ['BMW', 'Chrysler', 'Nissan', 'Suzuki', 'Toyota', 'Volvo'],
                        strict: false   //是否嚴格匹配
                    },
                    {
                        data: 'min',  //data上傳對應字段
                        type: 'numeric', //數值
                    }, 
                    {
                        data: 'max',  //data上傳對應字段
                        type: 'numeric', //數值
                    }, 
                    {
                        data: 'oddMin',  //data上傳對應字段
                        type: 'numeric', //數值
                    }, 
                    {
                        data: 'oddMax',  //data上傳對應字段
                        type: 'numeric', //數值
                    }, 
                    {   
                        data: 'type', //id
                        type: 'dropdown', //下拉選擇
                        source: ['BMW', 'Chrysler', 'Nissan', 'Suzuki', 'Toyota', 'Volvo'],
                        strict: false ,  //是否嚴格匹配
                    },
                    {
                        data: 'address',  //data上傳對應字段
                        type: 'numeric', //數值
                    }, 
                    {
                        data: 'format',    //id
                        type: 'dropdown', //下拉選擇
                        source: ['BMW', 'Chrysler', 'Nissan', 'Suzuki', 'Toyota', 'Volvo'],
                        strict: false   //是否嚴格匹配
                    },
                    {
                        data: 'dataBits', 
                        type: 'dropdown', //下拉選擇
                        source: ['BMW', 'Chrysler', 'Nissan', 'Suzuki', 'Toyota', 'Volvo'],
                        strict: false   //是否嚴格匹配
                    },
                    {   
                        data: 'byteOrder',
                        type: 'dropdown', //下拉選擇
                        source: ['BMW', 'Chrysler', 'Nissan', 'Suzuki', 'Toyota', 'Volvo'],
                        strict: false   //是否嚴格匹配
                    },
                    {
                        data: 'unitId',  //data上傳對應字段
                        type: 'numeric', //數值
                    }, 
              ],
              contextMenu: {
                  items: {
                      'row_above': {
                          name: '在此行上方插入行'
                      },
                      'row_below': {
                          name: '在此行下方插入行'
                      },
                      'separator': Handsontable.plugins.ContextMenu.SEPARATOR,
                      'copy': {
                          name: '復制'
                      },
                      'undo': {
                          name: '撤消'
                      },
                      'separator1': Handsontable.plugins.ContextMenu.SEPARATOR,
                      'remove_row': {
                          name: '刪除行'
                      },
                      'clear_column': {
                          name: '刪除列'
                      },
                      'clear_custom': {
                          name: '刪除所有單元格',
                          callback: function () {
                              this.clear()
                          }
                      }
                  }
              }
          },
          expressCompanyList: [],
          dateRange: [],
          typeBol: false,
          searchParam: {
              supplierServiceRegionPriceVos: []
          },
          searchParamRules: {
              supplierServiceRegionPriceVos: [
                  { type: 'array', required: true, message: '請填寫價格表', trigger: 'blur' },
                  { validator: validatorList, required: true, message: '請輸入價格表中所有信息, 多余的可通過鼠標右擊進行刪除行', trigger: 'blur' }
              ]
          },
          showContent: false,
          loadShow: false,
          saveLimit: false
      }
  },
    mounted() {
        for(var i=0;i<10;i++){
            let x = {riseWeight:11}
            this.hotSettings.dataList.push(x)
        }
    },
    methods: {
        // 刪除行之前調用
        beforeRemoveRowMe: function (changes, source) { // 數據改變時觸發此方法
            this.hotSettings.dataList.splice(changes, source)
        },
        // 添加行
        afterCreateRowMe: function (changes) {
            this.hotSettings.dataList.splice(changes, 0, {
                region: '',
                destination: '',
                firstWeight: '',
                firstWeightPrice: '',
                riseWeight: '',
                riseWeightPrice: ''
            })
        },
        //新增行時,動態改變值
        afterChangeMe: function (changes) {
            if (changes) {
                changes.forEach(([row, prop, oldValue, newValue]) => {
                    // console.log(row, prop, oldValue, newValue)
                    this.hotSettings.dataList[row][prop] = newValue
                })
            }
        },
        //查看-excel不可編輯
        excalEdit() {
            this.hotSettings.columns.forEach(par => {
                par.readOnly = true
            })
        },
        definedShow() {
            this.showContent = true
        },
        saveSubmit() {
          this.hotRef = this.$refs.searchForm.hotInstance     //這個是百度到的 用於驗證紅色的驗證錯誤
          this.arr = []
          this.hotRef.validateCells((valid) => {
          if (valid) {
              this.hotSettings.dataList.forEach((item,index)=>{  //想獲取[{name:'vue'},{name:'vue'}] 這種形式必須用this.hotSettings.dataList  而且 columns 中每個對象中的 data :一定要設置成你后台需要的樣子!
                  if(item.name || item.unit || item.decimalPlace || item.min || item.max || item.oddMin || item.oddMax || item.type || item.address || item.format || item.dataBits || item.byteOrder || item.unitId){
                      if(item.name && item.unit && item.decimalPlace && item.min && item.max && item.oddMin && item.oddMax && item.type && item.address && item.format && item.dataBits && item.byteOrder && item.unitId){
                          this.arr.push(item)
                      }else{
                          alert(`請將第${index+1}行,填寫完整!`)
                      }
                  }
              })
              window.console.log(this.arr,"讓我看看數據對不對是不是我想要的!")
          }else{
              alert('請修改錯誤格式!')
          }
        })    
        },
        // 導出文件
        uploadFile() {
            // 可查看網址https://handsontable.com/docs/7.1.0/ExportFile.html
            const container = this.$refs.tableServer.hotInstance
            const exportPlugin = container.getPlugin('exportFile')
            exportPlugin.downloadFile('csv', {
                bom: 'UTF-8', // 允許您使用BOM簽名導出數據。
                columnDelimiter: ',', // 允許您定義列分隔符。
                columnHeaders: false, // 允許使用列標題導出數據。
                exportHiddenColumns: true, // 允許您從隱藏列導出數據。
                exportHiddenRows: true, // 允許您從隱藏行導出數據
                fileExtension: 'csv', // 允許您定義文件擴展名。
                filename: '供應商服務價格表[YYYY]-[MM]-[DD]', // 允許您定義文件名。
                mimeType: 'text/csv', // 允許您定義MIME類型。
                rowDelimiter: '\r\n', // 允許您定義行分隔符。
                rowHeaders: true // 允許您使用行標題導出數據。
            })
        }
    }
}

</script>
     
<style>
@import '~handsontable/dist/handsontable.full.css';
</style>
       

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM