javascript - 当页面上有很多项目时,Vuejs 似乎在与 v-model 作斗争

标签 javascript vue.js

我有一个简单的页面,顶部有一个表格,用于提交一些数据,表格下方有一个列表,如图所示:

enter image description here

列表由来自 api 的数据填充,每个对象有 4 个属性(对于一个简单的列表来说并不多!)。目前该列表共有 130 个元素。现在,如果我尝试在文本区域中写一些东西,它恰好非常慢(2-10 帧/秒)。添加到列表中的项目越多,它变得越慢。顶部的表单有一个名为 form 的简单数据对象。如下所示:

form: {
  description: '',
  expired: '',
  applicationId: ''
}

有趣的是,列表和顶部的表单之间没有共享单一数据,因此,它们应该独立运行。当我称赞列表部分时,textarea 再次非常快。

下面是渲染列表的代码:

  <b-card no-body class="box-shadowed">
    <b-card-body v-if="appKeys.length === 0">
      <h5>Seems there is no key available.</h5>
    </b-card-body>
    <b-list-group v-else flush>
      <b-list-group-item
        v-for="(key, index) in appKeys"
        :key="key.id"
      >
        <div class="d-flex w-100 justify-content-between">
          <p class="text-danger h6"><span class="text-dark">{{ index + 1 }} - </span> <i>{{ key.id }}</i></p>
          <div>
            <b-button variant="primary" title="Edit" @click="openEditModal(key.id, key.description, key.expired)">
              <b-icon :icon="'pencil'"/>
            </b-button>
            <b-button variant="danger" title="Delete" @click="deleteKey(index, key.id)">
              <b-icon :icon="'trash'"/>
            </b-button>
          </div>
        </div>
        <template v-if="key.expired">
          <b-badge variant="info">Expires on: {{ key.expired | formatDate }}</b-badge>
          <br/>
        </template>
        <small>
          <b>
            <i>Created by: {{ key.createdBy }}</i> on {{ key.created | formatDateTime }}
          </b>
          <br/>
          {{ key.description }}
        </small>

      </b-list-group-item>
    </b-list-group>

如果我删除 v-model="form.description"从 textarea 问题再次消失。 我认为问题可能出在 <b-form-textarea>来自 bootstrap-vue 的组件,但同样的问题也发生在简单的文本区域输入中。

我尝试检查 vue dev-tools 面板,每次我在列表中有很多项目时我都可以看到帧丢失,但我不知道还有什么要检查。

有人知道为什么会发生这种情况吗?这是一个 vuejs 限制它可以处理多少项目,或者我在某处有一些瓶颈代码?

编辑

我可以使用v-once并且页面会再次变快,但是当我添加新元素以更新下面的列表时我需要这种 react 性..

最佳答案

something你所面对的。这里说:

Any change to a template’s dependency will result of re-render of the whole virtual dom of that component.

随着列表越来越大,需要重新渲染的组件也会越来越多。这导致缓慢。一种解决方案是您可以为列表所在的 html 部分创建一个子组件。因此,<b-form-textarea> 中的任何输入变化在父组件中不会触发子组件重新渲染。

关于javascript - 当页面上有很多项目时,Vuejs 似乎在与 v-model 作斗争,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69334830/

相关文章:

javascript - 使用 Javascript 通过单击按钮获取表格单元格元素

javascript - 无法使用Axios和Vue.Js从其他网站检索rss xml信息

javascript - Vuex 突变不同步工作但既不返回 promise

php - Laravel 验证器响应嵌套数组

javascript - JQuery:当其他输入字段的值随一系列数字更改时更改值

javascript - 在 ng-repeat 上初始化复选框 angularjs

javascript - 如何计算可变高度

javascript - Stripe.js - 无法更改信用卡输入的背景颜色或高度

vue.js - 如何从 VuetifyJS 组合框中获取文本值?

javascript - 如何通过jquery触发器触发超链接?