vue.js

关注公众号 jb51net

关闭
首页 > 网络编程 > JavaScript > javascript类库 > vue.js > Vue Data属性

Vue中Data属性避坑指南

作者:发现一只大呆瓜

在Vue开发中,我们经常会遇到“明明修改了数据,视图却不更新”的尴尬场景,这通常与 Vue 的初始化顺序及响应式实现原理有关,本文将从 Data 属性的本质出发,解析响应式“丢失”的根本原因及解决方案

前言

在 Vue 开发中,我们经常会遇到“明明修改了数据,视图却不更新”的尴尬场景。这通常与 Vue 的初始化顺序及响应式实现原理有关。本文将从 Data 属性的本质出发,解析响应式“丢失”的根本原因及解决方案。

一、 组件中的 Data 为什么必须是函数?

在 Vue 2 中,根实例的 data 可以是对象,但组件中的 data 必须是函数。

核心原因:数据隔离

二、 Props 与 Data 的优先级之争

在组件初始化时,Vue 会按照特定的顺序处理选项。

初始化顺序

Props → Methods → Data → Computed → Watch

因为 Props 最先被初始化,所以我们可以在 data 中直接引用 props 传来的值:

// Vue 3 + TS 示例
const props = defineProps<{ initialCount: number }>();
const count = ref(props.initialCount); // 合法,因为 props 优先初始化

三、 Vue2动态添加新属性的“失效”困局

1. 故障场景

vue2中当我们直接给对象添加一个原本不存在的属性时,视图不会产生任何变化。

<p v-for="(value,key)in item" :key="key">
    {{ value }}
</p>
<button@click="addProperty">动态添加新属性</button>

const app = new Vue({
  el: '#app',
  data: {
    item: {
      oldProperty: 'l日属性'
    }
  },
  methods: {
    addProperty() {
      this.items.newProperty = '新属性'; // 为items添加新属性
      console.log(this.items); // 输出带有newProperty的items
    }
  }
})

2. 原因剖析

四、 解决方案(Vue 2 必备技巧)

如果你仍在使用 Vue 2,可以通过以下三种方式解决:

1. 推荐方案:Vue.set/this.$set

这是最正统的方法,它会手动将新属性转为响应式,并触发依赖更新。

语法: this.$set(target, propertyName/index, value)

addProperty() {
   this.$set(this.item, 'newProperty', '新属性'); 
}

2. 对象整体替换:Object.assign

通过创建一个包含新属性的新对象,并将这个新对象赋值给原有对象,触发 Vue 对原对象引用的变更感知。

addProperty() {
   this.item = Object.assign({}, this.item, { newProperty: '新属性' });
   // 或者使用展开运算符
   this.item = { ...this.item, newProperty: '新属性' };
}

3. 暴力方案:$forceUpdate

迫使 Vue 重新渲染组件。

五、 Vue 3 + TS 最佳实践

在 Vue 3 中,借助 TypeScript 的类型定义,我们可以规避大部分因“动态添加”导致的逻辑混乱。

<script setup lang="ts">
import { reactive } from 'vue';

// 定义接口,提前声明可选属性
interface Item {
  oldProperty: string;
  newProperty?: string; // 声明可选属性
}

const item = reactive<Item>({
  oldProperty: '旧属性'
});

const addProperty = () => {
  // Vue 3 Proxy 自动处理响应式,无需 $set
  item.newProperty = '新属性'; 
};
</script>

到此这篇关于Vue中Data属性避坑指南的文章就介绍到这了,更多相关Vue Data属性内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文