• vue数据增删改查及表单验证


    目录

    1. 准备工作

    2. 弹出窗口

    3. 新增更新功能

    4. 删除功能

    5. 表单验证

    5. 接口文档


    1. 准备工作

    后台服务接口,对书本的增删改查操作

    2. 弹出窗口

    进入ElementUi官网, 找到Dialog对话框,可以参考“嵌套表单的dialog”实现。
    该步骤先实现弹出窗口的前端逻辑,并不会调用后台接口服务进行实际的业务操作。
    BookList.vue

    1. <!--
    2. 弹出窗口:增加和修改书本信息共用一个弹出窗口,需要根据用户的选择动态的设置弹出窗口的标题
    3. :tile 通过绑定值的方式设置dialog的标题
    4. :visible.sync 控制弹出窗口的显示或隐藏,.sync同步修饰符
    5. @close="closeBookForm",设置窗口关闭时调用的处理函数,可用于清空表单
    6. :model="bookForm":用于定义表单对应的model,具体model的定义可见data部分。
    7. v-show="optiontype == 'update'" 通过操作类型控制是否显示书本编号字段,如果当前操作类型为
    8. 新增,则不用显示,书本编号在数据表中是自增的。
    9. :label-width="formLabelWidth" 统一定义标签的宽度。
    10. :style="{width: formEleWidth}" 统一定义form元素的宽度。
    11. -->
    12. <el-dialog :title="dialogName" :visible.sync="dialogFormVisible" @close="closeBookForm" width="500px">
    13. <el-form :model="bookForm">
    14. <el-form-item v-show="optiontype == 'update'" label="编号" :label-width="formLabelWidth">
    15. <el-input v-model="bookForm.id" autocomplete="off" :style="{width: formEleWidth}"></el-input>
    16. </el-form-item>
    17. <el-form-item label="书名" :label-width="formLabelWidth">
    18. <el-input v-model="bookForm.bookname" autocomplete="off" :style="{width: formEleWidth}"></el-input>
    19. </el-form-item>
    20. <el-form-item label="价格" :label-width="formLabelWidth">
    21. <el-input v-model="bookForm.price" autocomplete="off" :style="{width: formEleWidth}"></el-input>
    22. </el-form-item>
    23. <el-form-item label="类型" :label-width="formLabelWidth">
    24. <el-select v-model="bookForm.booktype" placeholder="选择类型" :style="{width:formEleWidth}">
    25. <el-option label="名著" value="mz"></el-option>
    26. <el-option label="小说" value="xs"></el-option>
    27. </el-select>
    28. </el-form-item>
    29. </el-form>
    30. <div slot="footer" class="dialog-footer">
    31. <el-button @click="dialogFormVisible = false">取 消</el-button>
    32. <el-button type="primary" @click="dialogFormVisible = false">确 定</el-button>
    33. </div>
    34. </el-dialog>

    在数据表格中添加“编辑”“删除”功能连接。(在element-ui官方demo -> table组件中,有如何加入删除,编辑等按钮的示例)

    1. <!--表格-->
    2. <el-table :data="books" style="width: 100%;" :border="true" max-height="530">
    3. <el-table-column prop="id" label="编号" min-width="40" align="center"></el-table-column>
    4. <el-table-column prop="bookname" label="名称" min-width="100" align="center"></el-table-column>
    5. <el-table-column prop="price" label="价格" min-width="70" align="center"></el-table-column>
    6. <el-table-column prop="booktype" label="类型" min-width="70" align="center"></el-table-column>
    7. <!-- “编辑”“删除”功能连接 -->
    8. <el-table-column label="操作">
    9. <!--
    10. <template>上使用特殊的slot-scope 特性,可以接收传递给插槽的prop
    11. slot-scope:类似将每一行的row对象封装到槽中,之后直接从scope中获取
    12. row对象信息和行索引index信息即可
    13. -->
    14. <template slot-scope="scope">
    15. <el-button size="mini" @click="handleEdit(scope.row)">编辑</el-button>
    16. <el-button size="mini" type="danger" @click="handleDelete(scope.row)">删除</el-button>
    17. </template>
    18. </el-table-column>
    19. </el-table>

    script部分:

    1. export default {
    2. name: 'BookList',
    3. data: function() {
    4. return {
    5. bookname: '',
    6. books: [],
    7. total: 0,
    8. rows: 10,
    9. page: 1,
    10. //控制对话框是否显示,默认是隐藏状态
    11. dialogFormVisible: false,
    12. //统一控制标签的宽度
    13. formLabelWidth: '40px',
    14. //统一控制表单元素的宽度
    15. formEleWidth: '400px',
    16. //对话框标题,默认为新增,如果是点击修改按钮打开对话框,则标题应为修改。
    17. dialogName:'新增书本',
    18. //操作类型,默认为添加,如果是点击修改打开对话框,则操作类类型应变为修改
    19. //该变量用于控制是否显示书本编号字段,当操作类型为新增时不需显示(书本编号数据表字段为自增)
    20. //当操作类型为修改时,需要显示。
    21. optiontype: 'add',
    22. //定义表单对应的model
    23. bookForm: {
    24. id: '',
    25. bookname: '',
    26. price:null,
    27. booktype: ''
    28. }
    29. }
    30. },
    31. methods: {
    32. qry: function() {
    33. let url = this.axios.urls.BOOKMSG_BOOKINFO_REQ;
    34. this.axios.post(url, {
    35. bookname: this.bookname,
    36. page: this.page,
    37. rows: this.rows
    38. }).then(resp => {
    39. console.log(resp);
    40. this.books = resp.data.data;
    41. this.total = resp.data.total;
    42. }).catch(error => {
    43. console.log(error);
    44. });
    45. },
    46. //当每页显示的记录数发生变化时,设置当前页码为1,执行查询。
    47. handleSizeChange: function(rows) {
    48. this.rows = rows;
    49. this.page = 1;
    50. this.qry();
    51. },
    52. //当前页码发生变化时,执行查询
    53. handleCurrentChange: function(page) {
    54. this.page = page;
    55. this.qry();
    56. },
    57. //当关闭对话框时,该方法用于清空表单
    58. closeBookForm: function() {
    59. this.bookForm.id=null;
    60. this.bookForm.bookname = null;
    61. this.bookForm.booktype = null;
    62. this.bookForm.price = null;
    63. },
    64. //打开对话框,将对话框标题设置为新增,操作类型设置为'add'
    65. addBook: function() {
    66. this.dialogName = '新增书本信息';
    67. this.dialogFormVisible = true;
    68. this.optiontype = 'add';
    69. },
    70. //打开对话框,将对话框标题设置为修改,操作类型设置为'update'
    71. //并使用获取的待修改的记录的值设置对应的表单元素
    72. handleEdit: function(row) {
    73. this.dialogName = '编辑书本信息';
    74. this.dialogFormVisible = true;
    75. this.bookForm.id=row.id;
    76. this.bookForm.bookname = row.bookname;
    77. this.bookForm.booktype = row.booktype;
    78. this.bookForm.price = row.price;
    79. this.optiontype = 'update';
    80. },
    81. //删除书本记录
    82. handleDelete: function(row) {
    83. console.log("dele = " + row);
    84. }
    85. }
    86. }

    3. 新增更新功能

    1) 在action.js中加入后台接口配置配置时按照自己的项目实际进行,不要照抄

    1. //获取书本信息
    2. 'BOOKMSG_BOOKINFO_REQ':'/bookMsg/bookAction!getBooks.action',
    3. //增加书本信息
    4. 'BOOKMSG_BOOKINFO_ADD' : '/bookMsg/bookAction!addBook.action',
    5. //修改书本信息
    6. 'BOOKMSG_BOOKINFO_UPDATE': '/bookMsg/bookAction!updateBook.action',
    7. //删除书本信息
    8. 'BOOKMSG_BOOKINFO_DEL': '/bookMsg/bookAction!delBook.action',
    9. //VUEX 异步请求后台数据
    10. 'VUE_ASYN_REQ':'/userMsg/vueAsynAction!asynAction.action',

    2) 在前端调用接口, 注意在调用前请确认后台接口可正常使用

    图一:

    图二:

    1. //保存书本信息
    2. saveBook: function() {
    3. let url = this.axios.urls.BOOKMSG_BOOKINFO_ADD;
    4. //如果当前操作类型为update则需要调用更新接口
    5. if (this.optiontype == 'update') {
    6. url = this.axios.urls.BOOKMSG_BOOKINFO_UPDATE;
    7. }
    8. this.axios.post(url, this.bookForm).then(resp => {
    9. //操作成功,关闭弹出框,执行查询以便于显示最新数据
    10. //操作失败,提示失败,关闭弹出框
    11. if (resp.data.success) {
    12. this.$message({
    13. message: resp.data.msg,
    14. type: 'success'
    15. });
    16. this.dialogFormVisible = false;
    17. this.qry();
    18. } else {
    19. this.$message({
    20. message: resp.data.msg,
    21. type: 'error'
    22. });
    23. this.dialogFormVisible = false;
    24. }
    25. }).catch(error => {
    26. })
    27. },

    4. 删除功能

    1. //删除书本记录
    2. handleDelete: function(row) {
    3. let url = this.axios.urls.BOOKMSG_BOOKINFO_DEL+"?id="+row.id;
    4. this.axios.delete(url).then(resp => {
    5. if(resp.data.success) {
    6. this.$message({
    7. message: resp.data.msg,
    8. type:'success'
    9. });
    10. this.qry();
    11. } else {
    12. this.$message({
    13. message: resp.data.msg,
    14. type: 'error'
    15. });
    16. }
    17. }).catch(error => {
    18. console.log(error);
    19. })
    20. }

    在删除之前需求让用户确认一下是否删除,这个功能请自行参数element-ui官方文档。

    5. 表单验证

    查看Element-ui官方文档Form部分
    图一:

    如果需要自定义验证规则,用法如下图所示:
    图二

    1. //定义表单验证规则,validatePrice为自定义验证函数,在下文有具体定义
    2. rules: {
    3. bookname: [
    4. {required: true, message: '请输入书本名', trigger: 'blur'}
    5. ],
    6. price: [
    7. {required: true, validator: validatePrice, trigger: 'blur' }
    8. ],
    9. booktype: [
    10. {required: true, message: '请输入书本类型', trigger: 'blur'}
    11. ]
    12. }

    validatePrice函数的定义:

    1. //用于验证订单金额
    2. var validatePrice = (rule, value, callback) => {
    3. if(!value){
    4. callback(new Error('请输入订单金额'));
    5. } else if (isNaN(value)) {
    6. callback(new Error('请输入数字值'));
    7. } else {
    8. callback();
    9. }
    10. }

    表单验证

    1. //保存书本信息
    2. saveBook: function(formName) {
    3. let url = this.axios.urls.BOOKMSG_BOOKINFO_ADD;
    4. //调用表单验证
    5. this.$refs[formName].validate((valid) => {
    6. //如果当前操作类型为update则需要调用更新接口
    7. if (this.optiontype == 'update') {
    8. url = this.axios.urls.BOOKMSG_BOOKINFO_UPDATE;
    9. }
    10. this.axios.post(url, this.bookForm).then(resp => {
    11. //操作成功,关闭弹出框,执行查询以便于显示最新数据
    12. //操作失败,提示失败,关闭弹出框
    13. if (resp.data.success) {
    14. this.$message({
    15. message: resp.data.msg,
    16. type: 'success'
    17. });
    18. this.dialogFormVisible = false;
    19. this.qry();
    20. } else {
    21. this.$message({
    22. message: resp.data.msg,
    23. type: 'error'
    24. });
    25. this.dialogFormVisible = false;
    26. }
    27. }).catch(error => {
    28. })
    29. });
    30. },

    定义验证规则,及rule
    图三

    调用验证,图四

    通过form表单的ref属性来清空表单验证信息,图五

    5. 接口文档

    接口文档需要包含的基本要素:

    接口地址:
    请求方式:get/post/put/delete等
    请求示例:举例说明如何调用
    请求参数:说明请求参数,及存放的位置,如url,form-data, body raw等等。
    返回参数:
    正确:说明返回的json数据
    错误:指明不同错误的代码及含义

  • 相关阅读:
    记一次SQL优化
    【Java】记录一次使用 Springboot + Liquibase 做数据库的变更同步、回滚
    跨平台应用开发进阶(三十):uni-app 实现视频直播
    NIO‘s Sword(思维,取模,推公式)
    Android性能优化,可以从那些方面解决?方案一览
    Python-OpenCV API
    Google重磅发布Go语言编码规范
    WebAssembly照亮了 Web端软件的未来
    人工智能导论
    JavaEE——IO
  • 原文地址:https://blog.csdn.net/qq_64001795/article/details/127289629