vue + iview + select + 本地搜索或远程搜索

本文将介绍如何使用Vue.js和IView组件库,配合Select组件实现高效的本地数据搜索以及如何集成远程搜索功能,为用户提供便捷的数据筛选体验。

案例 

<template>
	<div>
		<!--1、 远程搜索 -->
		<!-- filterable、remote、remote-method、loading、label-in-value-->
		<Select
			v-model="searchData.styleId"
			filterable
			clearable
			remote
			:remote-method="remoteMethod"
			:loading="loading"
			label-in-value
			@on-change="hanleStyleChange"
			placeholder="请输入或选择"
            ref="setStyle"
		>
			<!-- 注意绑定的label和value -->
			<Option v-for="(item, index) in dropList.StyleList" :value="item.Id" :key="index" :label="item.Name">{{ item.Name }}</Option>
		</Select>


		<!--2、 本地搜索:先选仓库,再选库位,联动 -->
		<p>仓库</p>
		<Select v-model="searchData.wareHouseId" filterable clearable @on-change="hanleHouseChange" @on-clear="handleHouseClear" ref="setHouseQuery">
			<Option v-for="item in dropList.WareHouseList" :value="item.Id" :key="item.Id" :label="item.Name"/>
		</Select>
		<p>库位</p>
		<Select v-model="searchData.wareShelfId" filterable clearable @on-clear="handleShelfClear" ref="setShelfQuery">
			<Option v-for="item in dropList.WareShelfList" :value="item.Id" :key="item.Id" :label="item.Name"/>
		</Select>

		<p @click="edit">弹窗编辑仓库库位时</p>
</template>
<script>
	export default {
		name: 'initialTest',
		data(){
			return{

				loading: false,
				searchData: {
					styleId: '',

					wareHouseId: '',
					wareShelfId: '',
				},
				dropList: {
					StyleList: [],

					WareHouseList: [],
					WareShelfList: []
				},
				afterData: [],

				formAdd: {
					WareHouseId: '',
					WareHouseName: '',
					WareShelfId: '',
					WareShelfName: '',
				},
			}
		},
		activated() {
			this.getDropHouse();
		},
		methods: {
			remoteMethod (query) {
				if (query !== '') {
					this.loading = true;
					this.getDropStyle(query);
                                 } else {
					this.dropList.StyleList = [];
				}
			},
			//远程获取款式数据
			getDropStyle (query) {
				//当query != ''  时请求获取数据
				let afterData =  [
					{
						"Id":"3db8b88b-ba44-4553-801e-3a2ebcbef4b7",
						"StyleName":"款名111",
						"StyleNumber":"款号111"
					},
					{
						"Id":"929f4880-68ed-4803-8811-3eda092d594c",
						"StyleName":"款名110",
						"StyleNumber":"款号110"
					},
					{
						"Id":"ae36eda5-bc94-4d8a-893a-4623d0d9965a",
						"StyleName":"款名113",
						"StyleNumber":"款号113"
					},
					{
						"Id":"d89b636e-46a5-45f3-b0fb-a5eb77230ad8",
						"StyleName":"测试款",
						"StyleNumber":"123"
					}
				];
                        this.loading = false;
                        if (afterData && afterData.length > 0) {
                                _.each(afterData , item => {
				        if (item.StyleName) {
					        this.$set(item, 'Name', item.StyleName);
				        }
			        })
				 this.afterData = afterData;
                        } else {
                            this.$refs.setStyle.$data.query = '';
                            this.afterData = []
                        }
				
			},
			//选中option款式中的选项返回的label和value值
			hanleStyleChange (value) {
				console.log('vaule------>>', value); 
				//打印出的value : {
				// 						label:"款名110"
				// 						value:"929f4880-68ed-4803-8811-3eda092d594c"
				//				  }
			},



			//获取仓库下拉数据
			getDropHouse (){
				this.dropList.WareHouseList = [
					{
						"Id":"bc7669b0-d502-4683-8599-9543a6b78015",
						"Name":"华中仓",
						"WareShelfList":null
					},
					{
						"Id":"859aad02-6228-435d-ae67-fe810bc434aa",
						"Name":"华南仓",
						"WareShelfList":[
							{
								"Id":"6bafbcb4-6ae7-4fce-849c-8ede4a06303e",
								"Name":"华南小库位"
							}
						]
					}
				]
			},
			//选中仓库option中的选项返回的value值: 默认会读取 slot,无 slot 时,优先读取该 label 值,无 label 时,读取 value。
			hanleHouseChange (value) {
				this.dropList.WareShelfList = [];
				let choiceValue = value;
				if (this.searchData.wareHouseId) { //value进行的双向绑定:获取到仓库id后,循环匹配到库位下拉数组
					_.each( this.dropList.WareHouseList, item => {
						if (choiceValue == item.Id) {
							this.dropList.WareShelfList = item.WareShelfList;
							return false						
						}
					});
				} else {
					this.$refs.setHouseQuery.$data.query = ''; 
					this.$refs.setShelfQuery.$data.query = '';
					return false
				}
			},
			handleHouseClear () {
				this.searchData.wareHouseId = '';
				this.$refs.setHouseQuery.$data.query = ''; //清除下拉选中的项
				this.handleShelfClear ()
			},
			handleShelfClear () {
				this.searchData.wareShelfId = '';
				this.$refs.setShelfQuery.$data.query = '';
			},

			edit () {
				// 请求获取到仓库、库位数据
				let resData = res.data;
				if (resData) {
					//注意: 先对仓库数据赋值,nextTick执行仓库库位数据赋值
					this.formAdd['WareHouseId'] = resData.WareHouseId; 
					this.$nextTick( () =>{
						this.formAdd = resData;
					})
				}
			}
			
		}
	}
</script>

 

Vue.js 项目中,实现即用型搜索功能通常可以通过以下几种方式来完成,包括使用成熟的 UI 组件库、自定义组件集成第三方库。 ### 使用 iView UI 的 `Input` 与 `Select` 组件 iView 是一个基于 Vue.js 的高质量 UI 组件库,它提供了丰富的组件,其中包括适用于搜索功能的 `Input` 和 `Select` 组件。通过 `Input` 组件可以实现基本的文本搜索,而 `Select` 组件支持带自动补全的搜索功能,适用于数据筛选场景。 ```vue <template> <div> <Input v-model="searchQuery" placeholder="请输入搜索内容" /> <Select v-model="selectedOption" filterable> <Option v-for="item in filteredOptions" :value="item.value" :key="item.value">{{ item.label }}</Option> </Select> </div> </template> <script> export default { data() { return { searchQuery: '', selectedOption: '', options: [ { value: 'vue', label: 'Vue.js' }, { value: 'react', label: 'React' }, { value: 'angular', label: 'Angular' } ] }; }, computed: { filteredOptions() { return this.options.filter(option => option.label.toLowerCase().includes(this.searchQuery.toLowerCase()) ); } } }; </script> ``` ### 使用 Vue 3 组件库开发模板中的搜索功能 如果项目基于 Vue 3,并希望使用现代化的开发工具链,可以考虑使用内置了 `markdownlint`, `eslint`, `prettier`, `stylelint`, `husky`, `prettier-eslint`, `vue-tsc` 等插件的模板。这些工具可以帮助开发者确保代码质量与格式一致性,同时提高开发效率。对于搜索功能,可以结合这些工具构建自定义的可复用组件,确保组件在不同项目中的兼容性和可维护性[^4]。 ### 使用第三方搜索组件库(如 `vue-search-select`) 除了使用 UI 组件库外,还可以直接引入专门用于搜索功能的第三方组件库,例如 `vue-search-select`,它提供了更加灵活和可定制的搜索组件。通过这种方式,开发者可以快速实现高级搜索功能,例如远程搜索、多选搜索等。 ```bash npm install vue-search-select ``` ```vue <template> <div> <vue-search-select v-model="selected" :options="options" :filter-method="filterOptions" /> </div> </template> <script> import VueSearchSelect from 'vue-search-select'; export default { components: { VueSearchSelect }, data() { return { selected: '', options: ['Vue.js', 'React', 'Angular'] }; }, methods: { filterOptions(query) { return this.options.filter(option => option.toLowerCase().includes(query.toLowerCase()) ); } } }; </script> ``` ### 渐进式集成到现有项目中 对于希望将 Vue.js 集成到现有项目中的情况,可以直接通过 `<script>` 标签引入 Vue,然后使用 Vue 的核心功能实现搜索组件。这种方式特别适合于逐步迁移旧项目到 Vue,同时可以立即利用 Vue 提供的数据绑定和组件化特性[^2]。 ---
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值