亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何在反應中修復抽屜內的列表項

如何在反應中修復抽屜內的列表項

飲歌長嘯 2022-12-02 15:58:30
幾天前,我在這里發布了一個問題:如何在反應中使用單一方法擴展更多/更少的一個ListItem我在這里得到了一個不完整的答案,我接受了(不知道我為什么這樣做,看起來它一開始就起作用了)。我不得不承認我在這里的問題可能有點不清楚。所以,長話短說,我想修復抽屜內的列表項以使其正常工作。我的意思是:當我點擊可擴展項目時,它應該只擴展那個(點擊的)項目。(這是有效的)當我點擊另一個可擴展項目時,它應該展開那個項目,但關閉之前打開的。(不工作)當我單擊可擴展項目內的項目時(在所有情況下都是查看或添加),它不應關閉該可擴展項目。(不工作,現在正在關閉所有項目)這是我的助手可擴展項目組件的代碼:import { useState } from "react";const ExpandableItem = props => {  const [open, setOpen] = useState(false);  console.log(props.menuItemName);  return props.render({ open, setOpen });};export default ExpandableItem;我在 material-ui 上搜索并發現了類似的東西,但我無法合并它。這是 material-ui 手風琴的鏈接:https://material-ui.com/components/accordion/如您所見,Customized accordions 的功能與我需要的非常相似。如果展開一個可折疊組,它會顯示內容。如果您之后選擇另一個,它會擴展并顯示內容,并關閉前一個。解決這個問題的最佳解決方案是什么?
查看完整描述

1 回答

?
森欄

TA貢獻1810條經驗 獲得超5個贊

問題是您沒有存儲當前展開的面板名稱(或 ID)


import { useState } from "react";


const ExpandableItem = props => {

    const [itemState, setItemState] = useState({open: false, menuItemName: ""});


    console.log(props.menuItemName);

    return props.render({ itemState, setItemState });

};


export default ExpandableItem;

我已將變量 [open, setOpen] 重命名為 [itemState, setItemState],因此需要在其使用的任何地方進行更改,(或者您可以添加單獨的變量來設置當前選定的 menuName)


在您的 ExpandableItemContainer 中,在 onClick 處理程序中傳遞適當的值 xprops.setItemState({open:!xprops.itemState.open, menuItemName}})


同樣在 Collapse 組件中將 in Prop 更改為


in={xprops.itemState.open && menuItemName === xprops.itemState.menuItemName}


  const ExpandableItemContainer = ({

    icon,

    menuItemName,

    firstItemName,

    firstItemLink,

    secondItemName,

    secondItemLink,

  }) => (

    <ExpandableItem

      render={(xprops) => (

        <>

          <ListItem button 

            onClick={

              (menuItemName) => xprops.setItemState({open:!xprops.itemState.open, menuItemName}})

            }

          >

            <ListItemIcon>{icon}</ListItemIcon>

            <ListItemText primary={menuItemName} />

            {xprops.open ? <ExpandLess /> : <ExpandMore />}

          </ListItem>

          <Collapse in={xprops.itemState.open} timeout="auto" unmountOnExit>

            <List component="div" disablePadding>

              <ListItem

                button

                className={classes.nested}

                component={Link}

                to={firstItemLink}

              >

                <ListItemIcon>

                  <VisibilityIcon />

                </ListItemIcon>

                <ListItemText primary={firstItemName} />

              </ListItem>

              <ListItem

                button

                className={classes.nested}

                component={Link}

                to={secondItemLink}

              >

                <ListItemIcon>

                  <AddIcon />

                </ListItemIcon>

                <ListItemText primary={secondItemName} />

              </ListItem>

            </List>

          </Collapse>

        </>

      )}

    />

  );

如果您想切換選擇,您需要將狀態保持在頂層(列表而不是 listItem 級別,如下所示


export default function SideBar() {

const classes = useStyles();

const gymId = 1;

const [itemState, setItemState] = React.useState({

    open: false,

    menuItemName: ""

});


const NonExpandableItemContainer = ({ icon, menuItemName, menuItemLink }) => (

    <ListItem button component={Link} to={menuItemLink}>

    <ListItemIcon>{icon}</ListItemIcon>

    <ListItemText primary={menuItemName} />

    </ListItem>

);


const ExpandableItemContainer = ({

    icon,

    menuItemName,

    firstItemName,

    firstItemLink,

    secondItemName,

    secondItemLink

}) => (

    <ExpandableItem

    render={xprops => (

        <>

        <ListItem

            button

            onClick={() =>

            setItemState({

                open:

                menuItemName === itemState.menuItemName

                    ? !itemState.open

                    : true,

                menuItemName

            })

            }

        >

            <ListItemIcon>{icon}</ListItemIcon>

            <ListItemText primary={menuItemName} />

            {itemState.open ? <ExpandLess /> : <ExpandMore />}

        </ListItem>

        <Collapse

            in={itemState.open && menuItemName === itemState.menuItemName}

            timeout="auto"

            unmountOnExit

        >

            <List component="div" disablePadding>

            <ListItem

                button

                className={classes.nested}

                component={Link}

                to={firstItemLink}

            >

                <ListItemIcon>

                <VisibilityIcon />

                </ListItemIcon>

                <ListItemText primary={firstItemName} />

            </ListItem>

            <ListItem

                button

                className={classes.nested}

                component={Link}

                to={secondItemLink}

            >

                <ListItemIcon>

                <AddIcon />

                </ListItemIcon>

                <ListItemText primary={secondItemName} />

            </ListItem>

            </List>

        </Collapse>

        </>

    )}

    />

);


return (

    <Drawer

    className={classes.drawer}

    variant="permanent"

    classes={{

        paper: classes.drawerPaper

    }}

    >

    <Toolbar />

    <div className={classes.drawerContainer}>

        <List

        component="nav"

        aria-labelledby="nested-list-subheader"

        className={classes.root}

        >

        <NonExpandableItemContainer

            icon={<HomeIcon />}

            menuItemName="Home"

            menuItemLink={"/gym/" + gymId + "/home"}

        />

        <ExpandableItemContainer

            icon={<SupervisorAccountIcon />}

            menuItemName="Administrators"

            firstItemName="View"

            firstItemLink={"/gym/" + gymId + "/viewAccount"}

            secondItemName="Add"

            secondItemLink={"/gym/" + gymId + "/addAccount"}

        />

        <ExpandableItemContainer

            icon={<AccessibilityNewIcon />}

            menuItemName="Trainers"

            firstItemName="View"

            firstItemLink={"/gym/" + gymId + "/viewAccount"}

            secondItemName="Add"

            secondItemLink={"/gym/" + gymId + "/addAccount"}

        />

        <ExpandableItemContainer

            icon={<FaceIcon />}

            menuItemName="Members"

            firstItemName="View"

            firstItemLink={"/gym/" + gymId + "/viewAccount"}

            secondItemName="Add"

            secondItemLink={"/gym/" + gymId + "/addAccount"}

        />

        <ExpandableItemContainer

            icon={<FitnessCenterIcon />}

            menuItemName="Trainings"

            firstItemName="View"

            firstItemLink={"/gym/" + gymId + "/viewTrainings"}

            secondItemName="Add"

            secondItemLink={"/gym/" + gymId + "/addTraining"}

        />

        <NonExpandableItemContainer

            icon={<EventIcon />}

            menuItemName="Training schedules"

            menuItemLink={"/gym/" + gymId + "/viewTrainingSchedules"}

        />

        <ExpandableItemContainer

            icon={<PanoramaWideAngleIcon />}

            menuItemName="Halls"

            firstItemName="View"

            firstItemLink={"/gym/" + gymId + "/viewHalls"}

            secondItemName="Add"

            secondItemLink={"/gym/" + gymId + "/addHall"}

        />

        <ExpandableItemContainer

            icon={<ReceiptIcon />}

            menuItemName="Pricelist"

            firstItemName="View"

            firstItemLink={"/gym/" + gymId + "/viewPricelist"}

            secondItemName="Add"

            secondItemLink={"/gym/" + gymId + "/addPricelistItem"}

        />

        <NonExpandableItemContainer

            icon={<PhoneIcon />}

            menuItemName="Contact"

            menuItemLink={"/gym/" + gymId + "/contact"}

        />

        <NonExpandableItemContainer

            icon={<SettingsIcon />}

            menuItemName="Settings"

            menuItemLink={"/gym/" + gymId + "/settings"}

        />

        </List>

    </div>

    </Drawer>

);

}

codesandbox鏈接:https ://otzsl.csb.app/


查看完整回答
反對 回復 2022-12-02
  • 1 回答
  • 0 關注
  • 98 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號