返回

Vue 3 中消除 “TypeError: parent is null” 错误的权威指南

vue.js

Vue 3 中消除“TypeError: parent is null”错误的权威指南

前言

在 Vue 3 的 Composition API 中遨游时,你可能会遭遇一个令人困惑的错误:“TypeError: parent is null”。本文将深入探讨导致此错误的根源,并提供一系列可靠的解决方案,让你轻松告别这个烦恼。

问题根源

在 Composition API 中,setup() 函数在组件实例化之前被调用。这会导致对 ref() 或 reactive() 函数创建的响应式对象的引用在组件实例化时为 null。例如,如果你在 mounted() 生命周期钩子中设置响应式对象 isLoading,那么在组件实例化完成之前,parent 将为 null。

解决之道

要解决此错误,有三种行之有效的方法:

方法 1:延迟设置响应式对象

可以使用 setTimeout() 或 Promise.then() 将响应式对象的设置延迟到组件实例化之后。例如:

onMounted(async () => {
  await axios.get('/mycallurl/something' + route.params.uuid).then((res) => {
    subject.value = res.data.subject; // 字符串
  }).then(() => {
    setTimeout(() => {
      isLoading.value = false;
    }, 0);
  });
});

方法 2:使用 computed() 函数

computed() 函数可在组件实例化后才计算导出响应式对象,从而避免 parent 为 null 的问题。例如:

import { computed } from 'vue';

const subject = ref('');
const isLoading = computed(() => {
  return axios.get('/mycallurl/something' + route.params.uuid).then((res) => {
    subject.value = res.data.subject; // 字符串
  }).then(() => {
    return false;
  });
});

onMounted(() => {});

方法 3:在 setup() 函数中创建响应式对象

setup() 函数在组件实例化之前被调用,因此可以在其中直接创建响应式对象,无需担心 parent 为 null。例如:

import { reactive } from 'vue';

const subject = ref('');
const isLoading = reactive({ value: true });

onMounted(async () => {
  await axios.get('/mycallurl/something' + route.params.uuid).then((res) => {
    subject.value = res.data.subject; // 字符串
    isLoading.value = false;
  });
});

结论

通过延迟设置响应式对象、使用 computed() 函数或在 setup() 函数中创建响应式对象,你可以轻松解决“TypeError: parent is null”错误,让你的 Vue 3 应用程序畅通无阻。选择最适合你的需求和偏好的解决方案,享受无缝的编程体验。

常见问题解答

1. 为什么在 mounted() 生命周期钩子中设置响应式对象会导致错误?

因为 mounted() 生命周期钩子在组件实例化之后才调用,此时 parent 可能为 null。

2. 什么情况下使用 computed() 函数更合适?

当需要根据其他响应式对象计算导出响应式对象时,使用 computed() 函数更合适。

3. 在 setup() 函数中创建响应式对象有什么好处?

在 setup() 函数中创建响应式对象可以避免 parent 为 null 的问题,因为 setup() 函数在组件实例化之前调用。

4. 如何决定选择哪种解决方案?

选择解决方案取决于你的特定需求和偏好。延迟设置响应式对象适合需要在 mounted() 生命周期钩子中执行异步操作的情况。使用 computed() 函数适合需要根据其他响应式对象计算导出响应式对象的情况。在 setup() 函数中创建响应式对象适合直接创建响应式对象且不需要在 mounted() 生命周期钩子中执行异步操作的情况。

5. 我应该何时使用 ref() 函数?

ref() 函数用于创建对 DOM 元素或其他组件的引用。与响应式对象不同,ref() 函数创建的引用不会自动响应式。