gpt4 book ai didi

reactjs - 使用 React/Relay/Typescript 跨片段重用组件的最佳实践是什么?

转载 作者:行者123 更新时间:2023-12-03 08:28:39 27 4
gpt4 key购买 nike

我正在使用 React、Relay(实验性)和 Typescript 制作一个 Web 应用程序,但在不同片段中重复使用具有相似数据/属性的组件时遇到了一些问题。

假设我有以下中继查询和主应用程序组件:

const query = graphql`
query AppQuery {
currentUser {
...HomePage_currentUser
...ProfilePage_currentUser
}
}
`;

export default function App(): JSX.Element {
const appData = useLazyLoadQuery<AppQuery>(query, {});

return (
<>
<HomePage currentUser={appData.currentUser}>
<ProfilePage currentUser={appData.currentUser}>
</>
);
}

以及以下页面组件:

interface HomePageProps {
currentUser: HomePage_currentUser$key | null;
}

const currentUserFragment = graphql`
fragment HomePage_currentUser on User {
id
profileImageUrl
items {
id
name
}
}
`;


export default function HomePage(props: HomePageProps): JSX.Element {
const currentUser = useFragment(currentUserFragment, props.currentUser);

return (
<>
{/* ... */}
<ProfileIcon user={currentUser} >
{/* ... */}
</>
)
}
interface ProfilePageProps {
currentUser: ProfilePage_currentUser$key | null;
}

const currentUserFragment = graphql`
fragment ProfilePage_currentUser on User {
id
profileImageUrl
lastLoggedInTimestamp
}
`;


export default function ProfilePage(props: ProfilePageProps): JSX.Element {
const currentUser = useFragment(currentUserFragment, props.currentUser);

return (
<>
{/* ... */}
<ProfileIcon user={currentUser} >
{/* ... */}
</>
)
}

以及以下ProfileIcon组件

interface ProfileIconProps {
currentUser: ???
}

export default function ProfileIcon(props: ProfileIconProps): JSX.Element {
return (
<div>
<img src={props.currentUser.profileImageUrl} />
</div>
)
}

我的主要问题是关于 ProfileIcon 组件中 currentUser 属性的类型。尽管请求的数据非常相似并且显然与由于这个组件。

除了这样的事情之外,还有什么推荐的方法来处理这个问题吗?

interface ProfileIconProps {
currentUser: Omit<ProfilePage_currentUser, ' $refType'>
}

最佳答案

在 Relay 中手动提取数据并将其作为 prop 传递给组件并不是一个好的做法。相反,您应该在 ProfileIcon 组件上有一个片段,并让 Relay 负责将相同的数据传递到您的组件。

因此,您需要在 ProfileIcon 组件中创建一个片段并查询 profileImageUrl 然后将此片段添加到 HomePage_currentUserProfilePage_currentUser 片段中并中继我们将为您处理剩下的事情。

interface ProfileIconProps {
currentUser: ProfileIcon_currentUser$key | null;
}

const currentUserFragment = graphql`
fragment ProfileIcon_currentUser on User {
profileImageUrl
}
`;


export default function ProfileIcon(props: ProfileIconProps): JSX.Element {
const currentUser = useFragment(currentUserFragment, props.currentUser);

return (
<div>
<img src={props.currentUser.profileImageUrl} />
</div>
)
}

在 HomePage 组件中添加 ProfileIcon_currentUser 片段

const currentUserFragment = graphql`
fragment HomePage_currentUser on User {
id
items {
id
name
}
...ProfileIcon_currentUser
}

`;

在ProfilePage组件中添加ProfileIcon_currentUser片段

 const currentUserFragment = graphql`
fragment ProfilePage_currentUser on User {
id
lastLoggedInTimestamp
...ProfileIcon_currentUser
}
`;

使用此模式的优点之一是,如果您在其他地方(即使不在同一 react 节点树层次结构内)对 User 进行了突变,并且假设您更改 profileImageUrl,然后 ProfileIcon 将自动接收新的 profileImageUrl,而无需您传递 profileImageUrl 的新值。事实上,中继存储将使用突变负载上的新值进行更新,并且一旦存储中有新的更新,它将将该数据传递给正在使用该数据的任何组件。

关于reactjs - 使用 React/Relay/Typescript 跨片段重用组件的最佳实践是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65819841/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com