当前位置: 首页 > article >正文

解决首次加载数据空指针异常

起初效果:

使用async...await异步加载数据

最终效果:

代码:

<template>
  <div class="user-list-container">
    <!-- 加载状态 -->
    <div v-if="loading" class="loading">正在加载用户数据...</div>

    <!-- 用户列表 -->
    <div v-else>
      <ul v-if="users.length > 0" class="user-list">
        <li v-for="user in users" :key="user.id" class="user-item">
          {{ user.name }} ({{ user.email }})
        </li>
      </ul>
      <div v-else class="empty">没有加载到用户数据。</div>
    </div>
  </div>
</template>

<script setup>
import { ref, onMounted } from "vue";

// 响应式变量
const users = ref([]); // 用户列表
const loading = ref(true); // 加载状态

// 模拟异步加载数据的方法
const fetchUsers = () => {
  return new Promise((resolve) => {
    setTimeout(() => {
      resolve([
        { id: 1, name: "张三", email: "zhangsan@example.com" },
        { id: 2, name: "李四", email: "lisi@example.com" },
        { id: 3, name: "王五", email: "wangwu@example.com" },
      ]);
    }, 2000); // 模拟 2 秒延迟
  });
};

// 组件挂载时加载数据
onMounted(async () => {
  try {
    const data = await fetchUsers(); // 模拟异步加载用户数据
    users.value = data; // 更新用户列表
  } catch (error) {
    console.error("数据加载失败", error);
  } finally {
    loading.value = false; // 数据加载完成
  }
});
</script>

<style scoped>
.user-list-container {
  padding: 20px;
  font-family: Arial, sans-serif;
}

.loading {
  text-align: center;
  font-size: 18px;
  color: gray;
}

.user-list {
  list-style-type: none;
  padding: 0;
}

.user-item {
  padding: 10px;
  border-bottom: 1px solid #ddd;
  font-size: 16px;
}

.empty {
  text-align: center;
  font-size: 16px;
  color: gray;
}
</style>

使用.then()方法处理异步操作

<template>
  <div class="user-list-container">
    <!-- 加载状态 -->
    <div v-if="loading" class="loading">正在加载用户数据...</div>

    <!-- 用户列表 -->
    <div v-else>
      <ul v-if="users.length > 0" class="user-list">
        <li v-for="user in users" :key="user.id" class="user-item">
          {{ user.name }} ({{ user.email }})
        </li>
      </ul>
      <div v-else class="empty">没有加载到用户数据。</div>
    </div>
  </div>
</template>

<script setup>
import { ref, onMounted } from "vue";

// 响应式变量
const users = ref([]); // 用户列表
const loading = ref(true); // 加载状态

// 模拟异步加载数据的方法
const fetchUsers = () => {
  return new Promise((resolve) => {
    setTimeout(() => {
      resolve([
        { id: 1, name: "张三", email: "zhangsan@example.com" },
        { id: 2, name: "李四", email: "lisi@example.com" },
        { id: 3, name: "王五", email: "wangwu@example.com" },
      ]);
    }, 2000); // 模拟 2 秒延迟
  });
};

// 使用 .then() 方法加载数据
onMounted(() => {
  fetchUsers()
    .then((data) => {
      users.value = data; // 更新用户列表
    })
    .catch((error) => {
      console.error("数据加载失败", error);
    })
    .finally(() => {
      loading.value = false; // 数据加载完成
    });
});
</script>

<style scoped>
.user-list-container {
  padding: 20px;
  font-family: Arial, sans-serif;
}

.loading {
  text-align: center;
  font-size: 18px;
  color: gray;
}

.user-list {
  list-style-type: none;
  padding: 0;
}

.user-item {
  padding: 10px;
  border-bottom: 1px solid #ddd;
  font-size: 16px;
}

.empty {
  text-align: center;
  font-size: 16px;
  color: gray;
}
</style>


http://www.kler.cn/a/412688.html

相关文章:

  • 微信小程序 城市点击后跳转 并首页显示被点击城市
  • Web 学习笔记 - 网络安全
  • iframe温习+应用
  • JDBC 批量调用数据库 SQL, 函数与存储过程
  • RiceChem——用于评估大语言模型在教育领域自动长答卷评分 (ALAG) 的数据集
  • mmaction 、mmpose、rtmo和rtmpose
  • scp比rz sz传文件更好
  • 海康VsionMaster学习笔记(学习工具+思路)
  • faiss库中ivf-sq(ScalarQuantizer,标量量化)代码解读-6
  • C#面向对象,封装、继承、多态、委托与事件实例
  • Linux环境实现c语言编程
  • Linux介绍与安装指南:从入门到精通
  • 【Kubernetes 指南】基础入门——Kubernetes 简介(一)
  • 鸿蒙手势密码
  • Java入门:17.正则表达式,String的intern方法,StringBuilder可变字符串特点与应用,+连接字符串特点--001
  • 循环神经网络(RNN)在自然语言处理(NLP)中的应用
  • MySQL【11】事务
  • 【简单好抄保姆级教学】javascript调用本地exe程序(谷歌,edge,百度,主流浏览器都可以使用....)
  • Git 进程占用报错-解决方案
  • 谷歌浏览器Chrome打开百度很慢,其他网页正常的解决办法,试了很多,找到了适合的
  • STM32 L4系列单片机低功耗模式(STOP模式)
  • 【TQ2440】02 串口连接进入u-boot
  • 【CSP CCF记录】201812-1第15次认证 小明上学
  • leecode56.合并区间
  • 华财术_号卡分销平台讲解(四大运营商+手机卡)
  • 【圣明先森】SPP集合划分问题(第二集)