Vue數(shù)據(jù)增刪改查與表單驗(yàn)證的實(shí)現(xiàn)流程介紹
1. 準(zhǔn)備工作
后臺(tái)服務(wù)接口,對(duì)書(shū)本的增刪改查操作
2. 彈出窗口
進(jìn)入ElementUi官網(wǎng), 找到Dialog對(duì)話框,可以參考“嵌套表單的dialog”實(shí)現(xiàn)。
該步驟先實(shí)現(xiàn)彈出窗口的前端邏輯,并不會(huì)調(diào)用后臺(tái)接口服務(wù)進(jìn)行實(shí)際的業(yè)務(wù)操作。
BookList.vue
<!--
彈出窗口:增加和修改書(shū)本信息共用一個(gè)彈出窗口,需要根據(jù)用戶(hù)的選擇動(dòng)態(tài)的設(shè)置彈出窗口的標(biāo)題
:tile 通過(guò)綁定值的方式設(shè)置dialog的標(biāo)題
:visible.sync 控制彈出窗口的顯示或隱藏,.sync同步修飾符
@close="closeBookForm",設(shè)置窗口關(guān)閉時(shí)調(diào)用的處理函數(shù),可用于清空表單
:model="bookForm":用于定義表單對(duì)應(yīng)的model,具體model的定義可見(jiàn)data部分。
v-show="optiontype == 'update'" 通過(guò)操作類(lèi)型控制是否顯示書(shū)本編號(hào)字段,如果當(dāng)前操作類(lèi)型為
新增,則不用顯示,書(shū)本編號(hào)在數(shù)據(jù)表中是自增的。
:label-width="formLabelWidth" 統(tǒng)一定義標(biāo)簽的寬度。
:style="{width: formEleWidth}" 統(tǒng)一定義form元素的寬度。
-->
<el-dialog :title="dialogName" :visible.sync="dialogFormVisible" @close="closeBookForm" width="500px">
<el-form :model="bookForm">
<el-form-item v-show="optiontype == 'update'" label="編號(hào)" :label-width="formLabelWidth">
<el-input v-model="bookForm.id" autocomplete="off" :style="{width: formEleWidth}"></el-input>
</el-form-item>
<el-form-item label="書(shū)名" :label-width="formLabelWidth">
<el-input v-model="bookForm.bookname" autocomplete="off" :style="{width: formEleWidth}"></el-input>
</el-form-item>
<el-form-item label="價(jià)格" :label-width="formLabelWidth">
<el-input v-model="bookForm.price" autocomplete="off" :style="{width: formEleWidth}"></el-input>
</el-form-item>
<el-form-item label="類(lèi)型" :label-width="formLabelWidth">
<el-select v-model="bookForm.booktype" placeholder="選擇類(lèi)型" :style="{width:formEleWidth}">
<el-option label="名著" value="mz"></el-option>
<el-option label="小說(shuō)" value="xs"></el-option>
</el-select>
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button @click="dialogFormVisible = false">取 消</el-button>
<el-button type="primary" @click="dialogFormVisible = false">確 定</el-button>
</div>
</el-dialog>在數(shù)據(jù)表格中添加“編輯”“刪除”功能連接。(在element-ui官方demo -> table組件中,有如何加入刪除,編輯等按鈕的示例)
<!--表格-->
<el-table :data="books" style="width: 100%;" :border="true" max-height="530">
<el-table-column prop="id" label="編號(hào)" min-width="40" align="center"></el-table-column>
<el-table-column prop="bookname" label="名稱(chēng)" min-width="100" align="center"></el-table-column>
<el-table-column prop="price" label="價(jià)格" min-width="70" align="center"></el-table-column>
<el-table-column prop="booktype" label="類(lèi)型" min-width="70" align="center"></el-table-column>
<!-- “編輯”“刪除”功能連接 -->
<el-table-column label="操作">
<!--
在<template>上使用特殊的slot-scope 特性,可以接收傳遞給插槽的prop
slot-scope:類(lèi)似將每一行的row對(duì)象封裝到槽中,之后直接從scope中獲取
row對(duì)象信息和行索引index信息即可
-->
<template slot-scope="scope">
<el-button size="mini" @click="handleEdit(scope.row)">編輯</el-button>
<el-button size="mini" type="danger" @click="handleDelete(scope.row)">刪除</el-button>
</template>
</el-table-column>
</el-table>script部分:
export default {
name: 'BookList',
data: function() {
return {
bookname: '',
books: [],
total: 0,
rows: 10,
page: 1,
//控制對(duì)話框是否顯示,默認(rèn)是隱藏狀態(tài)
dialogFormVisible: false,
//統(tǒng)一控制標(biāo)簽的寬度
formLabelWidth: '40px',
//統(tǒng)一控制表單元素的寬度
formEleWidth: '400px',
//對(duì)話框標(biāo)題,默認(rèn)為新增,如果是點(diǎn)擊修改按鈕打開(kāi)對(duì)話框,則標(biāo)題應(yīng)為修改。
dialogName:'新增書(shū)本',
//操作類(lèi)型,默認(rèn)為添加,如果是點(diǎn)擊修改打開(kāi)對(duì)話框,則操作類(lèi)類(lèi)型應(yīng)變?yōu)樾薷?
//該變量用于控制是否顯示書(shū)本編號(hào)字段,當(dāng)操作類(lèi)型為新增時(shí)不需顯示(書(shū)本編號(hào)數(shù)據(jù)表字段為自增)
//當(dāng)操作類(lèi)型為修改時(shí),需要顯示。
optiontype: 'add',
//定義表單對(duì)應(yīng)的model
bookForm: {
id: '',
bookname: '',
price:null,
booktype: ''
}
}
},
methods: {
qry: function() {
let url = this.axios.urls.BOOKMSG_BOOKINFO_REQ;
this.axios.post(url, {
bookname: this.bookname,
page: this.page,
rows: this.rows
}).then(resp => {
console.log(resp);
this.books = resp.data.data;
this.total = resp.data.total;
}).catch(error => {
console.log(error);
});
},
//當(dāng)每頁(yè)顯示的記錄數(shù)發(fā)生變化時(shí),設(shè)置當(dāng)前頁(yè)碼為1,執(zhí)行查詢(xún)。
handleSizeChange: function(rows) {
this.rows = rows;
this.page = 1;
this.qry();
},
//當(dāng)前頁(yè)碼發(fā)生變化時(shí),執(zhí)行查詢(xún)
handleCurrentChange: function(page) {
this.page = page;
this.qry();
},
//當(dāng)關(guān)閉對(duì)話框時(shí),該方法用于清空表單
closeBookForm: function() {
this.bookForm.id=null;
this.bookForm.bookname = null;
this.bookForm.booktype = null;
this.bookForm.price = null;
},
//打開(kāi)對(duì)話框,將對(duì)話框標(biāo)題設(shè)置為新增,操作類(lèi)型設(shè)置為'add'
addBook: function() {
this.dialogName = '新增書(shū)本信息';
this.dialogFormVisible = true;
this.optiontype = 'add';
},
//打開(kāi)對(duì)話框,將對(duì)話框標(biāo)題設(shè)置為修改,操作類(lèi)型設(shè)置為'update',
//并使用獲取的待修改的記錄的值設(shè)置對(duì)應(yīng)的表單元素
handleEdit: function(row) {
this.dialogName = '編輯書(shū)本信息';
this.dialogFormVisible = true;
this.bookForm.id=row.id;
this.bookForm.bookname = row.bookname;
this.bookForm.booktype = row.booktype;
this.bookForm.price = row.price;
this.optiontype = 'update';
},
//刪除書(shū)本記錄
handleDelete: function(row) {
console.log("dele = " + row);
}
}
}

3. 新增更新功能
1) 在action.js中加入后臺(tái)接口配置。配置時(shí)按照自己的項(xiàng)目實(shí)際進(jìn)行,不要照抄

//獲取書(shū)本信息 'BOOKMSG_BOOKINFO_REQ':'/bookMsg/bookAction!getBooks.action', //增加書(shū)本信息 'BOOKMSG_BOOKINFO_ADD' : '/bookMsg/bookAction!addBook.action', //修改書(shū)本信息 'BOOKMSG_BOOKINFO_UPDATE': '/bookMsg/bookAction!updateBook.action', //刪除書(shū)本信息 'BOOKMSG_BOOKINFO_DEL': '/bookMsg/bookAction!delBook.action', //VUEX 異步請(qǐng)求后臺(tái)數(shù)據(jù) 'VUE_ASYN_REQ':'/userMsg/vueAsynAction!asynAction.action',
2) 在前端調(diào)用接口, 注意在調(diào)用前請(qǐng)確認(rèn)后臺(tái)接口可正常使用
圖一:

圖二:

//保存書(shū)本信息
saveBook: function() {
let url = this.axios.urls.BOOKMSG_BOOKINFO_ADD;
//如果當(dāng)前操作類(lèi)型為update則需要調(diào)用更新接口
if (this.optiontype == 'update') {
url = this.axios.urls.BOOKMSG_BOOKINFO_UPDATE;
}
this.axios.post(url, this.bookForm).then(resp => {
//操作成功,關(guān)閉彈出框,執(zhí)行查詢(xún)以便于顯示最新數(shù)據(jù)
//操作失敗,提示失敗,關(guān)閉彈出框
if (resp.data.success) {
this.$message({
message: resp.data.msg,
type: 'success'
});
this.dialogFormVisible = false;
this.qry();
} else {
this.$message({
message: resp.data.msg,
type: 'error'
});
this.dialogFormVisible = false;
}
}).catch(error => {
})
},4. 刪除功能

//刪除書(shū)本記錄
handleDelete: function(row) {
let url = this.axios.urls.BOOKMSG_BOOKINFO_DEL+"?id="+row.id;
this.axios.delete(url).then(resp => {
if(resp.data.success) {
this.$message({
message: resp.data.msg,
type:'success'
});
this.qry();
} else {
this.$message({
message: resp.data.msg,
type: 'error'
});
}
}).catch(error => {
console.log(error);
})
}在刪除之前需求讓用戶(hù)確認(rèn)一下是否刪除,這個(gè)功能請(qǐng)自行參數(shù)element-ui官方文檔。
5. 表單驗(yàn)證
查看Element-ui官方文檔Form部分
圖一:

如果需要自定義驗(yàn)證規(guī)則,用法如下圖所示:
圖二

//定義表單驗(yàn)證規(guī)則,validatePrice為自定義驗(yàn)證函數(shù),在下文有具體定義
rules: {
bookname: [
{required: true, message: '請(qǐng)輸入書(shū)本名', trigger: 'blur'}
],
price: [
{required: true, validator: validatePrice, trigger: 'blur' }
],
booktype: [
{required: true, message: '請(qǐng)輸入書(shū)本類(lèi)型', trigger: 'blur'}
]
}validatePrice函數(shù)的定義:
//用于驗(yàn)證訂單金額
var validatePrice = (rule, value, callback) => {
if(!value){
callback(new Error('請(qǐng)輸入訂單金額'));
} else if (isNaN(value)) {
callback(new Error('請(qǐng)輸入數(shù)字值'));
} else {
callback();
}
}表單驗(yàn)證:
//保存書(shū)本信息
saveBook: function(formName) {
let url = this.axios.urls.BOOKMSG_BOOKINFO_ADD;
//調(diào)用表單驗(yàn)證
this.$refs[formName].validate((valid) => {
//如果當(dāng)前操作類(lèi)型為update則需要調(diào)用更新接口
if (this.optiontype == 'update') {
url = this.axios.urls.BOOKMSG_BOOKINFO_UPDATE;
}
this.axios.post(url, this.bookForm).then(resp => {
//操作成功,關(guān)閉彈出框,執(zhí)行查詢(xún)以便于顯示最新數(shù)據(jù)
//操作失敗,提示失敗,關(guān)閉彈出框
if (resp.data.success) {
this.$message({
message: resp.data.msg,
type: 'success'
});
this.dialogFormVisible = false;
this.qry();
} else {
this.$message({
message: resp.data.msg,
type: 'error'
});
this.dialogFormVisible = false;
}
}).catch(error => {
})
});
},定義驗(yàn)證規(guī)則,及rule
圖三

調(diào)用驗(yàn)證,圖四

通過(guò)form表單的ref屬性來(lái)清空表單驗(yàn)證信息,圖五

6. 接口文檔
接口文檔需要包含的基本要素:
接口地址:
請(qǐng)求方式:get/post/put/delete等
請(qǐng)求示例:舉例說(shuō)明如何調(diào)用
請(qǐng)求參數(shù):說(shuō)明請(qǐng)求參數(shù),及存放的位置,如url,form-data, body raw等等。
返回參數(shù):
正確:說(shuō)明返回的json數(shù)據(jù)
錯(cuò)誤:指明不同錯(cuò)誤的代碼及含義
到此這篇關(guān)于Vue數(shù)據(jù)增刪改查與表單驗(yàn)證的實(shí)現(xiàn)流程介紹的文章就介紹到這了,更多相關(guān)Vue增刪改查內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Vue+Element UI實(shí)現(xiàn)下拉菜單的封裝
這篇文章主要為大家詳細(xì)介紹了Vue+Element UI實(shí)現(xiàn)下拉菜單的封裝代碼,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-09-09
vue項(xiàng)目中使用particles實(shí)現(xiàn)粒子背景效果及遇到的坑(按鈕沒(méi)有點(diǎn)擊響應(yīng))
為了提高頁(yè)面展示效果,登錄界面內(nèi)容比較單一的,粒子效果作為背景經(jīng)常使用到,vue工程中利用vue-particles可以很簡(jiǎn)單的實(shí)現(xiàn)頁(yè)面的粒子背景效果,本文給大家分享在實(shí)現(xiàn)過(guò)程中遇到問(wèn)題,需要的朋友一起看看吧2020-02-02
Vue實(shí)現(xiàn)預(yù)覽docx/xlsx/pdf等類(lèi)型文件功能
這篇文章主要介紹了如何在Vue中實(shí)現(xiàn)docx/xlsx/pdf等類(lèi)型文件預(yù)覽功能,在實(shí)現(xiàn)過(guò)程中,需要注意文件的格式和轉(zhuǎn)換方式,以及插件和組件的使用方法和注意事項(xiàng),需要的朋友可以參考下2023-05-05
詳解如何實(shí)現(xiàn)一個(gè)簡(jiǎn)單的 vuex
本篇文章主要介紹了如何實(shí)現(xiàn)一個(gè)簡(jiǎn)單的 vuex,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-02-02
vue中將網(wǎng)頁(yè)打印成pdf實(shí)例代碼
本篇文章主要介紹了vue中將網(wǎng)頁(yè)打印成pdf實(shí)例代碼,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-06-06
淺談element中InfiniteScroll按需引入的一點(diǎn)注意事項(xiàng)
這篇文章主要介紹了淺談element中InfiniteScroll按需引入的一點(diǎn)注意事項(xiàng),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-06-06
vue內(nèi)點(diǎn)擊url下載文件的最佳解決方案分享
這篇文章主要給大家介紹了關(guān)于vue內(nèi)點(diǎn)擊url下載文件的最佳解決方案,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2022-02-02
解決vue prop傳值default屬性如何使用,為何不生效的問(wèn)題
這篇文章主要介紹了解決vue prop傳值default屬性如何使用,為何不生效的問(wèn)題。具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-09-09
Vue3獲取和操作DOM元素的項(xiàng)目實(shí)踐
在Vue3中,有時(shí)我們需要直接操作DOM節(jié)點(diǎn),本文主要介紹了Vue3獲取和操作DOM元素的項(xiàng)目實(shí)踐,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-08-08

