实现步骤

  1. 定义接口类型
    在TypeScript中定义接口返回的数据类型,确保类型安全。假设接口返回的数组包含type字段用于区分不同类型:

    interface DataItem {
      id: number;
      name: string;
      type: 'success' | 'warning' | 'error'; // 假设有三种类型
    }
    

  2. 调用接口获取数据
    使用axiosfetch调用接口,并将返回的数据存储在响应式变量中:

    import { ref } from 'vue';
    import axios from 'axios';
    
    const dataList = ref<DataItem[]>([]);
    
    const fetchData = async () => {
      try {
        const response = await axios.get('/api/data');
        dataList.value = response.data;
      } catch (error) {
        console.error('Error fetching data:', error);
      }
    };
    
    // 生命周期钩子中调用
    onMounted(() => {
      fetchData();
    });
    

  3. 动态绑定样式
    在模板中使用v-for循环渲染数据,根据type字段动态绑定背景颜色:

    <template>
      <div v-for="item in dataList" :key="item.id" :class="getItemClass(item)">
        {{ item.name }}
      </div>
    </template>
    

  4. 定义样式类名逻辑
    <script>中编写方法,根据type返回对应的CSS类名:

    const getItemClass = (item: DataItem) => {
      switch (item.type) {
        case 'success':
          return 'bg-success';
        case 'warning':
          return 'bg-warning';
        case 'error':
          return 'bg-error';
        default:
          return '';
      }
    };
    

  5. CSS样式定义
    <style>中定义不同类名对应的背景颜色:

    .bg-success {
      background-color: #4CAF50;
      color: white;
    }
    
    .bg-warning {
      background-color: #FFC107;
      color: black;
    }
    
    .bg-error {
      background-color: #F44336;
      color: white;
    }
    

完整代码示例

<template>
  <div>
    <div v-for="item in dataList" :key="item.id" :class="getItemClass(item)">
      {{ item.name }}
    </div>
  </div>
</template>

<script setup lang="ts">
import { ref, onMounted } from 'vue';
import axios from 'axios';

interface DataItem {
  id: number;
  name: string;
  type: 'success' | 'warning' | 'error';
}

const dataList = ref<DataItem[]>([]);

const fetchData = async () => {
  try {
    const response = await axios.get('/api/data');
    dataList.value = response.data;
  } catch (error) {
    console.error('Error fetching data:', error);
  }
};

const getItemClass = (item: DataItem) => {
  switch (item.type) {
    case 'success':
      return 'bg-success';
    case 'warning':
      return 'bg-warning';
    case 'error':
      return 'bg-error';
    default:
      return '';
  }
};

onMounted(() => {
  fetchData();
});
</script>

<style scoped>
.bg-success {
  background-color: #4CAF50;
  color: white;
  padding: 8px;
  margin: 4px;
}

.bg-warning {
  background-color: #FFC107;
  color: black;
  padding: 8px;
  margin: 4px;
}

.bg-error {
  background-color: #F44336;
  color: white;
  padding: 8px;
  margin: 4px;
}
</style>

关键点说明

  • 类型安全:通过interface明确定义数据结构,避免运行时错误。
  • 动态样式:根据数据字段动态绑定类名,实现灵活样式切换。
  • 代码组织:逻辑与模板分离,通过方法getItemClass集中处理样式逻辑。

通过以上步骤,可以实现根据接口返回的数据类型动态渲染不同背景颜色的效果。

更多推荐