除了改变 key,还有哪些属性变化会触发组件重新渲染?

简介: 除了改变 key,还有哪些属性变化会触发组件重新渲染?

在 Vue 3 中,除了改变 key 属性会触发组件重新渲染外,以下几种属性变化也会触发组件重新渲染:

1. 响应式数据变化

reactive 创建的响应式对象

当使用 reactive 函数创建的响应式对象的属性发生变化时,会触发依赖该数据的组件重新渲染。reactive 会将对象转换为响应式代理,任何对其属性的修改都会被 Vue 捕获并触发更新。

<template>
  <div>
    <p>{
  { user.name }}</p>
    <button @click="changeName">Change Name</button>
  </div>
</template>

<script setup>
import { reactive } from 'vue';

const user = reactive({
  name: 'John'
});

const changeName = () => {
  user.name = 'Jane';
};
</script>

在上述示例中,当点击按钮调用 changeName 方法修改 user.name 时,组件会重新渲染以反映新的数据。

ref 创建的响应式引用

使用 ref 创建的响应式引用,当修改其 .value 属性时,会触发依赖该 ref 的组件重新渲染。

<template>
  <div>
    <p>{
  { count }}</p>
    <button @click="increment">Increment</button>
  </div>
</template>

<script setup>
import { ref } from 'vue';

const count = ref(0);

const increment = () => {
  count.value++;
};
</script>

这里点击按钮调用 increment 方法增加 count.value 的值,组件会重新渲染更新显示的计数。

2. 计算属性依赖的数据变化

计算属性是根据其他响应式数据计算得出的值,当计算属性所依赖的响应式数据发生变化时,计算属性会重新计算,并且使用该计算属性的组件会重新渲染。

<template>
  <div>
    <p>{
  { fullName }}</p>
    <button @click="changeFirstName">Change First Name</button>
  </div>
</template>

<script setup>
import { ref, computed } from 'vue';

const firstName = ref('John');
const lastName = ref('Doe');

const fullName = computed(() => {
  return `${firstName.value} ${lastName.value}`;
});

const changeFirstName = () => {
  firstName.value = 'Jane';
};
</script>

当点击按钮修改 firstName.value 时,fullName 计算属性会重新计算,组件会重新渲染以显示新的全名。

3. 传入组件的 props 变化

当父组件传递给子组件的 props 发生变化时,子组件会重新渲染以反映新的 props 值。

父组件

<template>
  <div>
    <ChildComponent :message="parentMessage" />
    <button @click="changeMessage">Change Message</button>
  </div>
</template>

<script setup>
import { ref } from 'vue';
import ChildComponent from './ChildComponent.vue';

const parentMessage = ref('Initial message');

const changeMessage = () => {
  parentMessage.value = 'New message';
};
</script>

子组件(ChildComponent.vue)

<template>
  <div>
    <p>{
  { message }}</p>
  </div>
</template>

<script setup>
import { defineProps } from 'vue';

const props = defineProps({
  message: String
});
</script>

在父组件中点击按钮修改 parentMessage 时,传递给子组件的 message props 发生变化,子组件会重新渲染。

4. 监听的响应式数据变化

使用 watchwatchEffect 监听的响应式数据发生变化时,若在监听回调中涉及到组件状态的更新,也会触发组件重新渲染。

<template>
  <div>
    <p>{
  { data }}</p>
    <button @click="updateData">Update Data</button>
  </div>
</template>

<script setup>
import { ref, watchEffect } from 'vue';

const originalData = ref('Initial data');
const data = ref('');

watchEffect(() => {
  data.value = `Processed: ${originalData.value}`;
});

const updateData = () => {
  originalData.value = 'New data';
};
</script>

当点击按钮更新 originalData 时,watchEffect 会重新执行,更新 data 的值,从而触发组件重新渲染。

相关文章
node判断文件夹是否存在,不存在直接创建
node判断文件夹是否存在,不存在直接创建
|
JavaScript
JS绑定事件的三种方法(简单易懂)
JS绑定事件的三种方法(简单易懂)
|
7月前
|
JavaScript
Pinia 与 Vuex 4 相比有哪些优缺点?
Pinia 与 Vuex 4 相比有哪些优缺点?
394 57
|
7月前
|
IDE Java 开发工具
如何在代码审查中高效地发现数组越界问题?
如何在代码审查中高效地发现数组越界问题?
244 56
|
7月前
|
监控 安全 Cloud Native
企业网络架构安全持续增强框架
企业网络架构安全评估与防护体系构建需采用分层防御、动态适应、主动治理的方法。通过系统化的实施框架,涵盖分层安全架构(核心、基础、边界、终端、治理层)和动态安全能力集成(持续监控、自动化响应、自适应防护)。关键步骤包括系统性风险评估、零信任网络重构、纵深防御技术选型及云原生安全集成。最终形成韧性安全架构,实现从被动防御到主动免疫的转变,确保安全投入与业务创新的平衡。
|
10月前
|
人工智能 数据可视化 API
自学记录鸿蒙API 13:Calendar Kit日历功能从学习到实践
本文介绍了使用HarmonyOS的Calendar Kit开发日程管理应用的过程。通过API 13版本,不仅实现了创建、查询、更新和删除日程等基础功能,还深入探索了权限请求、日历配置、事件添加及查询筛选等功能。实战项目中,开发了一个智能日程管理工具,具备可视化管理、模糊查询和智能提醒等特性。最终,作者总结了模块化开发的优势,并展望了未来加入语音助手和AI推荐功能的计划。
683 1
|
Web App开发 JavaScript 前端开发
2024年纯前端VUE在线编辑微软Office/金山WPS的Word/Excel文档
现在,随着数字化进程渗透到到各行各业,数据安全已经成为了数字化革命中的重要组成部分,而在线Office成在OA、ERP、文档系统中得到了广泛的应用,为我国的信息化事业也做出了巨大贡献。随着操作系统、浏览器及Office软件的不断升级和更新换代,加上国家对信息化、数字化系统要求的不断提升,一些厂家的WebOffice控件产品不断被淘汰出局,而现存的几个产品也存在以下几个问题:
1291 106
2024年纯前端VUE在线编辑微软Office/金山WPS的Word/Excel文档
|
11月前
|
机器学习/深度学习 数据采集 搜索推荐
利用Python和机器学习构建电影推荐系统
利用Python和机器学习构建电影推荐系统
506 1
|
12月前
|
前端开发
CSS网页布局综合练习(涵盖大多CSS知识点)
CSS网页布局综合练习(涵盖大多CSS知识点)
|
JavaScript 内存技术
nvm 切换版本失效?这个方法100%解决
NVM是一个工具,类似于一个“开关”,可以帮助我们在同一台电脑上安装和切换不同版本的Node.js
7630 1
nvm 切换版本失效?这个方法100%解决