MST

星途 面试题库

面试题:Svelte父子组件异步数据传递与优化

父组件通过异步API获取用户信息数据(例如`fetch('/api/user')`),获取到的数据是一个包含用户详细信息的对象。父组件需要将这个异步获取的数据传递给子组件,并且在传递过程中要处理好加载状态和错误状态,避免出现数据未加载完子组件报错的情况。同时,考虑到性能优化,在数据未发生变化时不重复渲染子组件。请详细阐述实现方案并给出核心代码。
14.3万 热度难度
前端开发Svelte

知识考点

AI 面试

面试题答案

一键面试

实现方案

  1. 在父组件中管理状态:使用useState钩子来管理数据加载状态(loading)、错误状态(error)以及用户信息数据(userData)。
  2. 异步获取数据:在useEffect钩子中调用异步API获取用户信息数据,在获取数据过程中更新加载状态,获取成功时更新用户信息数据,获取失败时更新错误状态。
  3. 传递数据与状态到子组件:将加载状态、错误状态以及用户信息数据传递给子组件。
  4. 子组件处理数据:子组件根据传递过来的状态进行相应处理,在数据加载时显示加载提示,数据获取失败时显示错误提示,数据加载成功时显示用户信息。
  5. 性能优化:使用React.memo包裹子组件,避免在数据未发生变化时重复渲染。

核心代码

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

// 子组件,使用React.memo进行性能优化
const UserInfoComponent = React.memo(({ userData, loading, error }) => {
    if (loading) {
        return <div>Loading...</div>;
    }
    if (error) {
        return <div>Error: {error.message}</div>;
    }
    return (
        <div>
            <p>Name: {userData.name}</p>
            <p>Email: {userData.email}</p>
            {/* 显示其他用户信息 */}
        </div>
    );
});

const ParentComponent = () => {
    const [userData, setUserData] = useState(null);
    const [loading, setLoading] = useState(false);
    const [error, setError] = useState(null);

    useEffect(() => {
        const fetchUserData = async () => {
            setLoading(true);
            try {
                const response = await fetch('/api/user');
                if (!response.ok) {
                    throw new Error('Network response was not ok');
                }
                const data = await response.json();
                setUserData(data);
            } catch (error) {
                setError(error);
            } finally {
                setLoading(false);
            }
        };
        fetchUserData();
    }, []);

    return (
        <div>
            <UserInfoComponent userData={userData} loading={loading} error={error} />
        </div>
    );
};

export default ParentComponent;