MST

星途 面试题库

面试题:React 数据获取中 useEffect 依赖数组的复杂场景处理

在一个 React 项目中,有一个组件依赖于多个状态(比如用户登录状态、用户偏好设置等)来进行不同 API 的数据获取。并且在获取数据后,需要根据获取结果更新不同的状态。如何合理设置 useEffect 的依赖数组,确保数据获取和状态更新的准确性和高效性?请详细说明思路并给出代码框架。
47.1万 热度难度
前端开发React

知识考点

AI 面试

面试题答案

一键面试

思路

  1. 确定依赖项:useEffect 依赖数组应包含所有会影响数据获取逻辑的状态。在这个场景下,用户登录状态和用户偏好设置会影响 API 的数据获取,所以它们应包含在依赖数组中。当这些状态变化时,才会触发数据获取逻辑。
  2. 数据获取:在 useEffect 回调函数中进行 API 调用。使用异步操作来获取数据,例如使用 fetch 或者 axios
  3. 状态更新:根据获取的数据结果更新不同的状态。

代码框架

import React, { useState, useEffect } from'react';
import axios from 'axios';

const MyComponent = () => {
    // 假设这里定义用户登录状态和用户偏好设置状态
    const [isLoggedIn, setIsLoggedIn] = useState(false);
    const [userPreferences, setUserPreferences] = useState({});
    // 定义用于存储获取数据的状态
    const [fetchedData, setFetchedData] = useState(null);

    useEffect(() => {
        const fetchData = async () => {
            try {
                // 根据登录状态和用户偏好设置来决定 API 的请求地址或参数
                let apiUrl = `/api/data?loggedIn=${isLoggedIn}`;
                if (Object.keys(userPreferences).length > 0) {
                    // 假设根据用户偏好设置添加参数
                    apiUrl += `&preference=${JSON.stringify(userPreferences)}`;
                }
                const response = await axios.get(apiUrl);
                setFetchedData(response.data);
                // 这里可以根据获取的数据结果更新其他状态,假设更新一个名为dataProcessed的状态
                setDataProcessed(true);
            } catch (error) {
                console.error('Error fetching data:', error);
            }
        };

        if (isLoggedIn) {
            fetchData();
        }
    }, [isLoggedIn, userPreferences]);

    return (
        <div>
            {/* 组件渲染逻辑 */}
        </div>
    );
};

export default MyComponent;

在上述代码中,useEffect 的依赖数组包含 isLoggedInuserPreferences,确保仅当这两个状态变化时才触发数据获取。当 isLoggedIntrue 时,执行 fetchData 函数进行数据获取,并根据结果更新 fetchedData 以及其他相关状态。