Vue+Element自定义按钮和下拉框全局样式

本文介绍了如何在VabAdminPro管理模板中,利用Vue2.x和element-ui实现按钮的hover效果定制,并展示了hover-blue、hover-red等样式的应用。通过`.scss`文件,作者详细展示了如何为不同颜色的按钮添加状态样式和hover效果。

前提

我们使用的是Vab Admin Pro管理模板,它基于Vue2.x+element-ui。在线演示地址:https://chu1204505056.gitee.io/admin-pro/?hmsr=authorization&hmpl=&hmcu=&hmkw=&hmci=#/index

我还参考了element-ui的plain属性样式

效果截图

代码

在public/static/css文件夹下新建公共样式 button.scss 文件

button.scss代码

::v-deep .hover-blue {
    color: #1890ff;
    background: #e8f4ff;
    border-color: #a3d3ff;
}

::v-deep .hover-blue:hover {
    color: #ffffff;
    background: #1890ff;
}

::v-deep .hover-blue:focus {
    color: #ffffff;
    background: #1890ff;
}

::v-deep .hover-red {
    color: #ff4d4f;
    background: #ffeded;
    border-color: #ffb8b9;
}

::v-deep .hover-red:hover {
    color: #ffffff;
    background: #ff4d4f;
}

::v-deep .hover-red:focus {
    color: #ffffff;
    background: #ff4d4f;
}

::v-deep .hover-yellow {
    color: #faa500;
    background: #fff6e6;
    border-color: #ecd19a;
}

::v-deep .hover-yellow:hover {
    color: #ffffff;
    background: #faa500;
}

::v-deep .hover-yellow:focus {
    color: #ffffff;
    background: #faa500;
}

::v-deep .hover-green {
    color: #1bc3bb;
    background: #e8f9f8;
    border-color: #7ae6e1;
}

::v-deep .hover-green:hover {
    color: #ffffff;
    background: #1bc3bb;
}

::v-deep .hover-green:focus {
    color: #ffffff;
    background: #1bc3bb;
}

::v-deep .hover-purple {
    color: #b37feb;
    background: #f7f2fd;
    border-color: #be97ec;
}

::v-deep .hover-purple:hover {
    color: #ffffff;
    background: #b37feb;
}

::v-deep .hover-purple:focus {
    color: #ffffff;
    background: #b37feb;
}

页面代码

<el-dropdown @command="addUserCommand">
  <el-button class="hover-blue">
    添加用户
    <i class="el-icon-arrow-down el-icon--right"></i>
  </el-button>
  <el-dropdown-menu slot="dropdown">
    <el-dropdown-item command="add">手动添加</el-dropdown-item>
    <el-dropdown-item command="import">从excel导入</el-dropdown-item>
  </el-dropdown-menu>
</el-dropdown>
<el-divider direction="vertical" />
<el-button class="hover-yellow" icon="el-icon-edit">
  更改角色
</el-button>
<el-divider direction="vertical" />
<el-button icon="el-icon-delete" class="hover-red">
  删除用户
</el-button>
<el-divider direction="vertical" />
<el-dropdown>
  <el-button class="hover-green">
    更多操作
    <i class="el-icon-arrow-down el-icon--right"></i>
  </el-button>
  <el-dropdown-menu slot="dropdown">
    <el-dropdown-item>嘿嘿</el-dropdown-item>
  </el-dropdown-menu>
</el-dropdown>
<el-divider direction="vertical" />
<el-dropdown>
  <el-button class="hover-purple">
    导出
    <i class="el-icon-arrow-down el-icon--right"></i>
  </el-button>
  <el-dropdown-menu slot="dropdown">
    <el-dropdown-item>导出文本(.txt)</el-dropdown-item>
    <el-dropdown-item>导出表格(.xlsx)</el-dropdown-item>
  </el-dropdown-menu>
</el-dropdown>

 在本页面引入button.scss样式

<style lang="scss" scoped>
@import 'public/static/css/button.scss';
::v-deep .el-divider--vertical {
  height: auto;
}
</style>

 

<think> 首先,用户的问题是关于Element UI的下拉框多选功能中添加确定取消按钮的方法。用户提供了两个引用,但它们似乎不直接相关: - 引用[1]: 讨论Element UI的el-cascader级联选择器,允许单独选择任意一级选项,通过设置props: { checkStrictly: true }。 - 引用[2]: 描述Element UI多选下拉时添加一个“选择所有”选项,并处理逻辑。 用户明确说这些引用仅供参考,不是真正的需求。真正的需求是:如何在Element UI下拉框多选功能中添加确定取消按钮。 我的回答需要: - 遵循系统级指令:所有数学表达式用$...$,独立公式用$$...$$,LaTeX语法正确,使用中文回答,生成相关问题。 - 参考用户上一次的问题我的回答:但这是当前对话的第一条消息,所以没有上一次的问题。用户提到“请尽可能多的参考用户上一次的问题你的回答”,但由于这是初始消息,我需要专注于当前查询。 - 回答结构清晰,帮助用户逐步解决问题,保证真实可靠。 关键点:用户想在下拉框多选中添加确定取消按钮Element UI的el-select组件支持多选,但默认没有确定取消按钮。通常,这种需求是为了在用户选择多个选项后,通过按钮确认或取消选择。 在Element UI中,原生组件没有直接提供这个功能,但可以通过自定义下拉面板来实现。 实现方法: 1. 使用el-select组件,设置multiple属性为true以启用多选。 2. 自定义下拉内容,通过slot="dropdown"或使用popper-class添加自定义类名,然后在自定义内容中添加按钮。 3. 添加按钮的逻辑:确定按钮用于关闭下拉并应用选择;取消按钮用于关闭下拉并重置选择到之前的状态。 步骤: - 设置el-select为多选:<el-select v-model="selectedValues" multiple> - 自定义下拉面板:使用slot="default"或slot="dropdown"来自定义内容。Element UI的文档提到可以使用scoped slot来定制下拉菜单。 - 在自定义下拉内容中,添加一个带有按钮的div,例如“确定”“取消”。 - 处理按钮点击事件:确定时,手动关闭下拉菜单(可以通过refs调用组件的blur方法);取消时,重置selectedValues到初始状态或之前的缓存值,然后关闭下拉。 - 需要使用ref来引用el-select组件以控制其行为。 示例代码结构: <template> <el-select v-model="selectedValues" multiple ref="selectDropdown"> <template #dropdown> <div class="custom-dropdown"> <el-checkbox-group v-model="selectedValues"> <el-checkbox v-for="option in options" :key="option.value" :label="option.value">{{ option.label }}</el-checkbox> </el-checkbox-group> <div class="action-buttons"> <el-button @click="confirmSelection">确定</el-button> <el-button @click="cancelSelection">取消</el-button> </div> </div> </template> </el-select> </template> <script> export default { data() { return { selectedValues: [], tempSelected: [], // to store temp selection for cancel options: [ /* options array */ ] }; }, methods: { confirmSelection() { // Close the dropdown this.$refs.selectDropdown.blur(); // Here, selectedValues is already updated, so no need to do extra }, cancelSelection() { // Reset to previous selection this.selectedValues = [...this.tempSelected]; // need to cache before opening // Close the dropdown this.$refs.selectDropdown.blur(); }, // Need a way to cache the selection when dropdown opens // Can use @focus event on el-select to cache tempSelected } }; </script> 在el-select上添加@focus事件来缓存当前选择: <el-select v-model="selectedValues" multiple ref="selectDropdown" @focus="cacheSelection"> methods: { cacheSelection() { this.tempSelected = [...this.selectedValues]; } } 这样就可以在取消时恢复到缓存的值。 为了样式,可能需要添加自定义CSS来控制下拉面板的布局按钮的位置。 在回答中,我需要确保真实可靠:Element UI文档中没有直接支持这个功能,但通过自定义是实现可行的。参考社区解决方案或常见实践。 现在,结构回答: 1. 引言:解释问题,确认需求。 2. 实现方法:逐步描述如何添加按钮。 3. 代码示例:提供Vue组件代码示例。 4. 注意事项:解释关键点,如缓存选择关闭下拉。 5. 生成相关问题:根据系统指令。 最后,生成相关问题: - 如何自定义Element UI下拉菜单的样式? - Element UI中多选下拉的其他高级用法? - 下拉菜单关闭的控制方法? 确保使用中文回答。 回答中引用的段落末尾添加引用标识:用户提供了引用[^1][^2],但它们似乎不直接相关,所以我可能不需要引用它们,除非有相关点。用户说“上述引用仅供参考”,所以我应该专注于回答,而不强制引用它们。但系统指令说“回答中引用的段落末尾自然地添加引用标识”,所以如果我提到任何外部来源,应添加。但在这个回答中,我可能不会引用外部,所以我不会添加引用标识。 系统指令示例中,在回答末尾有引用标识,如[^1],但我没有外部引用,所以或许不需要。 最终回答结构: - 开头简述问题。 - 逐步指导。 - 代码块。 - 相关问题。 </think> ### Element UI下拉框多选添加确定取消按钮的实现方法 在Element UI中,原生`el-select`组件在多选模式下(设置`multiple`属性)默认不提供“确定”“取消”按钮。但您可以通过自定义下拉面板(dropdown)来实现这一功能。核心思路是: 1. **使用插槽定制下拉内容**:通过`slot="default"`或`slot="dropdown"`自定义下拉面板,添加按钮区域。 2. **处理按钮逻辑**: - **确定按钮**:提交当前选择并关闭下拉菜单。 - **取消按钮**:恢复选择到打开下拉前的状态并关闭下拉菜单(需缓存初始值)。 3. **控制下拉菜单开关**:通过引用(`ref`)调用`blur()`方法关闭下拉。 以下是完整实现步骤代码示例,基于Vue.js框架Element UI组件库。 #### 实现步骤 1. **基础设置**: - 使用`el-select`启用多选(`multiple`属性)。 - 绑定`v-model`到数据变量(如`selectedValues`),存储选中的值。 2. **缓存初始值**: - 在`focus`事件中缓存当前选择值,用于取消操作时恢复。 3. **自定义下拉面板**: - 通过`slot="dropdown"`覆盖默认下拉内容。 - 添加`el-checkbox-group`显示选项列表(支持多选)。 - 添加“确定”“取消”按钮,并绑定点击事件。 4. **按钮逻辑处理**: - **确定**:直接关闭下拉(`this.$refs.selectDropdown.blur()`)。 - **取消**:重置选择为缓存值,再关闭下拉。 5. **样式优化**: - 使用`popper-class`添加自定义类名,调整下拉面板样式(例如按钮位置)。 #### 完整代码示例 ```vue <template> <div> <el-select v-model="selectedValues" multiple placeholder="请选择" ref="selectDropdown" popper-class="custom-select-dropdown" @focus="cacheInitialSelection" // 缓存初始值 > <!-- 自定义下拉面板 --> <template #dropdown> <div class="custom-dropdown-content"> <!-- 选项列表 --> <el-checkbox-group v-model="selectedValues"> <el-checkbox v-for="item in options" :key="item.value" :label="item.value" > {{ item.label }} </el-checkbox> </el-checkbox-group> <!-- 按钮区域 --> <div class="action-buttons"> <el-button type="primary" size="small" @click="confirmSelection">确定</el-button> <el-button size="small" @click="cancelSelection">取消</el-button> </div> </div> </template> </el-select> </div> </template> <script> export default { data() { return { selectedValues: [], // 当前选中的值 tempSelected: [], // 缓存的下拉打开前的选择值 options: [ // 示例选项数据 { value: 'option1', label: '选项1' }, { value: 'option2', label: '选项2' }, { value: 'option3', label: '选项3' }, ], }; }, methods: { // 缓存初始选择值(当下拉打开时触发) cacheInitialSelection() { this.tempSelected = [...this.selectedValues]; // 深拷贝以避免引用问题 }, // 确定按钮逻辑:关闭下拉 confirmSelection() { this.$refs.selectDropdown.blur(); // 调用组件方法关闭下拉 }, // 取消按钮逻辑:恢复缓存值并关闭下拉 cancelSelection() { this.selectedValues = [...this.tempSelected]; // 还原到初始状态 this.$refs.selectDropdown.blur(); // 关闭下拉 }, }, }; </script> <style scoped> /* 自定义下拉面板样式 */ .custom-dropdown-content { padding: 10px; } .action-buttons { margin-top: 10px; text-align: right; /* 按钮右对齐 */ } </style> ``` #### 关键说明 - **缓存机制**:使用`@focus`事件`tempSelected`变量保存下拉打开前的选择状态,确保取消操作时能正确回滚。 - **下拉关闭**:`this.$refs.selectDropdown.blur()`是Element UI内置方法,用于关闭下拉菜单。 - **样式调整**: - 通过`popper-class="custom-select-dropdown"`添加自定义类名,可在全局CSS中覆盖默认样式(例如设置下拉宽度)。 - 按钮区域使用`text-align: right`确保按钮靠右对齐。 - **兼容性**:此方法适用于Element UI 2.x版本。如果使用Vue 3Element Plus,逻辑类似,但插槽语法可能需调整为`v-slot:dropdown`[^1]。 #### 注意事项 - **性能优化**:如果选项数量大,建议使用虚拟滚动(如`el-select-v2`)避免渲染卡顿。 - **用户体验**:添加按钮后,下拉面板高度可能增加,可在`.custom-dropdown-content`中设置`max-height``overflow-y: auto`。 - **测试场景**:在取消操作后,检查`selectedValues`是否成功还原;确保按钮点击不触发外部事件[^2]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

写bug断了电

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值