• ElementUI之CUD+表单验证


    目录

    一、增删改功能实现

    1.1 代码编写

    1.2 效果演示

    二、表单验证

    2.1 加入表单验证指令

    2.2 配置表单验证规则

    2.3 编写验证规则

    2.4 使用规则

    2.5 效果展示


     

    以下代码基于上篇博客的基础进行优化,点此跳转进入:

    Kissship的博客——动态树+数据表格+分页https://blog.csdn.net/weixin_74263417/article/details/133320380?spm=1001.2014.3001.5502

    一、增删改功能实现

    1. Create(新增)

      ElementUI 提供了多个用于数据新增的组件,包括表单(el-form)、输入框(el-input)、下拉选择框(el-select)等。您可以使用这些组件构建用于输入和提交新数据的表单界面。通常,您需要设置合适的表单验证规则(Validation Rules)来确保用户输入的数据有效。
    2. Update(更新)

      要在 ElementUI 中执行数据更新操作,通常需要使用表格(el-table)或类似的列表组件来展示现有数据。用户可以在表格中选择要编辑的数据行,并通过弹出对话框或内联编辑单元格的方式来进行编辑。编辑完成后,需要触发更新操作将修改保存到后端服务器。
    3. Delete(删除)

      删除数据通常涉及到确认删除的操作。ElementUI 提供了对话框组件(el-dialog)和确认框(el-messagebox)来处理删除确认。用户可以通过点击删除按钮触发删除操作,然后系统会提示用户确认删除。一旦用户确认删除,前端会向后端发送删除请求。

    1.1 代码编写

    在项目中的src文件下api中找到action.js进行配置数据访问的地址:

    1. /**
    2. * 对后台请求的地址的封装,URL格式如下:
    3. * 模块名_实体名_操作
    4. */
    5. export default {
    6. 'SERVER': 'http://localhost:8080/', //服务器
    7. 'SYSTEM_USER_DOLOGIN': 'user/userLogin', //登陆
    8. 'SYSTEM_USER_DOREG': 'user/userRegister', //注册
    9. 'SYSTEM_MENUS': 'module/queryRootNode', //左侧菜单树
    10. 'BOOK_LIST': 'book/queryBookPager', //书籍列表
    11. 'BOOK_ADD': 'book/addBook', //书籍增加
    12. 'BOOK_UPD': 'book/editBook', //书籍修改
    13. 'BOOK_DEL': 'book/delBook', //书籍删除
    14. 'getFullPath': k => { //获得请求的完整地址,用于mockjs测试时使用
    15. return this.SERVER + this[k];
    16. }
    17. }

    在BookList.vue组件中进行编写增加修改的代码:

    ElementUI里面找到弹出窗进行编写增加修改的弹窗如下:

    1. <el-dialog :title="title" :visible.sync="dialogFormVisible" @close="clear">
    2. <el-form :model="book" :rules="rules" ref="book">
    3. <el-form-item label="书籍编号" :label-width="formLabelWidth" prop="id">
    4. <el-input v-model="book.id" autocomplete="off">el-input>
    5. el-form-item>
    6. <el-form-item label="书籍名称" :label-width="formLabelWidth" prop="bookname">
    7. <el-input v-model="book.bookname" autocomplete="off">el-input>
    8. el-form-item>
    9. <el-form-item label="书籍价格" :label-width="formLabelWidth" prop="price">
    10. <el-input v-model="book.price" autocomplete="off">el-input>
    11. el-form-item>
    12. <el-form-item label="书籍类别" :label-width="formLabelWidth" prop="booktype">
    13. <el-select v-model="book.booktype" placeholder="请选择活动区域">
    14. <el-option v-for="t in types" :label="t.name" :value="t.name" :key="'key_'+t.id">el-option>
    15. el-select>
    16. el-form-item>
    17. el-form>
    18. <div slot="footer" class="dialog-footer">
    19. <el-button @click="dialogFormVisible = false">取 消el-button>
    20. <el-button type="primary" @click="dosub">确 定el-button>
    21. div>
    22. el-dialog>

     在script标签中编写方法进行数据增加修改实现,在data中编写属性:

    1. data() {
    2. return {
    3. bookname: '',
    4. tableData: [],
    5. rows: 10,
    6. page: 1,
    7. total: 0,
    8. title: '新增窗体',
    9. dialogFormVisible: false,
    10. formLabelWidth: '100px',
    11. types: [],
    12. form: {},
    13. book: {
    14. id: '',
    15. bookname: '',
    16. price: '',
    17. booktype: ''
    18. },
    19. }
    20. },

    在script标签中编写方法进行数据增加修改实现,在methods中编写方法:

    1. methods: {
    2. del(idx, row) {
    3. this.$confirm('此操作将永久删除id为' + row.id + '的数据, 是否继续?', '提示', {
    4. confirmButtonText: '确定',
    5. cancelButtonText: '取消',
    6. type: 'warning'
    7. }).then(() => {
    8. let url = this.axios.urls.BOOK_DEL;
    9. this.axios.post(url, {
    10. id: row.id
    11. })
    12. .then(r => {
    13. console.log(r);
    14. this.$message({
    15. type: 'success',
    16. message: '删除成功!'
    17. });
    18. this.query({});
    19. })
    20. .catch(e => {
    21. // 处理错误
    22. });
    23. }).catch(() => {
    24. this.$message({
    25. type: 'info',
    26. message: '已取消删除'
    27. });
    28. });
    29. },
    30. dosub() {
    31. this.$refs['book'].validate((valid) => {
    32. if (valid) {
    33. let url = this.axios.urls.BOOK_ADD;
    34. if (this.title == '编辑窗体') {
    35. url = this.axios.urls.BOOK_UPD;
    36. }
    37. // 构建请求参数
    38. let params = {
    39. id: this.book.id,
    40. bookname: this.book.bookname,
    41. price: this.book.price,
    42. booktype: this.book.booktype
    43. };
    44. console.log(params)
    45. console.log(url)
    46. this.axios.post(url, params)
    47. .then(r => {
    48. console.log(r);
    49. // 编辑/添加操作成功后,再进行查询
    50. this.query({});
    51. this.clear();
    52. })
    53. .catch(e => {
    54. // 处理错误
    55. });
    56. } else {
    57. console.log('error submit!!');
    58. return false;
    59. }
    60. });
    61. },
    62. clear() {
    63. // 初始化窗体
    64. this.dialogFormVisible = false;
    65. this.title = '新增窗体';
    66. // 清空表单
    67. this.book = {
    68. id: '',
    69. bookname: '',
    70. price: '',
    71. booktype: ''
    72. };
    73. },
    74. // 打开窗体的方法
    75. open(idx, row) {
    76. // 打开编辑窗口
    77. this.dialogFormVisible = true;
    78. // 初始化标题
    79. this.title = '新增窗体';
    80. if (row != null) {
    81. this.title = '编辑窗体';
    82. }
    83. // 如果有传入行数据,将其填充到表单字段中
    84. if (row) {
    85. this.book.id = row.id;
    86. this.book.bookname = row.bookname;
    87. this.book.price = row.price;
    88. this.book.booktype = row.booktype;
    89. }
    90. },
    91. query(params) {
    92. let url = this.axios.urls.BOOK_LIST;
    93. this.axios.get(url, {
    94. params: params
    95. }).then(r => {
    96. console.log(r);
    97. this.tableData = r.data.rows;
    98. this.total = r.data.total;
    99. }).catch(e => {
    100. })
    101. },
    102. onSubmit() {
    103. let params = {
    104. bookname: this.bookname
    105. }
    106. this.query(params);
    107. },
    108. handleSizeChange(r) {
    109. //当页大小发生变化
    110. console.log("当前页大小为:" + r);
    111. let params = {
    112. bookname: this.bookname,
    113. rows: r,
    114. page: this.page
    115. }
    116. this.query(params);
    117. },
    118. handleCurrentChange(p) {
    119. //当前页码发生变化
    120. console.log("当前页页码为:" + p);
    121. let params = {
    122. bookname: this.bookname,
    123. rows: this.rows,
    124. page: p
    125. }
    126. this.query(params);
    127. }
    128. },

    在created中初始化数据,如下:

    1. created() {
    2. this.query({});
    3. this.types = [{
    4. id: 1,
    5. name: "刘三金"
    6. },
    7. {
    8. id: 2,
    9. name: "小翰翰"
    10. },
    11. {
    12. id: 3,
    13. name: "老黑鬼"
    14. },
    15. {
    16. id: 4,
    17. name: "丧彪子"
    18. },
    19. {
    20. id: 5,
    21. name: "死浩子"
    22. }
    23. ];
    24. }

    增加表格操作,如下:

    1. <el-table-column label="操作">
    2. <template slot-scope="scope">
    3. <el-button size="mini" @click="open(scope.$index, scope.row)">编辑el-button>
    4. <el-button size="mini" type="danger" @click="del(scope.$index, scope.row)">删除el-button>
    5. template>
    6. el-table-column>

    最后的完整代码如下:

    1. <script>
    2. import axios from 'axios';
    3. export default {
    4. data() {
    5. return {
    6. bookname: '',
    7. tableData: [],
    8. rows: 10,
    9. page: 1,
    10. total: 0,
    11. title: '新增窗体',
    12. dialogFormVisible: false,
    13. formLabelWidth: '100px',
    14. types: [],
    15. form: {},
    16. book: {
    17. id: '',
    18. bookname: '',
    19. price: '',
    20. booktype: ''
    21. },
    22. rules: {
    23. bookname: [{
    24. required: true,
    25. message: '请输入书籍名称',
    26. trigger: 'blur'
    27. },
    28. {
    29. min: 4,
    30. max: 10,
    31. message: '长度在 4 到 10 个字符',
    32. trigger: 'blur'
    33. }
    34. ],
    35. price: [{
    36. required: true,
    37. message: '请输入书籍价格',
    38. trigger: 'blur'
    39. }],
    40. booktype: [{
    41. required: true,
    42. message: '请输入书籍类别',
    43. trigger: 'blur'
    44. }]
    45. }
    46. }
    47. },
    48. methods: {
    49. del(idx, row) {
    50. this.$confirm('此操作将永久删除id为' + row.id + '的数据, 是否继续?', '提示', {
    51. confirmButtonText: '确定',
    52. cancelButtonText: '取消',
    53. type: 'warning'
    54. }).then(() => {
    55. let url = this.axios.urls.BOOK_DEL;
    56. this.axios.post(url, {
    57. id: row.id
    58. })
    59. .then(r => {
    60. console.log(r);
    61. this.$message({
    62. type: 'success',
    63. message: '删除成功!'
    64. });
    65. this.query({});
    66. })
    67. .catch(e => {
    68. // 处理错误
    69. });
    70. }).catch(() => {
    71. this.$message({
    72. type: 'info',
    73. message: '已取消删除'
    74. });
    75. });
    76. },
    77. dosub() {
    78. this.$refs['book'].validate((valid) => {
    79. if (valid) {
    80. let url = this.axios.urls.BOOK_ADD;
    81. if (this.title == '编辑窗体') {
    82. url = this.axios.urls.BOOK_UPD;
    83. }
    84. // 构建请求参数
    85. let params = {
    86. id: this.book.id,
    87. bookname: this.book.bookname,
    88. price: this.book.price,
    89. booktype: this.book.booktype
    90. };
    91. console.log(params)
    92. console.log(url)
    93. this.axios.post(url, params)
    94. .then(r => {
    95. console.log(r);
    96. // 编辑/添加操作成功后,再进行查询
    97. this.query({});
    98. this.clear();
    99. })
    100. .catch(e => {
    101. // 处理错误
    102. });
    103. } else {
    104. console.log('error submit!!');
    105. return false;
    106. }
    107. });
    108. },
    109. clear() {
    110. // 初始化窗体
    111. this.dialogFormVisible = false;
    112. this.title = '新增窗体';
    113. // 清空表单
    114. this.book = {
    115. id: '',
    116. bookname: '',
    117. price: '',
    118. booktype: ''
    119. };
    120. },
    121. // 打开窗体的方法
    122. open(idx, row) {
    123. // 打开编辑窗口
    124. this.dialogFormVisible = true;
    125. // 初始化标题
    126. this.title = '新增窗体';
    127. if (row != null) {
    128. this.title = '编辑窗体';
    129. }
    130. // 如果有传入行数据,将其填充到表单字段中
    131. if (row) {
    132. this.book.id = row.id;
    133. this.book.bookname = row.bookname;
    134. this.book.price = row.price;
    135. this.book.booktype = row.booktype;
    136. }
    137. },
    138. query(params) {
    139. let url = this.axios.urls.BOOK_LIST;
    140. this.axios.get(url, {
    141. params: params
    142. }).then(r => {
    143. console.log(r);
    144. this.tableData = r.data.rows;
    145. this.total = r.data.total;
    146. }).catch(e => {
    147. })
    148. },
    149. onSubmit() {
    150. let params = {
    151. bookname: this.bookname
    152. }
    153. this.query(params);
    154. },
    155. handleSizeChange(r) {
    156. //当页大小发生变化
    157. console.log("当前页大小为:" + r);
    158. let params = {
    159. bookname: this.bookname,
    160. rows: r,
    161. page: this.page
    162. }
    163. this.query(params);
    164. },
    165. handleCurrentChange(p) {
    166. //当前页码发生变化
    167. console.log("当前页页码为:" + p);
    168. let params = {
    169. bookname: this.bookname,
    170. rows: this.rows,
    171. page: p
    172. }
    173. this.query(params);
    174. }
    175. },
    176. created() {
    177. this.query({});
    178. this.types = [{
    179. id: 1,
    180. name: "刘三金"
    181. },
    182. {
    183. id: 2,
    184. name: "小翰翰"
    185. },
    186. {
    187. id: 3,
    188. name: "老黑鬼"
    189. },
    190. {
    191. id: 4,
    192. name: "丧彪子"
    193. },
    194. {
    195. id: 5,
    196. name: "死浩子"
    197. }
    198. ];
    199. }
    200. }
    201. script>
    202. <style>
    203. style>

    1.2 效果演示

    新增效果演示:

    f23cc71065cb408b85857ebe527a9637.gif

    修改效果演示:

    dcf68a7478534fc5a6582e186133bf9c.gif

    删除效果演示:

    dc0d664fab9b44d6858e51cd51907866.gif

    二、表单验证

    2.1 加入表单验证指令

    :rules="rules" ref="book"

    解释: 

    • :rules 是用于表单验证的一个 Vue.js 指令。它通常用于表单元素,例如  或  组件,以定义验证规则。这些验证规则用于验证用户输入的数据是否符合预期的格式或要求。

    2.2 配置表单验证规则

    加入prop属性,如下:

    6c4a49314859470092c187d07bfe6020.png

    prop="id"

    具体来说,prop 属性用于指定要验证的表单项的属性名称。在这里,每个 对应一个表单字段(如书籍编号、书籍名称、书籍价格、书籍类别),prop 属性用于定义每个字段应该验证的属性名称。

    1. 例如,对于书籍编号,prop="id" 表示该表单项验证的是 book 对象中的 id 属性。类似地,prop="bookname" 表示验证 book 对象中的 bookname 属性,prop="price" 表示验证 book 对象中的 price 属性,而 prop="booktype" 表示验证 book 对象中的 booktype 属性。
    2. 这些 prop 属性将与 :model 属性一起使用,:model 属性指定了表单项的数据模型,即要验证的对象。同时,rules 属性通常也会提供相应的验证规则。

    在 Vue.js 和 Element UI 中,这种方式可以方便地实现表单验证,确保用户在提交表单时输入有效的数据。

    2.3 编写验证规则

    如下:

    1. rules: {
    2. bookname: [{
    3. required: true,
    4. message: '请输入书籍名称',
    5. trigger: 'blur'
    6. },
    7. {
    8. min: 4,
    9. max: 10,
    10. message: '长度在 4 到 10 个字符',
    11. trigger: 'blur'
    12. }
    13. ],
    14. price: [{
    15. required: true,
    16. message: '请输入书籍价格',
    17. trigger: 'blur'
    18. }],
    19. booktype: [{
    20. required: true,
    21. message: '请输入书籍类别',
    22. trigger: 'blur'
    23. }]
    24. }

    2.4 使用规则

    1. this.$refs['book'].validate((valid) => {
    2. if (valid) {
    3. let url = this.axios.urls.BOOK_ADD;
    4. if (this.title == '编辑窗体') {
    5. url = this.axios.urls.BOOK_UPD;
    6. }
    7. // 构建请求参数
    8. let params = {
    9. id: this.book.id,
    10. bookname: this.book.bookname,
    11. price: this.book.price,
    12. booktype: this.book.booktype
    13. };
    14. console.log(params)
    15. console.log(url)
    16. this.axios.post(url, params)
    17. .then(r => {
    18. console.log(r);
    19. // 编辑/添加操作成功后,再进行查询
    20. this.query({});
    21. this.clear();
    22. })
    23. .catch(e => {
    24. // 处理错误
    25. });
    26. } else {
    27. console.log('error submit!!');
    28. return false;
    29. }
    30. });

    2.5 效果展示

    c3fc25f83d614f72a3c7d55051a57db6.gif


    最后使用ElementUI之CUD+表单验证就到这里,祝大家在敲代码的路上一路通畅!

    感谢大家的观看 !

    4d34065529a34322a6311675d434a469.png

     

  • 相关阅读:
    vim 编辑器使用学习
    Linux进程基础(一)
    利用大数据和API优化电商决策:商品性能分析实践
    GPT4科研实践技术与AI绘图
    月报总结|Moonbeam 7月份大事一览
    Eclipse Theia技术揭秘——初识Theia
    【全网最详细】最全java面试题及答案(210道)
    赛博斗地主——使用大语言模型扮演Agent智能体玩牌类游戏。
    Laravel安装Passport,安装laravel-permission报错max key length
    洞态在某互联⽹⾦融科技企业的最佳落地实践
  • 原文地址:https://blog.csdn.net/weixin_74263417/article/details/133344819