当前位置:首页 > 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 结合:

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

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

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

相关文章

vue防抖函数实现

vue防抖函数实现

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

vue接口实现导出

vue接口实现导出

Vue 接口实现导出功能 在 Vue 项目中实现导出功能通常涉及前端调用后端接口获取数据,并以文件形式下载。以下是几种常见的实现方式: 通过 Blob 对象下载文件 当后端返回文件流时,前端可通过…

react如何刷新函数组件

react如何刷新函数组件

刷新函数组件的方法 在React中,函数组件的刷新通常通过状态更新或外部触发来实现。以下是几种常见的方法: 使用useState触发重新渲染 通过更新状态变量强制组件重新渲染。React会在状态变化…

react如何阻止函数组件更新

react如何阻止函数组件更新

阻止函数组件更新的方法 在React中,函数组件的更新通常由状态(state)或属性(props)的变化触发。以下是几种阻止函数组件不必要更新的方法: 使用React.memo进行浅比较 React…

react如何调用子组件的函数

react如何调用子组件的函数

调用子组件函数的常见方法 使用 ref 直接调用 通过 React.createRef() 或 useRef 创建引用,附加到子组件上。子组件需用 forwardRef 暴露内部方法,类组件则直接通过…

php接口怎么实现

php接口怎么实现

PHP 接口实现方法 在 PHP 中,接口(Interface)用于定义一组方法的规范,而不包含具体实现。接口通过 interface 关键字定义,类通过 implements 关键字实现接口。 定…