在 React 中使用模态的项目列表上打开模态
Open modal on a list of items with modals in React
我有一个项目列表,列表中的每个项目都有一个打开模式的按钮。
我的问题是我认为我做错了什么,因为当我点击“打开模式”时它不起作用。我已经让它工作了,但是它同时打开了所有模式,我找不到如何修复它。
这里是我的沙箱,包含所有代码:https://codesandbox.io/s/modal-on-list-sjw7u?file=/src/components/TopBar.tsx
我的项目列表位于沙盒的 class MetricsDetailsPage
中,我在此 class 上称为模态的部分是这样完成的:
<FiltersAddition
dimension={dimension}
isModalOpen={isShowing}
toggle={toggle}
/>
<Button onClick={toggle}> Instantiate </Button>
我的问题是,如果您在我的代码沙箱上打开“https://sjw7u.csb.app/metric/test”并单击“实例化”按钮,您将看到模式被复制列表中的每个项目,我只想显示被点击项目的模态(一次一个)。
以后,宁愿在问题中包含相关的、有问题的代码。
问题是您在每次迭代中都包含模态,并且没有父状态来控制一次显示哪个模态。
我建议您修改挂钩并从共享父状态使用它:
import { useState } from 'react';
import { IDimension } from '../model/metric';
const useModal = () => {
// store which has been selected
const [selected, setSelected] = useState<IDimension>();
const [isShowing, setIsShowing] = useState<boolean>(false);
const open = (dimension: IDimension) => {
setSelected(dimension);
setIsShowing(true);
};
const close = () => {
setSelected(null);
setIsShowing(false);
};
return {
isShowing,
open,
close,
selected
};
};
export default useModal;
然后将模态框移出循环:
<TableBody>
{metric?.dimensions.map((dimension) => (
<TableRow key={dimension.name}>
<TableCell>{dimension.name}</TableCell>
<TableCell>{dimension.value_type}</TableCell>
<TableCell>{dimension.doc ? dimension.doc : 'No description available'}</TableCell>
<TableCell>
<Button onClick={() => open(dimension)}> Instantiate </Button>
</TableCell>
</TableRow>
))}
</TableBody>
</Table>
{/* outside the loop */}
<FiltersAddition dimension={selected} isModalOpen={isShowing} close={close} />
我有一个项目列表,列表中的每个项目都有一个打开模式的按钮。
我的问题是我认为我做错了什么,因为当我点击“打开模式”时它不起作用。我已经让它工作了,但是它同时打开了所有模式,我找不到如何修复它。
这里是我的沙箱,包含所有代码:https://codesandbox.io/s/modal-on-list-sjw7u?file=/src/components/TopBar.tsx
我的项目列表位于沙盒的 class MetricsDetailsPage
中,我在此 class 上称为模态的部分是这样完成的:
<FiltersAddition
dimension={dimension}
isModalOpen={isShowing}
toggle={toggle}
/>
<Button onClick={toggle}> Instantiate </Button>
我的问题是,如果您在我的代码沙箱上打开“https://sjw7u.csb.app/metric/test”并单击“实例化”按钮,您将看到模式被复制列表中的每个项目,我只想显示被点击项目的模态(一次一个)。
以后,宁愿在问题中包含相关的、有问题的代码。
问题是您在每次迭代中都包含模态,并且没有父状态来控制一次显示哪个模态。
我建议您修改挂钩并从共享父状态使用它:
import { useState } from 'react';
import { IDimension } from '../model/metric';
const useModal = () => {
// store which has been selected
const [selected, setSelected] = useState<IDimension>();
const [isShowing, setIsShowing] = useState<boolean>(false);
const open = (dimension: IDimension) => {
setSelected(dimension);
setIsShowing(true);
};
const close = () => {
setSelected(null);
setIsShowing(false);
};
return {
isShowing,
open,
close,
selected
};
};
export default useModal;
然后将模态框移出循环:
<TableBody>
{metric?.dimensions.map((dimension) => (
<TableRow key={dimension.name}>
<TableCell>{dimension.name}</TableCell>
<TableCell>{dimension.value_type}</TableCell>
<TableCell>{dimension.doc ? dimension.doc : 'No description available'}</TableCell>
<TableCell>
<Button onClick={() => open(dimension)}> Instantiate </Button>
</TableCell>
</TableRow>
))}
</TableBody>
</Table>
{/* outside the loop */}
<FiltersAddition dimension={selected} isModalOpen={isShowing} close={close} />