使用反应挂钩禁用相邻的选项卡
disabling adjacent tabs using react hooks
当我单击第一个选项卡中的第一项按钮时,它应该会禁用接下来的两个选项卡。
当我再次点击它时,它应该会启用其他两个选项卡。
其他选项卡应具有相同的功能。
现在我通过禁用 属性.
禁用了第二个选项卡
你们能告诉我如何解决它吗?
在下面提供我的代码片段和沙箱。
https://codesandbox.io/s/material-demo-ulrv5
export default function SimpleTabs() {
const classes = useStyles();
const [value, setValue] = React.useState(0);
function handleChange(event, newValue) {
setValue(newValue);
}
function selectButton(e) {
//const selectedButton = e.currentTarget;
const selectedButton = e.target;
console.log("selectedButton--->", selectedButton);
this.setState({ selectedButton: false });
}
return (
<div className={classes.root}>
<AppBar position="static">
<Tabs value={value} onChange={handleChange}>
<Tab label="Item One" />
<Tab label="Item Two" disabled />
<Tab label="Item Three" />
</Tabs>
</AppBar>
{value === 0 && (
<TabContainer>
Item One
<Button
variant="contained"
color="primary"
className={classes.button}
onClick={selectButton}
>
item one
</Button>
</TabContainer>
)}
{value === 1 && (
<TabContainer>
<Button
variant="contained"
color="primary"
className={classes.button}
onClick={selectButton}
>
item one
</Button>
</TabContainer>
)}
{value === 2 && (
<TabContainer>
<Button
variant="contained"
color="primary"
className={classes.button}
onClick={selectButton}
>
item one
</Button>
</TabContainer>
)}
</div>
);
}
写一个函数,return 相应地禁用文本或空字符串,并根据条件
编写 {this.getClass()}
而不是禁用
如果我没理解错的话,您基本上需要一个布尔变量,因此单击内部按钮将切换它。
如果是这样,就像@charlietfl 提到的那样,您不能在函数组件中使用 this.setState
但使用 useState
您可以设置状态,即使使用方法(第二个参数)你从 useState
.
获取
所以解决方案是初始化变量:
const [isDisabled, disableButtons] = React.useState(true);
将条件 disabled
属性设置为第二个和第三个选项卡
<Tab label="Item Two" disabled={isDisabled} />
<Tab label="Item Three" disabled={isDisabled} />
然后在 selectButton()
函数中切换它
function selectButton() {
//const selectedButton = e.currentTarget;
disableButtons(!isDisabled);
// this.setState({ selectedButton: false });
}
当我单击第一个选项卡中的第一项按钮时,它应该会禁用接下来的两个选项卡。
当我再次点击它时,它应该会启用其他两个选项卡。
其他选项卡应具有相同的功能。
现在我通过禁用 属性.
禁用了第二个选项卡你们能告诉我如何解决它吗? 在下面提供我的代码片段和沙箱。
https://codesandbox.io/s/material-demo-ulrv5
export default function SimpleTabs() {
const classes = useStyles();
const [value, setValue] = React.useState(0);
function handleChange(event, newValue) {
setValue(newValue);
}
function selectButton(e) {
//const selectedButton = e.currentTarget;
const selectedButton = e.target;
console.log("selectedButton--->", selectedButton);
this.setState({ selectedButton: false });
}
return (
<div className={classes.root}>
<AppBar position="static">
<Tabs value={value} onChange={handleChange}>
<Tab label="Item One" />
<Tab label="Item Two" disabled />
<Tab label="Item Three" />
</Tabs>
</AppBar>
{value === 0 && (
<TabContainer>
Item One
<Button
variant="contained"
color="primary"
className={classes.button}
onClick={selectButton}
>
item one
</Button>
</TabContainer>
)}
{value === 1 && (
<TabContainer>
<Button
variant="contained"
color="primary"
className={classes.button}
onClick={selectButton}
>
item one
</Button>
</TabContainer>
)}
{value === 2 && (
<TabContainer>
<Button
variant="contained"
color="primary"
className={classes.button}
onClick={selectButton}
>
item one
</Button>
</TabContainer>
)}
</div>
);
}
写一个函数,return 相应地禁用文本或空字符串,并根据条件
编写{this.getClass()}
而不是禁用
如果我没理解错的话,您基本上需要一个布尔变量,因此单击内部按钮将切换它。
如果是这样,就像@charlietfl 提到的那样,您不能在函数组件中使用 this.setState
但使用 useState
您可以设置状态,即使使用方法(第二个参数)你从 useState
.
所以解决方案是初始化变量:
const [isDisabled, disableButtons] = React.useState(true);
将条件 disabled
属性设置为第二个和第三个选项卡
<Tab label="Item Two" disabled={isDisabled} />
<Tab label="Item Three" disabled={isDisabled} />
然后在 selectButton()
函数中切换它
function selectButton() {
//const selectedButton = e.currentTarget;
disableButtons(!isDisabled);
// this.setState({ selectedButton: false });
}