MUI (Material UI) Toggle Button Group useState Hook in React.js
MUI (Material UI) Toggle Button Group useState Hook in React.js
我的 App.js 中有以下内容:
import { Box } from "@mui/system";
import Header from "./components/Header";
import ProjectList from "./components/ProjectList";
import CardLayout from "./components/CardLayout";
import React, { useState } from "react";
function App() {
const [view, setView] = useState("list");
const handleView = (event, newView) => {
setView(newView);
};
return (
<Box>
<Header view={view} onChange={handleView} />
<ProjectList />
<CardLayout />
</Box>
);
}
export default App;
目标是在选择具有值列表的切换按钮时仅呈现 ProjectList 组件 <ToggleButton value={props.list}>
并且在选择具有值网格的切换按钮时仅呈现 CardLayout 组件 <ToggleButton value={props.grid}>
我的 Header.js 组件(按钮部分)是这样的:
<ToggleButtonGroup
size="large"
value={props.view}
onChange={props.onChange}
exclusive
>
<ToggleButton value={props.list}>
<TableRowsIcon />
</ToggleButton>
<ToggleButton value={props.grid}>
<GridViewIcon />
</ToggleButton>
</ToggleButtonGroup>
我是否正确地将道具从 parent 传递到 child? setView
函数应该是什么?
您可以简单地使用条件渲染来实现。
例如,在您的 App.js
中,更改为:
<ProjectList />
对此:
{ view == list ?? <ProjectList /> }
仅当 view == list
时才会呈现 <ProjectList />
。您将需要创建另一个状态来处理 CardLayout 渲染。
更多关于条件渲染的信息可以在官方文档中找到:https://beta.reactjs.org/learn#conditional-rendering
- 我认为这段代码
<ToggleButton value={props.list}>
你必须写成 <ToggleButton value='List'>
因为 'list' 的值不是 属性
- 如果您使用 class 组件,请不要忘记 this. 在 header 组件
的道具之前
对于以后阅读本文的任何人,我想通了:
切换按钮组应如下所示:
<ToggleButtonGroup
size="large"
value={props.view}
exclusive
onChange={props.onSetView}
>
<ToggleButton value="list">
<TableRowsIcon />
</ToggleButton>
<ToggleButton value="grid">
<GridViewIcon />
</ToggleButton>
</ToggleButtonGroup>
并且在 App.js 中,setViewHandler 必须具有此 if 条件才能使切换正常工作:
const setViewHandler = (event, newView) => {
if (newView !== null) {
setView(newView);
}
console.log(view);
};
然后,您只需将此函数作为 prop 传递给按钮所在的子组件即可。
我的 App.js 中有以下内容:
import { Box } from "@mui/system";
import Header from "./components/Header";
import ProjectList from "./components/ProjectList";
import CardLayout from "./components/CardLayout";
import React, { useState } from "react";
function App() {
const [view, setView] = useState("list");
const handleView = (event, newView) => {
setView(newView);
};
return (
<Box>
<Header view={view} onChange={handleView} />
<ProjectList />
<CardLayout />
</Box>
);
}
export default App;
目标是在选择具有值列表的切换按钮时仅呈现 ProjectList 组件 <ToggleButton value={props.list}>
并且在选择具有值网格的切换按钮时仅呈现 CardLayout 组件 <ToggleButton value={props.grid}>
我的 Header.js 组件(按钮部分)是这样的:
<ToggleButtonGroup
size="large"
value={props.view}
onChange={props.onChange}
exclusive
>
<ToggleButton value={props.list}>
<TableRowsIcon />
</ToggleButton>
<ToggleButton value={props.grid}>
<GridViewIcon />
</ToggleButton>
</ToggleButtonGroup>
我是否正确地将道具从 parent 传递到 child? setView
函数应该是什么?
您可以简单地使用条件渲染来实现。
例如,在您的 App.js
中,更改为:
<ProjectList />
对此:
{ view == list ?? <ProjectList /> }
仅当 view == list
时才会呈现 <ProjectList />
。您将需要创建另一个状态来处理 CardLayout 渲染。
更多关于条件渲染的信息可以在官方文档中找到:https://beta.reactjs.org/learn#conditional-rendering
- 我认为这段代码
<ToggleButton value={props.list}>
你必须写成<ToggleButton value='List'>
因为 'list' 的值不是 属性 - 如果您使用 class 组件,请不要忘记 this. 在 header 组件 的道具之前
对于以后阅读本文的任何人,我想通了: 切换按钮组应如下所示:
<ToggleButtonGroup
size="large"
value={props.view}
exclusive
onChange={props.onSetView}
>
<ToggleButton value="list">
<TableRowsIcon />
</ToggleButton>
<ToggleButton value="grid">
<GridViewIcon />
</ToggleButton>
</ToggleButtonGroup>
并且在 App.js 中,setViewHandler 必须具有此 if 条件才能使切换正常工作:
const setViewHandler = (event, newView) => {
if (newView !== null) {
setView(newView);
}
console.log(view);
};
然后,您只需将此函数作为 prop 传递给按钮所在的子组件即可。