Vue3+Vite+TypeScript+Element Plus开发-21.客制按钮组件

 系列文档目录

Vue3+Vite+TypeScript安装

Element Plus安装与配置

主页设计与router配置

静态菜单设计

Pinia引入

Header响应式菜单缩展

Mockjs引用与Axios封装

登录设计

登录成功跳转主页

多用户动态加载菜单

Pinia持久化

动态路由 -动态增加路由

动态路由-动态删除路由 

路由守卫-无路由跳转404

 路由守卫-未登录跳转登录界面

 登录退出

Tags-组件构建

Tags-与菜单联动 

Pinia持久化优化

按钮权限

客制按钮组件

客制Table组件

客制Form组件

国际化

配置文件


文章目录

目录

 系列文档目录

文章目录

 前言

子组件-按钮组件构建

父组件-权限界面构建

演示效果

后续

 代码下载

 


 前言

        上一章节讲解按钮权限构建,本章节把按钮构建一个组件并用权限管控。


子组件-按钮组件构建

创建   components/ActionBtnHdrCont.vue   文件 

<template>
  <div class="action-button-group">
    <el-button :icon="Search" circle />

    <el-button
      type="primary" 
      :icon="Plus" 
      circle 
      v-if="showAdd"      
      :disabled="disabledAdd"
      @click="handleAdd"
    />
    <el-button
      v-if="showEdit"
      type="primary" 
      :icon="Edit" 
      circle 
  
      :disabled="disabledEdit"
      @click="handleEdit"
    />
    <el-button
      v-if="showDelete"
      type="danger" 
      :icon="Delete"
      circle    
      :disabled="disabledDelete"
      @click="handleDelete"
    />
  </div>
</template>

<script  lang="ts"  setup>
import { defineProps, defineEmits } from "vue";
import {
    Plus,
  Check,
  Delete,
  Edit,
  Message,
  Search,
  Star,
} from '@element-plus/icons-vue' 


const props = defineProps({
  // 是否显示新增按钮
  showAdd: {
    type: Boolean,
    default: false,
  },
  // 是否显示修改按钮
  showEdit: {
    type: Boolean,
    default: false,
  },
  // 是否显示删除按钮
  showDelete: {
    type: Boolean,
    default: false,
  },
  // 新增按钮是否禁用
  disabledAdd: {
    type: Boolean,
    default: false,
  },
  // 修改按钮是否禁用
  disabledEdit: {
    type: Boolean,
    default: false,
  },
  // 删除按钮是否禁用
  disabledDelete: {
    type: Boolean,
    default: true,
  },
});

const emit = defineEmits(["add", "edit", "delete"]);

const handleAdd = () => {
  emit("add");
};

const handleEdit = () => {
  emit("edit");
};

const handleDelete = () => {
  emit("delete");
};
</script>

<style scoped>
.action-button-group {
  display: flex;
  gap: 0px;
}
</style>

父组件与子组件之间是一种嵌套关系,它们通过特定的机制进行数据传递和交互,以下是具体介绍:

数据传递•

        父组件向子组件传递数据• 通过 props• 子组件通过   props   选项声明它期望从父组件接收的数据。例如,子组件   ActionBtnHdrCont.vue   中:

const props = defineProps({
  // 是否显示新增按钮
  showAdd: {
    type: Boolean,
    default: false,
  },
  // 是否显示修改按钮
  showEdit: {
    type: Boolean,
    default: false,
  },
  // 是否显示删除按钮
  showDelete: {
    type: Boolean,
    default: false,
  },
  // 新增按钮是否禁用
  disabledAdd: {
    type: Boolean,
    default: false,
  },
  // 修改按钮是否禁用
  disabledEdit: {
    type: Boolean,
    default: false,
  },
  // 删除按钮是否禁用
  disabledDelete: {
    type: Boolean,
    default: true,
  },
});

• 父组件在使用子组件时,通过绑定属性的方式传递数据:

<ActionButtonGroup
        :show-add="hasPermission('demo2:create')"  
        :show-delete="true"
        :disabled-add="false"
        :disabled-edit="false"
  
        @add="handleAdd"
        @edit="handleEdit"
        @delete="handleDelete"
      />

父组件-权限界面构建

新建文件:  views/demos/permissionsInfoTwo.vue

 重点说明:

1. 权限控制: 新增使用   hasPermission('demo2:create')   权限控制,与上一章节配套使用。

2. 组件按钮: 如果不需要定义组件按钮,可以不定义,例如:  show-edit   未定义。

3. 外部按钮:   Upload   为独立按钮组件,可根据项目需求进一步定制。

4. 事件处理:   handleAdd   为父组件的事件处理函数

<template>
  <div>
    <div>权限演示-2</div>
    <div v-if="hasPermission('demo1:view')">demo1:view</div>
    <div v-if="hasPermission('demo2:view')">demo2:view</div>
     
    <div class="button-group-container">
      <ActionButtonGroup
        :show-add="hasPermission('demo2:create')"  
        :show-delete="true"
        :disabled-add="false"
        :disabled-edit="false"
  
        @add="handleAdd"
        @edit="handleEdit"
        @delete="handleDelete"
      />
      <el-button type="warning" :icon="Upload" circle />
      <el-button type="info" :icon="Message" circle />
       
    </div>
  </div>
</template>

<script lang="ts" setup>
import ActionButtonGroup from "@/components/ActionBtnHdrCont.vue";
import { usePermission } from "@/utils/permissionUtils";
import {
  Plus,
  Check,
  Delete,
  Edit,
  Message,
  Search,
  Star,
  Upload,
} from '@element-plus/icons-vue'

const hasPermission = usePermission();
const showAdd = hasPermission('add');
console.log(showAdd);

const handleAdd = () => {
  alert("新增按钮被点击了!");
};

const handleEdit = () => {
  alert("修改按钮被点击了!");
};

const handleDelete = () => {
  alert("删除按钮被点击了!");
};
</script>

<style scoped>
.button-group-container {
  display: flex;
  align-items: center; /* 垂直居中对齐 */
  gap: 5px; /* 按钮之间的间距 */
}
</style>

演示效果

组件按钮显示与禁用的运行效果:

显示状态: 按钮正常显示,用户可点击操作。

禁用状态: 按钮显示为灰色,不可点击,提示用户该操作不可用。

 新增按钮事件演示:展示按钮点击事件的运行效果,通过绑定事件处理函数,实现特定功能的触发与反馈。


后续

本章节主要介绍按钮组件构建与使用,下一章节将讨论客制Table组件。


 代码下载

GitCode - 全球开发者的开源社区,开源代码托管平台GitCode是面向全球开发者的开源社区,包括原创博客,开源代码托管,代码协作,项目管理等。与开发者社区互动,提升您的研发效率和质量。https://gitcode.com/sen_shan/ssVue3Demo.git

 ss.vue3.demo: 本项目以 Vue3、Vite、TypeScript、Element Plus 为核心框架,结合 Vue Router、Element Plus Icons、Less、Axios、Pinia、Mock 等技术,初始的构建登录,主界面,权限控制,按钮组件,table组件,form组件等小模型,可以随意搭建web管理系统https://gitee.com/sen_shan/ssVue3Demo.git

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值