前端数据源无缝切换实战

-1

实现无缝切换的核心思路

通过设计统一的接口数据格式和封装请求层,使前端代码无需关心数据来源(模拟或真实接口)。关键在于模拟数据与真实接口返回的数据结构保持一致,并通过环境变量或配置开关控制数据源切换。

配置环境变量

在项目中创建.env.development.env.production文件,分别设置不同环境下的变量:

# .env.development
VUE_APP_API_MOCK=true
VUE_APP_API_BASEURL=http://localhost:3000/api

# .env.production
VUE_APP_API_MOCK=false
VUE_APP_API_BASEURL=https://api.yourdomain.com

封装请求层

创建src/api/request.js统一处理请求:

import axios from 'axios'
import mockData from './mock'

const instance = axios.create({
  baseURL: process.env.VUE_APP_API_BASEURL
})

// 请求拦截器
instance.interceptors.request.use(config => {
  if (process.env.VUE_APP_API_MOCK === 'true') {
    config.adapter = function() {
      return new Promise((resolve) => {
        const mockResponse = {
          data: mockData[config.url],
          status: 200,
          config
        }
        resolve(mockResponse)
      })
    }
  }
  return config
})

export default instance

设计统一数据结构

src/api/mock.js中定义模拟数据,保持与真实接口相同的返回结构:

export default {
  '/user/list': {
    code: 200,
    data: {
      total: 100,
      list: [
        { id: 1, name: '张三', age: 25 },
        { id: 2, name: '李四', age: 30 }
      ]
    }
  }
}

Express接口实现

创建真实接口路由,确保返回结构与模拟数据一致:

// server/routes/user.js
const express = require('express')
const router = express.Router()

router.get('/list', (req, res) => {
  const { page = 1, pageSize = 10 } = req.query
  // 实际数据库查询逻辑
  res.json({
    code: 200,
    data: {
      total: 100,
      list: [
        { id: 1, name: '张三', age: 25 },
        { id: 2, name: '李四', age: 30 }
      ]
    }
  })
})

module.exports = router

Vue组件调用

表格组件中统一调用接口,无需区分数据源:

import request from '@/api/request'

export default {
  data() {
    return {
      tableData: [],
      pagination: {
        current: 1,
        pageSize: 10,
        total: 0
      }
    }
  },
  methods: {
    async fetchData() {
      const res = await request.get('/user/list', {
        params: {
          page: this.pagination.current,
          pageSize: this.pagination.pageSize
        }
      })
      this.tableData = res.data.data.list
      this.pagination.total = res.data.data.total
    }
  },
  created() {
    this.fetchData()
  }
}

分页组件实现

使用Element UI的分页组件,保持切换数据源时行为一致:

<template>
  <div>
    <el-table :data="tableData">
      <!-- 表格列定义 -->
    </el-table>
    <el-pagination
      @current-change="handlePageChange"
      :current-page="pagination.current"
      :page-size="pagination.pageSize"
      :total="pagination.total"
      layout="total, prev, pager, next"
    />
  </div>
</template>

<script>
export default {
  methods: {
    handlePageChange(page) {
      this.pagination.current = page
      this.fetchData()
    }
  }
}
</script>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值