Vue页面渲染中key的应用实例教程

下面是关于“Vue页面渲染中key的应用实例教程”的完整攻略:

什么是key

key是一个特殊的属性,用于协助Vue区分每个节点的身份,以便在不同的渲染情况下识别其应有的状态。在Vue中,key主要用于优化虚拟DOM的渲染效率。

常见应用场景

列表渲染

在Vue中,当使用v-for指令进行列表渲染时,每个元素都需要指定一个唯一的key,以便Vue能够正确地追踪每个节点的身份,当出现位置变化、新增或删除时,能够高效地更新虚拟DOM,减少渲染次数,提高性能。

示例代码如下:

<ul>
  <li v-for="item in items" :key="item.id">{{ item.title }}</li>
</ul>

动态组件

Vue中的动态组件也同样需要具有唯一的key值,用于虚拟DOM的渲染优化。

示例代码如下:

<component :is="currentTabComponent" :key="currentTabComponent"></component>

实例教程

下面将会针对列表渲染的应用场景,针对key的应用进行详细的实例教程。

示例1

我们有一个简单的todoList,数据是从父组件中通过props传入的。

<template>
  <ul>
    <li v-for="item in items">{{ item.title }}</li>
  </ul>
</template>

<script>
export default {
  props: {
    items: {
      type: Array,
      default: () => [],
    },
  },
};
</script>

现在我们需要在todoList中新增一条记录,我们可以通过直接修改props传入的数据来实现。但是我们发现,虽然数据已经更新了,但是界面上并没有新增的一条记录出现。

这是因为我们在v-for中没有使用key属性,导致Vue无法区分每个节点的身份,从而没有正确的更新虚拟DOM。修复的方法可以添加唯一的key,如下:

<template>
  <ul>
    <li v-for="item in items" :key="item.id">{{ item.title }}</li>
  </ul>
</template>

使用item.id作为key,当新增一条记录时,Vue将能够正确的识别哪个节点需要更新,从而实现渲染。

示例2

再来看一个稍微复杂一些的示例,我们有一个可排序的列表,可以拖拽调整顺序,我们使用了vuedraggable的插件来实现拖拽功能:

<template>
  <draggable :list="items" @end="onDragEnd">
    <div v-for="(item, index) in items" :key="item.id">
      {{ item.title }} -- {{ item.order }}
    </div>
  </draggable>
</template>
<script>
import draggable from "vuedraggable";
export default {
  components: { draggable },
  data() {
    return {
      items: [
        { title: "item 1", id: 1, order: 1 },
        { title: "item 2", id: 2, order: 2 },
        { title: "item 3", id: 3, order: 3 },
      ],
    };
  },
  methods: {
    onDragEnd(e) {
      this.items.forEach((item) => {
        item.order = this.items.indexOf(item) + 1;
      });
    },
  },
};
</script>

在该示例中,我们使用了v-for和vuedraggable指令,通过拖拽来调整列表顺序。但是我们会发现,拖拽并没有生效,排序顺序并没有改变。

这是因为我们在拖拽之后只是修改了数据中记录的order值,但是没有使用Vue.set或Vue.$set方法来动态修改对象属性,Vue就无法检测到变化。

修复的方法可以使用Vue.set来动态修改对象属性,如下:

<template>
  <draggable :list="items" @end="onDragEnd">
    <div v-for="(item, index) in items" :key="item.id">
      {{ item.title }} -- {{ item.order }}
    </div>
  </draggable>
</template>
<script>
import draggable from "vuedraggable";
export default {
  components: { draggable },
  data() {
    return {
      items: [
        { title: "item 1", id: 1, order: 1 },
        { title: "item 2", id: 2, order: 2 },
        { title: "item 3", id: 3, order: 3 },
      ],
    };
  },
  methods: {
    onDragEnd(e) {
      this.items.forEach((item) => {
        Vue.set(item, "order", this.items.indexOf(item) + 1);
      });
    },
  },
};
</script>

该示例讲解了在使用vue组件时,在修改对象属性时如何使用Vue.set来动态修改数据,从而能够通知Vue检测到变化,实现正确渲染。

以上就是对“Vue页面渲染中key的应用实例教程”的详细讲解,希望能对您有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Vue页面渲染中key的应用实例教程 - Python技术站

(0)
上一篇 2023年6月8日
下一篇 2023年6月8日

相关文章

  • nodejs图片处理工具gm用法小结

    Node.js图片处理工具gm用法小结 简介 GraphicsMagick (GM) 是一个命令行图象处理程序,所以需要在终端下运行,较为麻烦。而 gm 模块就是对 GraphicsMagick 程序进行封装,使其可以通过 Node.js 调用,在 Node.js 中操作图片变得异常方便。 安装 首先,需要在本地安装 GraphicsMagick 或者 Im…

    node js 2023年6月8日
    00
  • Node.js使用WebAssembly

    下面是关于Node.js使用WebAssembly的文档攻略。 Node.js使用WebAssembly 什么是WebAssembly WebAssembly(简称WASM)是一种新型的编程语言,它可以在多种平台上运行,并且可以高效地执行循环密集、CPU密集型和低级别代码。WASM默认使用二进制格式,这使得它在网络传输或存储时可以大大减少体积。WASM在Ja…

    node js 2023年6月8日
    00
  • Nodejs进阶:核心模块net入门学习与实例讲解

    Node.js进阶:核心模块net入门学习与实例讲解 什么是net模块 在Node.js中,net是一个核心模块,提供了基于TCP协议的网络通信功能。通过net模块,我们可以创建一个TCP服务器、构建TCP客户端,同时可以很方便地使用事件机制来进行网络通信,以便实现对请求和响应的处理。 net服务器的创建 使用net模块创建一个基本的TCP服务器非常简单。首…

    node js 2023年6月8日
    00
  • Nodejs 微信小程序消息推送的实现

    下面我将为你介绍“Nodejs 微信小程序消息推送的实现”的完整攻略。 一、前置条件 在进行微信小程序消息推送的实现前,你需要先做好以下准备工作: 1.拥有一个微信小程序2.已申请并获得微信小程序的 AppID 和 AppSecret3.已在微信小程序后台配置了消息模板,并获得消息模板 ID4.已搭建 Node.js 开发环境,安装了相关模块(如 reque…

    node js 2023年6月8日
    00
  • Nodejs读取本地json文件,输出json数据接口方式

    下面是关于Nodejs读取本地json文件并输出json数据接口的完整攻略: 1. 准备工作 在开始之前,你需要先准备好以下工作: 安装Node.js环境; 创建一个json文件,该文件是你要读取和输出的数据源文件; 选择一种web框架,如Express等。 2. 读取json文件 在Node.js中,你可以使用fs模块来读取本地的文件。下面是一个简单的例子…

    node js 2023年6月8日
    00
  • node实现分片下载的示例代码

    接下来我会为你讲解”node实现分片下载的示例代码”的完整攻略。 分片下载介绍 当我们下载一个大文件时,往往由于网络传输的不稳定性,很容易出现下载错误、中断等问题。为了提高文件下载的效率和稳定性,我们可以使用分片下载的方式。所谓分片下载,就是将一个大文件拆分成多个小文件,分别下载,最后再合并成一个完整的文件。这样做不仅能够减少文件下载错误和中断的概率,而且还…

    node js 2023年6月8日
    00
  • node.js中的console.trace方法使用说明

    Node.js中的console.trace方法使用说明 console.trace()是Node.js中提供的一个用于跟踪代码调用过程的方法。在开发过程中,当我们需要了解代码执行的过程中调用了哪些函数以及函数调用的顺序时,console.trace()方法是一个非常有用的工具。 使用方法 使用console.trace()方法只需要在代码中调用该方法即可。…

    node js 2023年6月8日
    00
  • Apache和Nginx的优缺点详解_动力节点Java学院整理

    Apache和Nginx的优缺点详解 1. Apache的优缺点 1.1 优点 可定制性强:Apache 提供了大量的模块和插件,用户可以根据实际需求来安装和配置使用。 支持大部分脚本语言:Apache 支持大部分脚本语言,如PHP、Python、Perl等。 广泛的文档支持:Apache 作为一个老牌的Web服务器,文档非常丰富,用户可以轻松地找到任何想要…

    node js 2023年6月8日
    00
合作推广
合作推广
分享本页
返回顶部