我在vue中的datalist存在性能问题.js和谷歌Chrome(最新版本:83.0.4103.97).

firefox :https://streamable.com/vj4rbb

chromium :https://streamable.com/2sikq5

组件代码:

<b-input-group size="sm" v-if="menuEditState">
  <b-form-input
    :list="`mealDish${meal.id}`"
    :id="`input${meal.id}`"
    placeholder="Selectionner un plat"
    v-model="name"
    :class="{'is-invalid': $v.name.$anyError}"
  />
  <datalist :id="`mealDish${meal.id}`">
    <option v-for="dish in activeDishesByType" :value="`${dish.name} (${dish.humanType})`" :data-value="dish.id"></option>
  </datalist>
  
  <b-input-group-append>
    <b-button variant="primary" @click="onClick" :disabled="loading">
      <i :class="loading ? 'fa fa-spin fa-circle-notch' : 'fa fa-plus'" />
    </b-button>
  </b-input-group-append>
</b-input-group>

还有 playbook

  computed: {
...mapGetters({
  activeDishesByType: 'activeDishesByType',
}),

getter基于getter中的Vuex状态排序(如果使用状态而不使用getter排序,则具有相同的行为).

我知道chrome开发工具中有一个性能监视器,我试图找到一些可以帮助我解决这个问题的东西,但我不知道在哪里搜索所有这些信息.

谢谢你的帮助.

罗曼.

推荐答案

好了,我终于找到了导致Chrome出现如此多性能问题的元素.

数据列表上不再有"值":

 <b-input-group size="sm">
  <b-form-input
    :list="`mealDish${meal.id}`"
    :id="`input${meal.id}`"
    placeholder="Selectionner un plat"
    v-model="name"
  />
  <datalist :id="`mealDish${meal.id}`">
    <option v-for="dish in activeDishesByType" :data-value="dish.id">{{
      `${dish.name} (${dish.humanType})`
    }}</option>
  </datalist>
  
  <b-input-group-append>
    <b-button variant="primary" @click="onClick" :disabled="loading">
      <i :class="loading ? 'fa fa-spin fa-circle-notch' : 'fa fa-plus'" />
    </b-button>
  </b-input-group-append>
</b-input-group>

以及在数据列表选项中搜索以返回我的数据值:

  // Get the selected/typed value
  const shownVal = document.getElementById(`input${this.meal.id}`).value;
  const datalist = document.querySelector(`#mealDish${this.meal.id}`);
  // Find the option in the list and get the data-value (id)
  let dishId = null;
  for (var i = 0; i < datalist.options.length; i++) {
    if (datalist.options[i].text === shownVal) {
      dishId = datalist.options[i].dataset.value;
      break;
    }
  }

Vue.js相关问答推荐

将事件监听器绑定到动态元素

我可以将Created()中内置的内容传递给Provide属性吗?

使用内部方法创建计算(computed)属性是否合法?

如果找不到路由,Vue.js如何重定向到公共路由

混合使用 React 和 Vue 是个好主意吗?

动态插入字符串上的 Vue 事件处理程序不起作用

确保在渲染组件之前加载 Vuex 状态

使用 vue-cli 遇到无法推断解析器错误

Vue 两种方式的 prop 绑定

W3C 验证和 Vue 的 HTML 绑定语法

即使在客户端设置 Access-Control-Allow-Origin 或其他 Access-Control-Allow-* 标头后也出现 CORS 错误

Amazon EC2 错误:监听 EACCES 0.0.0.0:80

Vue更改宽度和内容

vuejs挂载生命周期未触发

如何使用 VueJS / Typescript 导入 JSON 文件?

Vue 3:模块 '"../../node_modules/vue/dist/vue"' 提示

vue组件中导入和使用three.js库

单击时交换组件

使用 Vuetify 的可滚动数据表

在Vue中调用方法时的括号