как отобразить компонент из .map() в react

#javascript #reactjs #material-ui #jsx

#javascript #reactjs #материал-пользовательский интерфейс #jsx

Вопрос:

Итак, я пытаюсь не дублировать код и, вероятно, усложнять это, но мне очень любопытно, есть ли способ, чтобы такая система работала

         <Drawer anchor="right" open={sideBarOpen} onClose={toggleSideBar}>
          <List className={classes.sideBar}>
            {[
              ["test1", <LockOpenIcon />],
              ["test2", <LockOpenIcon />],
              ["test2", <LockOpenIcon />],
            ].map(({ text, icon }, index) => (
              <Fragment key={index}>
                <ListItem button>
                  <ListItemIcon>{icon}</ListItemIcon>
                  <ListItemText primary={text} />
                </ListItem>
                <Divider />
              </Fragment>
            ))}
          </List>
        </Drawer
 

где я сопоставляю массив пар [text, iconComponent], а затем отображаю iconComponent в следующем элементе. это не приводит к ошибкам (но также и не отображает ничего в), и если нет способа, то это круто, но любая помощь будет признательна.

Ответ №1:

Да, это возможно, и вы в основном сделали это правильно. Вы только что использовали деструктурирование объекта ( {text, icon} ), где вы должны были использовать итеративное деструктурирование ( [text, icon] ):

 <Drawer anchor="right" open={sideBarOpen} onClose={toggleSideBar}>
    <List className={classes.sideBar}>
        {[
            ["test1", <LockOpenIcon />],
            ["test2", <LockOpenIcon />],
            ["test2", <LockOpenIcon />],
        ].map(([ text, icon ], index) => (
            <Fragment key={index}>
                <ListItem button>
                    <ListItemIcon>{icon}</ListItemIcon>
                    <ListItemText primary={text} />
                </ListItem>
                <Divider />
            </Fragment>
        ))}
    </List>
</Drawer>
 

Однако, если значения жестко закодированы подобным образом, вы можете рассмотреть возможность абстрагирования повторяющейся части этого в свой собственный компонент:

 const MyListItem = React.memo(({text, icon}) => (
    <ListItem button>
        <ListItemIcon>{icon}</ListItemIcon>
        <ListItemText primary={text} />
    </ListItem>
));
 

( React.memo Это просто потому, что я полагаю, что это не изменится, если text icon не изменится или.)

Тогда это:

 <Drawer anchor="right" open={sideBarOpen} onClose={toggleSideBar}>
    <List className={classes.sideBar}>
        <MyListItem text="test1" icon={<LockopenIcon/>} />
        <Divider />
        <MyListItem text="test2" icon={<LockopenIcon/>} />
        <Divider />
        <MyListItem text="test3" icon={<LockopenIcon/>} />
    </List>
</Drawer>
 

Комментарии:

1. :facepalm: Я надеялся, что это не было чем-то настолько очевидным, ха-ха, в любом случае, спасибо за помощь и советы, я удалю это в отдельный компонент.