【问题标题】:Switching React components切换 React 组件
【发布时间】:2020-02-07 18:30:58
【问题描述】:

我想在组件之间进行切换。有两个组件,比如说组件 A 和组件 B。组件 A 是组件 B 的父组件。我可以根据一些状态更改来管理从 A 到 B 的切换。同时,我想在 B 组件的一些状态变化的基础上切换回组件 A。现在,问题是:

问。我在 A 中导入 B 组件。那么,我应该在 B 中导入 A 还是 child ? 听起来可能很幼稚,但我是初学者。

同时,我不确定这是否是一个好方法?有什么好的处理方法。我已经看到了一些问题,用于切换涉及第三个组件的位置,并将其余两个组件导入其中。 请建议我处理它。

示例: 组件A

import B from './B.js';

class A extends React.Component{
constructor(props, context){
        super(props, context);
         this.state = {
                 showB: false
         }
    }
onClick = () =>{
this.setState({ 
            showB: true
            });
}
render(){
return(
{
 this.state.showB ? <B /> : 
<div>
<Button onClick={this.onClick}>VIEW B </Button>
</div>
<h1>I am component A</h1>
)
}

}

组件 B

class B extends React.Component{
constructor(props, context){
        super(props, context);
         this.state = {
                 showA: false
         }
    }
onClick = () =>{
this.setState({ 
            showA: true
            });
}
render(){
return(
{
 this.state.showA ? <A /> : 
<div>
<Button onClick={this.onClick}>VIEW A </Button>
</div>
<h1>I am component B</h1>
)
}

}

【问题讨论】:

  • “切换”到底是什么意思?你能提供一个Minimal, Reproducible Example吗?这将使您更容易理解您的问题并提供答案。
  • @Meana 你能提一下你的代码的一些 sn-p 吗?
  • 可能你可以参考:reactjs.org/docs/higher-order-components.html。使用高阶组件,您可以为两个组件设置一个状态,并通过传递道具有条件地渲染它们。
  • @Luze 示例添加

标签: reactjs


【解决方案1】:

您应该创建一个名为 C 的父组件,在该组件中您可以同时导入 AB 并使用相同的逻辑来显示 A 还是 B。所以它应该类似于

import B from './B.js';
import A from './A.js';

class C extends React.Component{
constructor(props, context){
        super(props, context);
         this.state = {
                 showA: false,
                 showB: false
         }
    }
onClickA = () =>{
this.setState({ 
            showA: true
            });
}
onClickB = () =>{
    this.setState({ 
                showB: true
                });
    }
render(){
return(
{
 this.state.showA ? <A /> : (
<div>
<Button onClick={this.onClickA }>VIEW B </Button>
</div>
)

}
{
 this.state.showB ? <B /> : (
<div>
<Button onClick={this.onClickB }>VIEW B </Button>
</div>
)

}

}

替代方法 如果您不想创建另一个组件。您可以做的是,当您显示 B 时,您不会渲染任何其他 A 组件。只有一个按钮会在这两种情况下呈现以切换组件。可能是这样的:

import B from './B.js';

class A extends React.Component{
constructor(props, context){
        super(props, context);
         this.state = {
                 showB: false
         }
    }
onClick = () =>{
this.setState({ 
            showB: !this.state.showB
            });
}
render(){
return(
{
 this.state.showB ? <B /> : (
<div>
/* content of A*/
</div>
)
<Button onClick={this.onClick }>VIEW B </Button>

}


}

【讨论】:

  • 感谢您的回复。是的,我看到它可以通过添加第三个组件来完成。但我不需要那个。我希望 A 成为我的父组件。不添加第三个组件就不可能吗?
  • 为了澄清您将显示 B 并且在显示 B 时不会显示任何 A 内容对吗?
  • 它会导致永无止境的嵌套和错误:A包含B,渲染A,渲染B,一遍又一遍地渲染A......
  • 我编辑了我的答案@Meana 并且创建第三个组件将是理想的方法。
  • @octobus 在您的第二个答案中,是的,它可以再次用于单向导入...我经常需要根据不同的状态变化在两个组件之间切换。这两个组件具有不同的切换按钮和不同的状态条件。无论如何,谢谢。
【解决方案2】:

您应该将 onClick 函数传递给您的按钮,而不是状态。

...
<Button onClick={this.onClick}>VIEW A </Button>
...

这是工作示例:

https://codesandbox.io/s/jovial-sanderson-ntu69

在 B 中包含 A 和在 A 中包含 B 是个坏主意,因为它们之间的嵌套永无止境。 A 包括 B,它渲染 A,那个渲染 B,那个渲染 A 等等......

【讨论】:

  • 是的,我更新了。这是我在编写示例时犯的一些错误。谢谢
  • 附例
  • 您是否可以在我的代码中写下您的示例。它看起来很有希望,但我无法确定我应该在哪里编写这些函数 const A = proops =&gt; { } 等。另外,你也在使用 {useState}
  • const A 和 const B - 可以从 index.js 文件外部导出,作为独立组件。我刚刚更新了与您的代码样式相对应的示例codesandbox.io/s/jovial-sanderson-ntu69
  • 它仍然像将 A 和 B 导入第三次一样,我不需要。无论如何,非常感谢您的努力!
猜你喜欢
  • 2021-02-04
  • 2020-11-03
  • 2018-02-21
  • 2021-06-11
  • 2022-01-07
  • 2019-12-07
  • 2020-04-17
  • 2023-03-16
  • 2016-03-08
相关资源
最近更新 更多