在表格裏面渲染form表單,數字保留2位小數,不足的自動補齊。javascript
選用的是 iview 的組件 Form 、Input、Table。vue
Form表單的數據能夠雙向綁定,這樣在對輸入的數據作補零操做後,更新Form表單的model綁定的數據,便可更新。java
沒有使用 InputNumber 是由於它的交互用戶體驗不是很友好,而選用了經常使用的Input。
但問題不是出在這裏,請繼續往下看。iview
<template> <div> <Form ref="formTable" :model="formTable" :rules="rulesTable" inline > <Table border :columns="columns" :data="data"></Table> </Form> </div> </template> <script> let Trim=function(str,isGlobal) { let result; result = str.replace(/(^\s+)|(\s+$)/g,""); if(isGlobal === true) result = result.replace(/\s/g,""); return result; }; import FormItemInput from './form-item-input.vue'; export default { name:'test', components: {FormItemInput}, data() { return { //+++ form 表單 start formTable:{}, rulesTable:{}, //+++ form 表單 end // +++++++ table start data:[ { "id":1, "name":"張三", "score":"" }, { "id":2, "name":"李四", "score":"" } ], columns:[ { title: '序號', type: 'index', width: 60, align: 'center' }, { title: '姓名', key: 'name', width: 200, ellipsis:true }, { title: '成績', key: 'score', width: 150, className:'custom-table-form', ellipsis:true, renderHeader:(h, params) => { // 2019年1月4日11:01:36 // 必填 須要展現 * return h('div', [ h('i', { style: { color: 'red', marginRight: '5px' } }, '*'), h('span', {}, params.column.title) ]); }, render:(h, params)=>{ console.log('行數據',params.index, params); /** * 2019年5月14日17:08:32 添加校驗 */ let _formKey=params.column.key+'_'+params.row.id; this.rulesTable[_formKey]=[]; // 2019年6月6日11:09:32 這步會致使,數據渲染兩遍 this.$set(this.$data.formTable, _formKey, params.row[params.column.key]===undefined || params.row[params.column.key]===null ? '' : params.row[params.column.key]); this.rulesTable[_formKey].push( { /** * 清掉input輸入的空格,若是爲空,不能經過 */ validator(rule, value, callback, source, options) { let errors = []; if (!Trim(value) ){ errors.push( new Error( "該項是必填項")); } callback(errors); }, trigger: 'blur' }, { validator(rule, value, callback, source, options) { let errors = []; // 正則控制範圍,比較大小,同時存在才爲true let _tmpValue= value && Number(value); // 能夠出現一項:100分,或者n項 幾分~幾十分 let reg= /^([1-9]?[0-9]{1,2})?\0?(\.\d{1,2})?$/; if(!(reg.test(_tmpValue)&&0<=_tmpValue&&_tmpValue<=100)) { errors.push( new Error("請輸入0-100之間的數字,小數點後最多容許保留2位小數") ); } callback(errors); },type:'string', trigger: 'blur' } ); return h(FormItemInput, { props:{ formTable:this.formTable, formKey:_formKey, }, on:{ 'on-form-blur':(value)=>{ // 更新提交數據 this.$refs.formTable.validateField(_formKey, (message)=>{ //2019年5月16日10:12:08 校驗經過之後,保留2位小數 if(message.length==0) { this.formTable[_formKey]=Number(value).toFixed(2); console.log('formTable',this.formTable); } }); } } }); } }, ], // +++++++ table end }; }, mounted() { }, methods: {} } </script>
<template> <Form-item :prop="formKey" @on-form-blur="onFormBlur" :required="required" :label="label" :setLengthNumber="setLengthNumber" :lastFormItem="lastFormItem"> <Input v-model="formTable[formKey]" ></Input> </Form-item> </template> <script> export default { props:{ required:{ type:Boolean, default:false }, label:{ type:String, default:'' }, formTable:Object, formKey:String, }, methods: { onFormBlur(value){ this.$emit('on-form-blur', value); } } } </script>
使用 this.$set(this.$data.formTable, _formKey, '')
處理數據能夠實現數據的雙向綁定。
可是會致使表格渲染兩次。ui
怎麼解決呢????this
此處的Form表單和表格的樣式等須要調整細節,不在本次的重點,能夠忽略。spa