自研国产零依赖前端UI框架实战007 封装编辑和删除相关的功能组件 ...

打印 上一主题 下一主题

主题 790|帖子 790|积分 2370

媒介

前面我们已经实现了一个表格, 能够展示用户的信息, 一个分页能够执行分页获取用户信息.
到目前为止, 数据的渲染, 我们基本就做的差不多了, 接下来我们来扩展一下表格, 让其支持添加按钮, 我们在内里添加编辑按钮和删除按钮.
表格样式调整

我调整了一下表格的样式, 增加了操作列, 目前看起来是如许的:

代码内里增加了操作这一列:

操作这一列可以根据一个叫做operator的属性进行控制, 默认是true, 如果改成false, 则不表现操作列.
稍微调整一下删除按钮的样式


暴露按钮点击方法

起首是在组件中添加要暴露的方法:
  1. const emit = defineEmits(['edit', 'delete']);
  2. const onEdit = (index, item) => emit('edit', index, item) // 编辑
  3. const onDelete = (index, item) => emit('delete', index, item) // 删除
复制代码
接着给按钮绑定:
  1. <button @click.stop="onEdit(k, v)">编辑</button>
  2. <button class="delete" @click.stop="onDelete(k,v)">删除</button>
复制代码
在App.vue中监听编辑和删除这两个事件:
  1. <zdp_table1
  2.         :columns="columns"
  3.         :data="data"
  4.         @edit="onEdit"
  5.         @delete="onDelete"
  6.     />
复制代码
再简单的实现事件的监听:
  1. const onEdit = (index, item) => {
  2.   console.log("编辑", index, item)
  3. }
  4. const onDelete = (index, item) => {
  5.   console.log("删除", index, item)
  6. }
复制代码
此时, 当我们点击编辑按钮的删除按钮的时间, 控制台会输出对应的内容.

此时页面结果如下:

App.vue的完备代码如下:
  1. <script setup>import zdp_table1 from "./zdpui/components/zdp_table1.vue";import zdp_page1 from "./zdpui/components/zdp_page1.vue";import random from "./zdpui/js/random.js";import {ref} from "vue";const columns = [  {    title: "员工编号",    key: "id",    width: 80,    align: "center"  },  {    title: "姓名",    key: "name",    width: 100,    align: "center"  },  {    title: "年龄",    key: "age",    width: 100,    align: "center"  }]const page = ref(1);const size = ref(10);const total = ref(100);const data = ref(random.users(size.value))const onChangePage = (v) => {  page.value = v  const newData = random.getPageUser(      page.value,      size.value,  )  data.value = newData.data  total.value = total.value}const onEdit = (index, item) => {
  2.   console.log("编辑", index, item)
  3. }
  4. const onDelete = (index, item) => {
  5.   console.log("删除", index, item)
  6. }
  7. </script><template>  <div>    <zdp_table1
  8.         :columns="columns"
  9.         :data="data"
  10.         @edit="onEdit"
  11.         @delete="onDelete"
  12.     />
  13.     <zdp_page1        :page="page"        :size="size"        :total="total"        @change="onChangePage"    />  </div></template>
复制代码
删除确认

当我们点击删除的时间, 盼望能够弹出一个确认删除的对话框, 好比像下面如许.

这个我已经封装好了, 比想象中要简单的多, 完备代码如下:
  1. <script setup>
  2. import {defineEmits, defineProps} from 'vue';
  3. const props = defineProps({
  4.   show: {
  5.     type: Boolean,
  6.     default: false
  7.   },
  8.   title: {
  9.     type: String,
  10.     default: '确认删除'
  11.   },
  12.   content: {
  13.     type: String,
  14.     default: '你确定要删除该项目吗?此操作不可逆。'
  15.   },
  16.   ok: {
  17.     type: String,
  18.     default: '确认'
  19.   },
  20.   cancel: {
  21.     type: String,
  22.     default: '取消'
  23.   }
  24. });
  25. const emit = defineEmits(['confirm', 'close']);
  26. const onClose = () => emit('close')
  27. const onConfirm = () => emit('confirm')
  28. </script>
  29. <template>
  30.   <div class="confirm-delete-dialog" v-if="props.show">
  31.     <div class="dialog-overlay" @click.self="onClose"></div>
  32.     <div class="dialog-content">
  33.       <h2>{{ props.title }}</h2>
  34.       <p>{{ props.content }}</p>
  35.       <div class="dialog-buttons">
  36.         <button @click="onConfirm">{{ props.ok }}</button>
  37.         <button @click="onClose">{{ props.cancel }}</button>
  38.       </div>
  39.     </div>
  40.   </div>
  41. </template>
  42. <style scoped>
  43. .confirm-delete-dialog {
  44.   position: fixed;
  45.   top: 0;
  46.   left: 0;
  47.   width: 100%;
  48.   height: 100%;
  49.   display: flex;
  50.   justify-content: center;
  51.   align-items: center;
  52.   z-index: 1000;
  53. }
  54. .dialog-overlay {
  55.   position: absolute;
  56.   top: 0;
  57.   left: 0;
  58.   width: 100%;
  59.   height: 100%;
  60.   background-color: rgba(0, 0, 0, 0.5);
  61. }
  62. .dialog-content {
  63.   background-color: #fff;
  64.   padding: 20px;
  65.   border-radius: 10px;
  66.   box-shadow: 0 0 20px rgba(0, 0, 0, 0.3);
  67.   z-index: 1001;
  68.   text-align: center;
  69. }
  70. .dialog-content h2 {
  71.   margin-top: 0;
  72.   color: #009FFF;
  73. }
  74. .dialog-content p {
  75.   margin-bottom: 20px;
  76. }
  77. .dialog-buttons button {
  78.   padding: 10px 20px;
  79.   margin: 0 10px;
  80.   border: none;
  81.   border-radius: 5px;
  82.   cursor: pointer;
  83.   font-weight: bold;
  84.   color: white;
  85.   transition: all 0.3s ease-in-out;
  86. }
  87. .dialog-buttons button:first-child {
  88.   background: linear-gradient(45deg, #C70039, #FF5733);
  89.   box-shadow: 0 5px 10px rgba(199, 0, 57, 0.4);
  90. }
  91. .dialog-buttons button:first-child:hover {
  92.   transform: translateY(-3px);
  93.   box-shadow: 0 8px 15px rgba(199, 0, 57, 0.6);
  94.   background: linear-gradient(45deg, #FF5733, #FF8C00);
  95. }
  96. .dialog-buttons button:first-child:active {
  97.   transform: translateY(1px);
  98.   box-shadow: 0 3px 8px rgba(199, 0, 57, 0.8);
  99.   background: linear-gradient(45deg, #900C3F, #C70039);
  100. }
  101. .dialog-buttons button:last-child {
  102.   background: linear-gradient(45deg, #009FFF, #0066CC);
  103.   box-shadow: 0 5px 10px rgba(0, 159, 255, 0.4);
  104. }
  105. .dialog-buttons button:last-child:hover {
  106.   transform: translateY(-3px);
  107.   box-shadow: 0 8px 15px rgba(0, 159, 255, 0.6);
  108.   background: linear-gradient(45deg, #00BFFF, #0088EE);
  109. }
  110. .dialog-buttons button:last-child:active {
  111.   transform: translateY(1px);
  112.   box-shadow: 0 3px 10px rgba(0, 159, 255, 0.8);
  113.   background: linear-gradient(45deg, #0077DD, #0055AA);
  114. }
  115. </style>
复制代码
在App.vue中的利用代码如下:

编辑弹窗

结果预览:

此时App.vue代码如下:
  1. <script setup>import zdp_table1 from "./zdpui/components/zdp_table1.vue";import zdp_page1 from "./zdpui/components/zdp_page1.vue";import random from "./zdpui/js/random.js";import {ref} from "vue";import zdp_confirm1 from "./zdpui/components/zdp_confirm1.vue";import zdp_modal1 from "./zdpui/components/zdp_modal1.vue";import Zdp_input1 from "./zdpui/components/zdp_input1.vue";const columns = [  {    title: "员工编号",    key: "id",    width: 80,    align: "center"  },  {    title: "姓名",    key: "name",    width: 100,    align: "center"  },  {    title: "年龄",    key: "age",    width: 100,    align: "center"  }]const page = ref(1);const size = ref(10);const total = ref(100);const data = ref(random.users(size.value))const onChangePage = (v) => {  page.value = v  const newData = random.getPageUser(      page.value,      size.value,  )  data.value = newData.data  total.value = total.value}const onEdit = (index, item) => {  console.log("编辑", index, item)  showEditDialog.value = true;}const onDelete = (index, item) => {  console.log("删除", index, item)  showDeleteDialog.value = true;}const showDeleteDialog = ref(false);const onConfirmDelete = () => {  console.log("确认删除");  showDeleteDialog.value = false;};const onCloseDeleteDialog = () => {  console.log("取消删除");  showDeleteDialog.value = false;};const showEditDialog = ref(false);const formData = ref({name: "张三", age: 23});const handleEditConfirm = (userData) => {  console.log('确认编辑操作,用户数据:', userData);  // 在这里添加编辑逻辑,如发送编辑请求等};const handleCloseDialog = () => {  showEditDialog.value = false;};</script><template>  <div>    <zdp_table1
  2.         :columns="columns"
  3.         :data="data"
  4.         @edit="onEdit"
  5.         @delete="onDelete"
  6.     />
  7.     <zdp_page1        :page="page"        :size="size"        :total="total"        @change="onChangePage"    />    <zdp_confirm1        :show="showDeleteDialog"        @confirm="onConfirmDelete"        @close="onCloseDeleteDialog"    />    <zdp_modal1        :show="showEditDialog"        @confirm="handleEditConfirm"        @close="handleCloseDialog"    >      <zdp_input1          label="姓名"          v-model="formData.name"          placeholder="请输入姓名"      />      <zdp_input1          label="年龄"          v-model="formData.age"          placeholder="请输入年龄"      />    </zdp_modal1>  </div></template>
复制代码
继续封装按钮

到这一步的时间, 发现按钮有很多地方都是一样的, 重复的, 以是决定对按钮进行封装.
按钮组件的内容如下:
  1. <script setup>
  2. import {defineProps, defineEmits} from 'vue';
  3. const props = defineProps({
  4.   text: {
  5.     type: String,
  6.     default: '按钮',
  7.   },
  8.   type: {
  9.     type: String,
  10.     // primary,danger
  11.     default: 'primary',
  12.   }
  13. })
  14. const emits = defineEmits(['click'])
  15. </script>
  16. <template>
  17.   <button
  18.       @click="emits('click')"
  19.       :class="props.type"
  20.   >
  21.     {{ props.text }}
  22.   </button>
  23. </template>
  24. <style scoped>
  25. button {
  26.   padding: 10px 20px;
  27.   margin: 0 10px;
  28.   border: none;
  29.   border-radius: 5px;
  30.   cursor: pointer;
  31.   font-weight: bold;
  32.   color: white;
  33.   transition: all 0.3s ease-in-out;
  34. }
  35. button.danger {
  36.   background: linear-gradient(45deg, #C70039, #FF5733);
  37.   box-shadow: 0 5px 10px rgba(199, 0, 57, 0.4);
  38. }
  39. button.danger:hover {
  40.   transform: translateY(-3px);
  41.   box-shadow: 0 8px 15px rgba(199, 0, 57, 0.6);
  42.   background: linear-gradient(45deg, #FF5733, #FF8C00);
  43. }
  44. button.danger:active {
  45.   transform: translateY(1px);
  46.   box-shadow: 0 3px 8px rgba(199, 0, 57, 0.8);
  47.   background: linear-gradient(45deg, #900C3F, #C70039);
  48. }
  49. button.primary {
  50.   background: linear-gradient(45deg, #009FFF, #0066CC);
  51.   box-shadow: 0 5px 10px rgba(0, 159, 255, 0.4);
  52. }
  53. button.primary:hover {
  54.   transform: translateY(-3px);
  55.   box-shadow: 0 8px 15px rgba(0, 159, 255, 0.6);
  56.   background: linear-gradient(45deg, #00BFFF, #0088EE);
  57. }
  58. button.primary:active {
  59.   transform: translateY(1px);
  60.   box-shadow: 0 3px 10px rgba(0, 159, 255, 0.8);
  61.   background: linear-gradient(45deg, #0077DD, #0055AA);
  62. }
  63. </style>
复制代码
利用方法如下:
  1. <zdp_button1/>
  2. <zdp_button1 type="danger"/>
复制代码
在界面中的表现结果如下:
外链图片转存失败,源站大概有防盗链机制,建议将图片保存下来直接上传
总结

现在, 我们已经有了自己的按钮组件, 确认框组件, 编辑表单组件, 组件越来越多了.
不外这个时间, 组件之间的拆分, 组合也变得越来越复杂了, 好比这个编辑表单组件, 就因为有输入框组件, 按钮组件, 确认框组件等多个组件的组合, 显得很复杂, 样式调整稍微贫苦了一点点.
不外一切都还比较顺利!!!
继续做吧!!!

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

温锦文欧普厨电及净水器总代理

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表