Vue數(shù)據(jù)表格增刪改查與表單驗(yàn)證代碼詳解
一、CRUD實(shí)現(xiàn)
1.1 后臺(tái)CRUD編寫(xiě)
package com.ycxw.ssm.controller;
@Controller
@RequestMapping("/book")
public class BookController {
@Autowired
private IBookService bookService;
@RequestMapping("/addBook")
@ResponseBody
public JsonResponseBody<?> addBook(Book book){
try {
bookService.insert(book);
return new JsonResponseBody<>("新增書(shū)本成功",true,0,null);
} catch (Exception e) {
e.printStackTrace();
return new JsonResponseBody<>("新增書(shū)本失敗",false,0,null);
}
}
@RequestMapping("/editBook")
@ResponseBody
public JsonResponseBody<?> editBook(Book book){
try {
bookService.updateByPrimaryKey(book);
return new JsonResponseBody<>("編輯書(shū)本成功",true,0,null);
} catch (Exception e) {
e.printStackTrace();
return new JsonResponseBody<>("編輯書(shū)本失敗",false,0,null);
}
}
@RequestMapping("/delBook")
@ResponseBody
public JsonResponseBody<?> delBook(Book book){
try {
bookService.deleteByPrimaryKey(book.getId());
return new JsonResponseBody<>("刪除書(shū)本成功",true,0,null);
} catch (Exception e) {
e.printStackTrace();
return new JsonResponseBody<>("刪除書(shū)本失敗",false,0,null);
}
}
@RequestMapping("/queryBookPager")
@ResponseBody
public JsonResponseBody<List<Book>> queryBookPager(Book book, HttpServletRequest req){
try {
PageBean pageBean=new PageBean();
pageBean.setRequest(req);
List<Book> books = bookService.queryBookPager(book, pageBean);
return new JsonResponseBody<>("OK",true,pageBean.getTotal(),books);
} catch (Exception e) {
e.printStackTrace();
return new JsonResponseBody<>("分頁(yè)查詢書(shū)本失敗",false,0,null);
}
}
}1.2 配置訪問(wèn)路徑
src/api/action.js :
//獲取書(shū)本信息 'BOOKMSG_BOOKINFO_REQ': '/book/queryBookPager', //新增書(shū)本 'BOOK_ADD': '/book/addBook', //修改書(shū)本 'BOOK_EDIT': '/book/editBook', //刪除書(shū)本 'BOOK_DEL': '/book/delBook',

1.3 前端編寫(xiě)(及窗口)
<template>
<div class="Book" style="padding: 30px;">
<!-- 輸入框搜索 -->
<el-form :inline="true" class="demo-form-inline">
<el-form-item label="書(shū)籍名稱(chēng) : ">
<el-input v-model="bookname" placeholder="書(shū)籍名稱(chēng)"></el-input>
</el-form-item>
<el-form-item>
<el-button type="warning" @click="onSubmit()">查詢</el-button>
<el-button type="warning" icon="el-icon-plus" @click="addBook()">新增</el-button>
</el-form-item>
</el-form>
<!-- 書(shū)籍的書(shū)籍表格 -->
<el-table :data="tableData" style="width: 100%">
<el-table-column prop="id" label="書(shū)籍ID"></el-table-column>
<el-table-column prop="bookname" label="書(shū)籍名稱(chēng)"></el-table-column>
<el-table-column prop="price" label="書(shū)籍價(jià)格"></el-table-column>
<el-table-column prop="booktype" label="書(shū)籍類(lèi)型"></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>
<!-- 分頁(yè) -->
<div class="block" style="padding: 20px;">
<el-pagination @size-change="handleSizeChange" @current-change="handleCurrentChange" :current-page="page"
background :page-sizes="[10, 20, 30, 40]" :page-size="rows" layout="total, sizes, prev, pager, next, jumper"
:total="total">
</el-pagination>
</div>
<!--
彈出窗口:增加和修改書(shū)本信息共用一個(gè)彈出窗口,需要根據(jù)用戶的選擇動(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" :rules="rules" ref="bookForm" :label-position="center">
<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" prop="bookname">
<el-input v-model="bookForm.bookname" autocomplete="off" :style="{width: formEleWidth}"></el-input>
</el-form-item>
<el-form-item label="價(jià)格" :label-width="formLabelWidth" prop="price">
<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" prop="booktype">
<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="saveBook()">確 定</el-button>
</div>
</el-dialog>
</div>
</template>注1:隱藏顯示設(shè)置,通過(guò)Vue實(shí)例對(duì)象中的dialogFormVisible="true|false"來(lái)控制dialog顯示隱藏
:visible.sync="dialogFormVisible"
注2:通過(guò)close或closed事件,在關(guān)閉dialog彈出框時(shí)清空f(shuō)orm表單數(shù)據(jù)和驗(yàn)證信息;
@close="dialogClose"
1.4 增刪改查實(shí)現(xiàn)
<script>
export default {
name: 'BookList',
data() {
return {
bookname: '',
tableData: [],
rows: 10,
total: 0,
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: {
//選擇分頁(yè)
handleSizeChange(r) {
//當(dāng)頁(yè)大小發(fā)生變化
let params = {
bookname: this.bookname,
rows: r,
page: this.page
}
this.query(params);
},
//輸入分頁(yè)
handleCurrentChange(p) {
//當(dāng)前頁(yè)碼大小發(fā)生變化
let params = {
bookname: this.bookname,
rows: this.rows,
// 分頁(yè)
page: p
}
this.query(params);
},
//查詢方法
query(params) {
//獲取后臺(tái)請(qǐng)求書(shū)籍?dāng)?shù)據(jù)的地址
let url = this.axios.urls.BOOKMSG_BOOKINFO_REQ;
this.axios.get(url, {
params: params
}).then(d => {
this.tableData = d.data.rows;
this.total = d.data.total;
}).catch(e => {});
},
onSubmit() {
let params = {
bookname: this.bookname
}
console.log(params)
this.query(params);
this.bookname = ''
},
//當(dāng)關(guān)閉對(duì)話框時(shí),該方法用于清空表單
closeBookForm() {
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() {
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(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ū)本 */
saveBook() {
//默認(rèn)新增
var url = this.axios.urls.BOOK_ADD;
if (this.optiontype == 'update') {
url = this.axios.urls.BOOK_EDIT;
}
console.log(url)
this.axios.post(url, this.bookForm).then(d => {
//關(guān)閉窗口
this.closeBookForm();
this.dialogFormVisible = false;
this.query({});
}).catch();
},
//刪除書(shū)本記錄
handleDelete(row) {
this.$confirm('此操作將永久刪除該文件, 是否繼續(xù)?', '提示', {
confirmButtonText: '確定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
//獲取刪除書(shū)本訪問(wèn)路徑
var url = this.axios.urls.BOOK_DEL;
this.axios.post(url, {
id: row.id
}).then(r => {
this.$message({
type: 'success',
message: '刪除成功!'
});
this.query({});
})
}).catch(() => {
this.$message({
type: 'info',
message: '已取消刪除'
});
});
}
},
created() {
this.query({})
}
}
</script>1.4.1 新增示例

1.4.2 修改示例

1.4.3 刪除示例

二、表單驗(yàn)證
2.1 設(shè)置表單驗(yàn)證屬性
Form 組件提供了表單驗(yàn)證的功能,只需要通過(guò) rules 屬性傳入約定的驗(yàn)證規(guī)則,并將 Form-Item 的 prop 屬性設(shè)置為需校驗(yàn)的字段名即可。校驗(yàn)規(guī)則參見(jiàn) async-validator

2.2 自定義驗(yàn)證規(guī)則
自定義驗(yàn)證規(guī)則,在data對(duì)象,return之前定義。定義完成后可在rules中使用,如下代碼所示。
注意:
最后return時(shí)調(diào)用的callback,如果不調(diào)用則驗(yàn)證。
//定義驗(yàn)證規(guī)則
rules: {
bookname: [{
//是否必填
required: true,
//提示信息
message: '請(qǐng)輸入書(shū)籍名稱(chēng)',
//事件
trigger: 'blur'
},
{
min: 3,
max: 5,
message: '長(zhǎng)度在 3 到 5 個(gè)字符',
trigger: 'blur'
}
],
price: [{
required: true,
//自定義規(guī)則
validator: checkPrice,
trigger: 'blur'
}],
booktype: [{
required: true,
message: '請(qǐng)選擇類(lèi)型',
trigger: 'change'
}]
}2.3 使用規(guī)則
注意:
表單重置時(shí)必須先清空表單驗(yàn)證信息,再清空表單數(shù)據(jù)信息,通過(guò)form表單的ref屬性來(lái)清空表單驗(yàn)證信息
this.$refs['bookForm'].resetFields();語(yǔ)法:
this.$refs['需要驗(yàn)證的表單名稱(chēng)'].validate((valid) => { if (valid) { //驗(yàn)證通過(guò) alert('submit!'); } else { //驗(yàn)證失敗 console.log('error submit!!'); return false; } });
/* 新增書(shū)本 */
saveBook() {
this.$refs['bookForm'].validate((valid) => {
if (valid) {
//默認(rèn)新增
var url = this.axios.urls.BOOK_ADD;
if (this.optiontype == 'update') {
url = this.axios.urls.BOOK_EDIT;
}
console.log(url)
this.axios.post(url, this.bookForm).then(d => {
//關(guān)閉窗口
this.closeBookForm();
this.dialogFormVisible = false;
this.query({});
}).catch();
} else {
console.log('error submit!!');
return false;
}
});
},2.4 效果演示

總結(jié)
到此這篇關(guān)于Vue數(shù)據(jù)表格增刪改查與表單驗(yàn)證的文章就介紹到這了,更多相關(guān)Vue增刪改查與表單驗(yàn)證內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
vue如何實(shí)現(xiàn)動(dòng)態(tài)改變地址欄的參數(shù)值
這篇文章主要介紹了vue如何實(shí)現(xiàn)動(dòng)態(tài)改變地址欄的參數(shù)值,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-07-07
Vue2使用TailwindCSS方法及遇到問(wèn)題小結(jié)
Tailwind CSS是一個(gè)全新的、可定制的CSS框架,它提供了一系列的CSS類(lèi),用于構(gòu)建現(xiàn)代化的Web界面,這篇文章主要介紹了Vue2使用TailwindCSS方法及遇到問(wèn)題小結(jié),需要的朋友可以參考下2024-03-03
使用Vue3實(shí)現(xiàn)在瀏覽器端進(jìn)行zip文件壓縮
在前端開(kāi)發(fā)中,我們時(shí)常需要處理文件上傳和下載的功能,本文主要和大家分享一下如何使用Vue3和JSZip庫(kù)在瀏覽器端實(shí)現(xiàn)zip文件壓縮,需要的可以參考下2024-05-05
vue使用showdown并實(shí)現(xiàn)代碼區(qū)域高亮的示例代碼
這篇文章主要介紹了vue使用showdown并實(shí)現(xiàn)代碼區(qū)域高亮的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-10-10
element-ui滾動(dòng)條el-scrollbar置底方式
這篇文章主要介紹了element-ui滾動(dòng)條el-scrollbar置底方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-08-08
vue實(shí)現(xiàn)將數(shù)據(jù)存入vuex中以及從vuex中取出數(shù)據(jù)
今天小編就為大家分享一篇vue實(shí)現(xiàn)將數(shù)據(jù)存入vuex中以及從vuex中取出數(shù)據(jù),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-11-11
vue-cli使用stimulsoft.reports.js的詳細(xì)教程
Stimulsoft?Reports.JS是一個(gè)使用JavaScript和HTML5生成報(bào)表的平臺(tái)。它擁有所有擁來(lái)設(shè)計(jì),編輯和查看報(bào)表的必需組件。該報(bào)表工具根據(jù)開(kāi)發(fā)人員數(shù)量授權(quán)而不是根據(jù)應(yīng)用程序的用戶數(shù)量。接下來(lái)通過(guò)本文給大家介紹vue-cli使用stimulsoft.reports.js的方法,一起看看吧2021-12-12


