从另一个组件填充 vue 多选下拉列表
Fill vue multiselect dropdown from another component
我目前正在做一个项目,需要一些帮助。
我有一个带有端点的后端,它提供一个包含大约 13k 条目的字符串数组。我在 DropdownSearch.vue 中创建了一个组件,它应该用于具有不同输入的多个不同视图。为此,我使用了 vueform/multiselect。如果我只尝试在没有任何信息的情况下添加下拉列表,它会完美地工作。此外,如果我访问端点和 console.log() 它将正常工作并向我提供输出。但是,如果我尝试将输出初始化为下拉菜单,整个页面将停止工作,端点不会给我响应并且应用程序会冻结。
DropdownSearch.vue
<div>
<Multiselect
class="float-left"
v-model="valueDropdownOne"
mode="tags"
:placeholder="selectorOne"
:closeOnSelect="false"
:searchable="true"
:createTag="true"
:options="dropdownOne"
:groups="true"
/>
<Multiselect
class="float-left"
v-model="valueDropdownTwo"
mode="tags"
:placeholder="selectorTwo"
:closeOnSelect="false"
:searchable="true"
:createTag="true"
:options="dropdownTwo"
/>
<Multiselect
class="float-left"
v-model="valueDropdownThree"
mode="tags"
:placeholder="selectorThree"
:closeOnSelect="false"
:searchable="true"
:createTag="true"
:options="dropdownThree"
/>
</div>
</template>
<script>
import Multiselect from "@vueform/multiselect";
import { ref }from "vue"
export default {
name: "DropdownSearch",
components: { Multiselect },
props: {
selectorOne: {
type: String,
default: "<DEFAULT VALUE>",
required: true,
},
selectorTwo: {
type: String,
default: "<DEFAULT VALUE>",
required: true,
},
selectorThree: {
type: String,
default: "<DEFAULT VALUE>",
required: true,
},
dropdownOne: {
type: Array
}
,
dropdownTwo: {
type: Array
},
dropdownThree: {
type: Array
}
},
setup() {
const valueDropdownOne = ref()
const valueDropdownTwo = ref()
const valueDropdownThree = ref()
return {valueDropdownOne, valueDropdownTwo, valueDropdownThree}
}
};
</script>
<style src="@vueform/multiselect/themes/default.css"></style>
Datenbank.vue
<template>
<div>
<DropdownSearch
selectorOne="Merkmale auswählen"
:dropdownOne="dropdownOne"
selectorTwo="Monographien auswählen"
:dropdownTwo="dropdownTwo"
selectorThree="Orte auswählen"
:dropdownThree="dropdownThree"
></DropdownSearch>
</div>
</template>
<script>
import DropdownSearch from "../components/DropdownSearch.vue";
import { ref, onMounted } from "vue";
export default {
components: { DropdownSearch },
setup() {
const dropdownOne = ref([]);
const dropdownTwo = ref([]);
const dropdownThree = ref([]);
const getPlaces = async () => {
const response = await fetch("http://127.0.0.1:5000/project/get-places");
const places = await response.json();
return places;
};
onMounted(async () => {
const places = await getPlaces();
dropdownThree.value = places;
});
return {
dropdownOne,
dropdownTwo,
dropdownThree
};
},
};
</script>
<style lang="scss" scoped></style>
不是vue的问题
你使用的库可能不支持virtual-list,当数据量变大时,实际的dom元素也会变大
您可能需要寻找另一个支持虚拟列表的库,仅在可视范围内渲染 dom 或通过 virtual-library
实现自定义组件
我找到了给定问题的解决方案,因为@math-chen 已经指出问题是在实际 Dom 变得非常大时将解决的数据量。您可以限制显示的条目数量,而不是使用虚拟列表,这可以通过添加
轻松完成
limit:"10"
对于多选组件,过滤所有项目可以由 javascript 本身轻松处理。
我目前正在做一个项目,需要一些帮助。
我有一个带有端点的后端,它提供一个包含大约 13k 条目的字符串数组。我在 DropdownSearch.vue 中创建了一个组件,它应该用于具有不同输入的多个不同视图。为此,我使用了 vueform/multiselect。如果我只尝试在没有任何信息的情况下添加下拉列表,它会完美地工作。此外,如果我访问端点和 console.log() 它将正常工作并向我提供输出。但是,如果我尝试将输出初始化为下拉菜单,整个页面将停止工作,端点不会给我响应并且应用程序会冻结。
DropdownSearch.vue
<div>
<Multiselect
class="float-left"
v-model="valueDropdownOne"
mode="tags"
:placeholder="selectorOne"
:closeOnSelect="false"
:searchable="true"
:createTag="true"
:options="dropdownOne"
:groups="true"
/>
<Multiselect
class="float-left"
v-model="valueDropdownTwo"
mode="tags"
:placeholder="selectorTwo"
:closeOnSelect="false"
:searchable="true"
:createTag="true"
:options="dropdownTwo"
/>
<Multiselect
class="float-left"
v-model="valueDropdownThree"
mode="tags"
:placeholder="selectorThree"
:closeOnSelect="false"
:searchable="true"
:createTag="true"
:options="dropdownThree"
/>
</div>
</template>
<script>
import Multiselect from "@vueform/multiselect";
import { ref }from "vue"
export default {
name: "DropdownSearch",
components: { Multiselect },
props: {
selectorOne: {
type: String,
default: "<DEFAULT VALUE>",
required: true,
},
selectorTwo: {
type: String,
default: "<DEFAULT VALUE>",
required: true,
},
selectorThree: {
type: String,
default: "<DEFAULT VALUE>",
required: true,
},
dropdownOne: {
type: Array
}
,
dropdownTwo: {
type: Array
},
dropdownThree: {
type: Array
}
},
setup() {
const valueDropdownOne = ref()
const valueDropdownTwo = ref()
const valueDropdownThree = ref()
return {valueDropdownOne, valueDropdownTwo, valueDropdownThree}
}
};
</script>
<style src="@vueform/multiselect/themes/default.css"></style>
Datenbank.vue
<template>
<div>
<DropdownSearch
selectorOne="Merkmale auswählen"
:dropdownOne="dropdownOne"
selectorTwo="Monographien auswählen"
:dropdownTwo="dropdownTwo"
selectorThree="Orte auswählen"
:dropdownThree="dropdownThree"
></DropdownSearch>
</div>
</template>
<script>
import DropdownSearch from "../components/DropdownSearch.vue";
import { ref, onMounted } from "vue";
export default {
components: { DropdownSearch },
setup() {
const dropdownOne = ref([]);
const dropdownTwo = ref([]);
const dropdownThree = ref([]);
const getPlaces = async () => {
const response = await fetch("http://127.0.0.1:5000/project/get-places");
const places = await response.json();
return places;
};
onMounted(async () => {
const places = await getPlaces();
dropdownThree.value = places;
});
return {
dropdownOne,
dropdownTwo,
dropdownThree
};
},
};
</script>
<style lang="scss" scoped></style>
不是vue的问题 你使用的库可能不支持virtual-list,当数据量变大时,实际的dom元素也会变大
您可能需要寻找另一个支持虚拟列表的库,仅在可视范围内渲染 dom 或通过 virtual-library
实现自定义组件我找到了给定问题的解决方案,因为@math-chen 已经指出问题是在实际 Dom 变得非常大时将解决的数据量。您可以限制显示的条目数量,而不是使用虚拟列表,这可以通过添加
轻松完成limit:"10"
对于多选组件,过滤所有项目可以由 javascript 本身轻松处理。