【问题标题】:Fill vue multiselect dropdown from another component从另一个组件填充 vue 多选下拉列表
【发布时间】:2022-01-19 19:27:37
【问题描述】:

我目前正在做一个项目,需要一些帮助。

我有一个带有端点的后端,它提供一个包含大约 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>

数据银行.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.js vuejs3


    【解决方案1】:

    不是vue的问题 你使用的库可能不支持virtual-list,当数据量变大时,实际的dom元素也会变大

    您可能需要找到另一个支持虚拟列表的库,仅在可视范围内渲染 dom 或通过 virtual-library 实现自定义组件

    【讨论】:

    • 还有其他优化方法吗?我尝试使用包含 15k“Hello”的数组初始化下拉列表,效果非常好
    【解决方案2】:

    我找到了给定问题的解决方案,正如@math-chen 已经说过的那样,问题是在实际 Dom 中将解决的数据量变得非常大。您可以限制显示的条目数量,而不是使用虚拟列表,这可以通过添加轻松完成

    limit:"10"

    对于多选组件,过滤所有项目可以很容易地由javascript自己处理。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-01-27
      • 1970-01-01
      • 1970-01-01
      • 2018-02-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多