< elementUi 组件封装: 封装 el-select 组件,实现关键词(经常搜索、热点搜索)提示 >


👉 前言

在 Vue + elementUi 开发中,有时候多次重复的搜索关键词, 可能需要实现热点搜索 或者 关键词搜索等功能。但是呢,在 elementUi 中,显然没有自带这么一个组件,这时就需要我们去实现了。

👉 一、原理

利用 elementUi 中的el-select的分组,将搜索过的关键词内容,进行分组。方便下次点击。

el-select 组件文档 点击跳转

👉 二、实现案例

> HTML模板

<el-select
	v-model="form.keyValue"
	placeholder="请选择"
	class="hotSelect"
	style="margin-left: 20px;width: 100%"
	filterable
	allow-create
	:popper-append-to-body="false"
	clearable
	@change="queryDataPage"
>
	<el-option-group
		v-for="group in hotOptions"
		:key="group.label"
		:label="group.label"
	>
		<el-option
			v-for="item in group.options"
			:key="item.value"
			:label="item.label"
			:value="item.value">
			<span>{{ item.value }}</span>
		</el-option>
	</el-option-group>
</el-select>

> Js内容

// 选项变更
queryDataPage(){
	// 进行逻辑操作
},

Data: {
	hotOptions: [
		{
	   	label:'经常搜索',
	     options:[]
	   },
	   {
	     label:'热点推荐',
	     options:[]
	   },
	   {
	     label:'最近更新',
	     options:[]
	   }
   ],
}

> CSS样式

/* 覆盖elementUi 原本的组件样式 */
/deep/ {
	.el-select-group{
		padding: 0 26px;
		.el-select-dropdown__item {
			display: inline-block;
			margin: 2px 8px 2px;
			color: #686868;
			padding: 0px;
			font-size: 14px;
		}
		.el-select-dropdown__item:hover{
			border-bottom: 1px solid #2a5cb0;
		}
	}
	.el-select-group__title{
		font-size: 15px;
		color: #ff8000;
		font-weight: bold;
	}
	.el-select-dropdown ul:nth-child(2) .el-select-group__title{
		color: #006bcf;
	}
	.el-select-dropdown ul:nth-child(3) .el-select-group__title{
		color: #2dbb62;
	}
}

案例较为粗浅,仅供参考! 禁止转载

👉 三、效果演示

效果演示-1


往期内容 💨

🔥 < 在 elementUi 中,el-upload 上传组件封装 >

🔥 < 今日份知识点:web常见的攻击方式(网络攻击)有哪些?如何预防?如何防御呢 ? >

🔥 < 可视化图表技巧:实现发光(荧光)折线图 >

🔥 < 性能提升 Get √ :如何理解 “ 回流 ” 与 “ 重绘 ” ?如何合理的减少其出现呢 ? >

  • 5
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Vue3 中组件封装相比 Vue2 有了很大的改进,可以使用 Composition API 来进行组件的编写,下面是一个使用 Vue3 Composition API 封装的带有搜索功能的 el-select 组件的示例: ```vue <template> <el-select v-model="selectedValue" filterable remote :remote-method="search" :loading="isLoading" :loading-text="loadingText" :no-match-text="noMatchText" :popper-append-to-body="false" :popover-class="popoverClass" :debounce="debounce" :placeholder="placeholder" :clearable="clearable" :disabled="disabled" > <el-option v-for="item in options" :key="item.value" :label="item.label" :value="item.value" /> </el-select> </template> <script> import { reactive, toRefs } from 'vue' export default { name: 'ElSelectSearch', props: { // 下拉选项列表,格式为 [{ label: '选项1', value: 'value1' }, ...] options: { type: Array, default: () => [] }, // 是否可清空 clearable: { type: Boolean, default: false }, // 是否禁用 disabled: { type: Boolean, default: false }, // 是否显示搜索框 filterable: { type: Boolean, default: true }, // 下拉框的 class popoverClass: { type: String, default: '' }, // 搜索框 placeholder placeholder: { type: String, default: '请输入搜索内容' }, // 输入搜索内容后,触发搜索的延迟时间 debounce: { type: Number, default: 300 }, // 搜索中的 loading 文本 loadingText: { type: String, default: '加载中...' }, // 没有匹配项的文本 noMatchText: { type: String, default: '没有匹配的数据' }, // 是否正在加载中 isLoading: { type: Boolean, default: false } }, setup(props, { emit }) { const state = reactive({ selectedValue: '', searchValue: '', searchTimer: null }) // 监听选中的值变化 const handleSelectChange = (value) => { state.selectedValue = value emit('change', value) } // 监听搜索框输入的值变化 const handleSearchValueChange = (value) => { state.searchValue = value if (state.searchTimer) { clearTimeout(state.searchTimer) } state.searchTimer = setTimeout(() => { emit('search', value) }, props.debounce) } // 执行搜索的方法 const search = (query) => { emit('search', query) } // 将响应式数据转化为 ref const refs = toRefs(state) return { ...refs, handleSelectChange, handleSearchValueChange, search } } } </script> ``` 这里我们使用了 `reactive` 和 `toRefs` 来创建响应式数据,并将其转化为 ref,方便在模板中使用。同时,我们也使用了 Vue3 的两个新的钩子函数 `setup` 和 `emit`。其中,`setup` 钩子函数用来替代 Vue2 中的 `beforeCreate` 和 `created` 钩子函数,用于组件的初始化和响应式数据的创建。`emit` 函数用于向父组件派发事件。在 `setup` 函数中,我们将响应式数据和方法都返回给模板使用。 该组件支持以下 props: - `options`:下拉选项列表,格式为 `[{ label: '选项1', value: 'value1' }, ...]`。 - `clearable`:是否可清空。 - `disabled`:是否禁用。 - `filterable`:是否显示搜索框。 - `popoverClass`:下拉框的 class。 - `placeholder`:搜索框 placeholder。 - `debounce`:输入搜索内容后,触发搜索的延迟时间。 - `loadingText`:搜索中的 loading 文本。 - `noMatchText`:没有匹配项的文本。 - `isLoading`:是否正在加载中。 该组件支持以下事件: - `change`:选中的值变化时触发。 - `search`:搜索框输入内容变化或者点击下拉框时触发。 该组件中的搜索功能使用了 ElementUI 的远程搜索,可以在 `search` 方法中进行异步搜索。需要注意的是,在使用远程搜索时,需要设置 `remote` 和 `:remote-method` 属性。`remote` 表示是否使用远程搜索,`:remote-method` 表示远程搜索的方法。 同时,我们也使用了 ElementUI 的 `el-option` 组件来显示下拉选项列表,使用 `v-for` 来遍历 `options` 数组中的每一个元素,并将其显示在下拉选项列表中。`el-select` 组件的 `v-model` 双向绑定 `selectedValue` 变量,当选中的值发生变化时,会触发 `handleSelectChange` 方法。 最后,我们将响应式数据和方法都返回给模板使用,模板中可以直接使用它们来进行渲染和交互。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

技术宅小温

你小小的鼓励,是我搬砖的动力!

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

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

打赏作者

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

抵扣说明:

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

余额充值