当前位置:首页 > React

react如何在model层写函数调接口

2026-01-26 07:51:40React

React 中 Model 层函数调用接口的实现

在 React 应用中,Model 层通常负责数据管理和接口调用。可以通过以下方式组织代码:

创建独立的 API 服务模块

将接口调用封装在单独的 service 文件中,例如 apiService.js

react如何在model层写函数调接口

import axios from 'axios';

const BASE_URL = 'https://api.example.com';

export const fetchUserData = async (userId) => {
  try {
    const response = await axios.get(`${BASE_URL}/users/${userId}`);
    return response.data;
  } catch (error) {
    console.error('Error fetching user data:', error);
    throw error;
  }
};

export const updateUserData = async (userId, data) => {
  try {
    const response = await axios.put(`${BASE_URL}/users/${userId}`, data);
    return response.data;
  } catch (error) {
    console.error('Error updating user data:', error);
    throw error;
  }
};

使用自定义 Hook 封装业务逻辑

创建自定义 Hook 来组合多个接口调用:

react如何在model层写函数调接口

import { useState, useEffect } from 'react';
import { fetchUserData, updateUserData } from './apiService';

export const useUserModel = (userId) => {
  const [user, setUser] = useState(null);
  const [loading, setLoading] = useState(false);
  const [error, setError] = useState(null);

  const loadUser = async () => {
    setLoading(true);
    try {
      const data = await fetchUserData(userId);
      setUser(data);
    } catch (err) {
      setError(err);
    } finally {
      setLoading(false);
    }
  };

  const saveUser = async (userData) => {
    setLoading(true);
    try {
      const updatedUser = await updateUserData(userId, userData);
      setUser(updatedUser);
    } catch (err) {
      setError(err);
      throw err;
    } finally {
      setLoading(false);
    }
  };

  useEffect(() => {
    loadUser();
  }, [userId]);

  return { user, loading, error, saveUser };
};

在组件中使用 Model 层

组件只需调用 Hook 而不需关心具体实现:

import { useUserModel } from './models/useUserModel';

function UserProfile({ userId }) {
  const { user, loading, error, saveUser } = useUserModel(userId);

  const handleSave = async (formData) => {
    try {
      await saveUser(formData);
      // 处理保存成功后的逻辑
    } catch (err) {
      // 处理错误
    }
  };

  if (loading) return <div>Loading...</div>;
  if (error) return <div>Error: {error.message}</div>;

  return (
    <div>
      {/* 渲染用户界面 */}
    </div>
  );
}

使用状态管理工具集成

如果需要全局状态管理,可以将 Model 层与 Redux 或 Context API 结合:

// 在 Redux 的 async thunk 中调用接口
export const fetchUser = createAsyncThunk(
  'user/fetch',
  async (userId, { rejectWithValue }) => {
    try {
      return await fetchUserData(userId);
    } catch (error) {
      return rejectWithValue(error.response.data);
    }
  }
);

// 在 slice 中处理状态
const userSlice = createSlice({
  name: 'user',
  initialState: { data: null, loading: false, error: null },
  reducers: {},
  extraReducers: (builder) => {
    builder
      .addCase(fetchUser.pending, (state) => {
        state.loading = true;
      })
      .addCase(fetchUser.fulfilled, (state, action) => {
        state.data = action.payload;
        state.loading = false;
      })
      .addCase(fetchUser.rejected, (state, action) => {
        state.error = action.payload;
        state.loading = false;
      });
  }
});

最佳实践建议

  • 保持 Model 层纯粹,只关注数据逻辑
  • 使用 TypeScript 定义接口返回类型
  • 添加请求拦截器和响应拦截器处理通用逻辑
  • 考虑使用 React Query 等数据获取库简化流程
  • 对敏感操作添加权限校验层

标签: 函数接口
分享给朋友:

相关文章

java如何写接口

java如何写接口

定义接口 在Java中,使用interface关键字定义接口。接口可以包含抽象方法、默认方法、静态方法和常量(隐式为public static final)。 public interface…

vue怎么实现接口

vue怎么实现接口

Vue 实现接口请求的方法 Vue 中实现接口请求通常使用 axios 或 fetch,以下是具体实现方式。 使用 axios 发送请求 安装 axios: npm install axios 在…

vue实现异步函数

vue实现异步函数

Vue 中实现异步函数的几种方法 使用 async/await 在 Vue 方法或生命周期钩子中可以直接使用 async/await 语法处理异步操作。这种方式代码更清晰,易于理解。 methods…

vue实例实现事件接口

vue实例实现事件接口

Vue 实例实现事件接口的方法 Vue 实例可以通过内置的事件系统实现组件间的通信或触发自定义行为。以下是几种常见的事件接口实现方式: 使用 $on 和 $emit 通过 $emit 触发自定义…

vue防抖函数实现

vue防抖函数实现

防抖函数原理 防抖(Debounce)是一种限制函数频繁调用的技术,在事件被触发后延迟执行,若在延迟时间内再次触发,则重新计时。适用于输入框搜索、窗口大小调整等场景。 Vue 中实现防抖的三种方式…

答辩vue接口如何实现

答辩vue接口如何实现

Vue 接口实现的核心方法 使用 Axios 或 Fetch 发起 HTTP 请求 Axios 是 Vue 项目中常用的 HTTP 客户端,需先通过 npm install axios 安装。在组件中…