当前位置:首页 > React

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

2026-01-26 07:51:40React

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

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

创建独立的 API 服务模块

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

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 来组合多个接口调用:

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 等数据获取库简化流程
  • 对敏感操作添加权限校验层

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

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

相关文章

vue3中实现接口轮询

vue3中实现接口轮询

使用 setInterval 实现基础轮询 在 Vue 3 中,可以通过 setInterval 定时调用接口。在组件的 setup 中定义轮询逻辑,注意在组件卸载时清除定时器以避免内存泄漏。 i…

vue调用接口实现退出

vue调用接口实现退出

Vue 调用接口实现退出功能 在 Vue 中实现退出功能通常需要调用后端接口,清除用户登录状态,并跳转到登录页面或其他指定页面。以下是实现步骤: 定义退出接口方法 在 Vue 项目中,通常会在 sr…

vue实现接口

vue实现接口

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

php 实现接口

php 实现接口

PHP 实现接口的方法 在 PHP 中,接口(Interface)用于定义一组方法的规范,而不包含具体的实现。类可以实现(implement)接口,并必须实现接口中定义的所有方法。 定义接口 接口通…

vue实现接口连接

vue实现接口连接

Vue 实现接口连接的步骤 安装 Axios Axios 是一个基于 Promise 的 HTTP 客户端,适用于浏览器和 Node.js 环境。通过以下命令安装: npm install a…

java如何调用接口

java如何调用接口

调用接口的基本方法 在Java中调用接口通常涉及实现接口或使用接口引用对象。以下是几种常见场景的示例: 定义接口 public interface MyInterface { void…