我正在尝试在我的下一个/反应应用程序中使用 react-tab 实现一些选项卡。
我有主页project/:id
,它总是在 0 索引选项卡中打开,选择每个选项卡时,选项卡名称将添加到路由中,例如:project/:id/one-tab
.
这样,如果我project/:id/two-tab
共享链接,则站点将在 1 索引选项卡中打开。
但是我收到错误
react-dom.development.js:20312 Uncaught Error: Switching between controlled mode (by using
选中索引) and uncontrolled mode is not supported in
选项卡.
at Function.copyPropsToState (Tabs.js:65)
at getDerivedStateFromProps (Tabs.js:50)
我的组件看起来像这样
class Project extends React.Component {
constructor(props) {
super(props);
resetIdCounter();
}
state = {
tabIndex: null
};
static async getInitialProps({ query }) {
return { query };
}
render() {
const { query } = this.props;
const { tabIndex } = this.state;
const TAB = {
tab1: 0,
tab2: 1,
};
return (
<div>
<Tabs
selectedIndex={tabIndex || TAB[query.tab]}
onSelect={index => this.setState({ tabIndex: index })}
>
<StyledTabList>
<StyledTab
onClick={() =>
Router.replaceRoute("one-tab", { id })
}
>
One tab
</StyledTab>
<StyledTab
onClick={() => Router.replaceRoute("two-tab", { id })}
>
Two tab
</StyledTab>
</StyledTabList>
</Tabs>
</div>
);
}
}
export default Project;
使用此库时遇到了同样的错误。我能够通过确保传递给 selectedIndex
prop 的值在 return
函数之前定义(而不是 undefined
或 null
(来解决它。
所以改变这个:
const TAB = {
tab1: 0,
tab2: 1,
};
return (
<div>
<Tabs
selectedIndex={tabIndex || TAB[query.tab]}
onSelect={index => this.setState({ tabIndex: index })}
>
进入这个:
const TAB = {
tab1: 0,
tab2: 1,
};
const selectedIdx = tabIndex ? tabIndex : TAB[query.tab]
return (
<div>
<Tabs
selectedIndex={selectedIdx}
onSelect={index => this.setState({ tabIndex: index })}
>
编辑:您也可以只在构造函数中设置state.tabIndex = 0
,因为 0 索引选项卡是默认选项卡。