反应组件。渲染特定元素

React component. Render specific element

目前我有一个组件 User,它呈现 2 个元素 -> usernameavatar. 我完美地获取了用户名和头像,但我只想查看 用户名 only

有没有办法只获取 username 元素?没有头像。

//User component
const User = ({ username, profilePic }) => {
  return (
    <React.Fragment>
      <Avatar name='user' src={profilePic.profile.image} alt="user_image" ml="5"/>
      <Heading size={'sm'} ml="5">{username.username}</Heading>
    </React.Fragment>
  );
};


// Content Page
{group.members.map(member => {
 return <React.Fragment key={member.id}>
    <User username={member.user} profilePic={member.user}/>
      </React.Fragment>
 })}


您可以添加一个额外的道具 renderAvatar,并且仅在布尔值为 true 且具有条件渲染的情况下才显示头像。

const User = ({ username, profilePic, renderAvatar }) => {
  return (
    <React.Fragment>
      {renderAvatar && <Avatar name='user' src={profilePic.profile.image} alt="user_image" ml="5"/>}
      <Heading size={'sm'} ml="5">{username.username}</Heading>
    </React.Fragment>
  );
};

你可以这样使用它。

<User username={member.user} profilePic={member.user} renderAvatar={false} />
<User username={member.user} profilePic={member.user} renderAvatar={true} />

或者只创建一个只呈现 Heading.

的组件
const UserWithoutAvatar = ({ username }) => {
  return <Heading size={'sm'} ml="5">{username.username}</Heading>
};

一种选择是根据是否提供 profilePic 有条件地呈现。例如:

return (
  <React.Fragment>
    { profilePic ?
        <Avatar name='user' src={profilePic.profile.image} alt="user_image" ml="5"/>
      : null
    }
    <Heading size={'sm'} ml="5">{username.username}</Heading>
  </React.Fragment>
);

那么如果你不提供 profilePic 它将是 undefined:

<User username={member.user} />

顺便说一句,代码似乎在命名方面产生了混乱。例如:

{username.username}

一个叫做“用户名”的属性表示它是一个代表用户名的字符串。但是在这种情况下 username 是一个包含一个名为 username 的 属性 的对象吗? that 属性 是否包含字符串?还是其他对象?

或在这里:

<User username={member.user} profilePic={member.user}/>

什么是member.user?是用户名吗?这是个人资料照片吗?不知何故两者兼而有之?

清晰度很重要。如果您实际传递给组件的是 user 对象,那么将其命名为:

<User user={member.user} />

或者,如果组件需要 username 的字面值和 profilePic 的字面值,则将这些值传递给它:

<User username={member.user.username} profilePic={member.user.profile.image} />

不要混淆你的语义。混乱导致错误。