当前位置: 首页 > 知识库问答 >
问题:

React router:仅在现有视图上渲染新组件

安博文
2023-03-14

我试图在两个页面之间切换,但在学习时遇到了许多问题react router

在我的App.js中,有一个底部,单击该底部可将我导航到Cart

  render()  {
    return (
      <div>
        <button type="button" className="btn btn-primary Bottom-right " onClick={(e) => this.handleSubmit(e)}>
              Confirmed Order
        </button>
        <button type="button" className="btn btn-Primary">
          <Link to="/displayCart" >Show Car</Link>
        </button>
      </div>
    );
  }
}

export default App;

在我的购物车组件中,还有一个类似的按钮,navigtaes会将我返回到App组件。

class Cart extends React.Component {
    constructor(props){
        super(props)

        this.state={
            cartData:null
        }
    }

    componentDidMount() {
        this.callApi()
          .then(res => this.setState({ cartData: res.express}))
          .catch(err => console.log(err));
      }

      callApi = async () => {
          const response = await fetch('/myCart');
          const body = await response.json();
          if (response.status !== 200) throw Error(body.message);

          return body;
      };

    render(){
        return(
            <div className="col">
            <div className="App">
                <header className="App-header">
                    <img src={logo} className="App-logo" alt="logo" />
                    <h1 className="App-title">Welcome to Shopping Center</h1>
                </header>
            </div>
                <div>{ReactHtmlParser(this.state.cartData)}</div>
                <button type="button Bottom-right" className="btn btn-Primary">
                    <Link to="/" >Keep Shopping</Link>
                </button>
            </div>
        )
    }
}

My index.js包含两个组件,app js是默认组件。

    ReactDOM.render(
        <BrowserRouter>
            <switch>
                <div>
                    <Route exact path="/displayCart" component={Cart}/>
                    <Route component={App} />
                </div>
            </switch>
        </BrowserRouter>,
        document.getElementById('root')
    );

现在,它们在许多层面上都是真正的缺陷:

1:当我单击show cart时,而不是渲染新视图。购物车组件在视图顶部呈现,应用程序仍然呈现。

2:单击Show Cart后,我单击Show应用程序返回到我的应用程序组件,但控制台显示:

Warning: Can't call setState (or forceUpdate) on an unmounted component. This is a no-op, but it indicates a memory leak in your application. To fix, cancel all subscriptions and asynchronous tasks in the componentWillUnmount method.
    in Cart (created by Route)

3:如果我更改了App组件中的状态,当我从Cart组件返回到App组件时,状态没有刷新。例如(例如,项目中的布尔值“购买”。)当我从应用程序组件从购物车返回时,状态保持为true,相反,我希望它回到初始状态。

我遵循了教程,但它只是坏了。我到底做错了什么

共有1个答案

公冶麒
2023-03-14

因此,警告是因为setState正在被

您应该跟踪Cart何时卸载。

您可以通过在购物车组件中创建一个变量,例如\u isMounted,然后使用生命周期事件组件将卸载来跟踪。

componentWillUnmount(){
   _isMounted =false
}

然后在使用setState之前,快速检查以确保\u isMounted为真。

this.callApi()
          .then(res => if(isMounted){
                         this.setState({ cartData: res.express}))
                       }
          .catch(err => console.log(err));

显然,您还需要使用ComponentDidMount\isMounted更改为true

这里有一篇关于这个话题的文章

关于应用程序的状态不'刷新'...这是因为应用程序组件永远不会卸载和再次安装,因为你从应用程序

要解决此问题,请告诉开关仅装载

        <switch>
            <div>
                <Route exact path="/displayCart" component={Cart}/>
                <Route exact path="/" component={App} />
            </div>
        </switch>

现在,如果您想跟踪状态更改,即使在API调用完成之前关闭(卸载),那么您应该在

不过,只有当你把你的东西放在

我这样做的方式是:-index.js总是加载-在我的内部,然后重定向到显示正确的组件

这意味着它始终处于安装状态。但是,它允许我使用应用程序的状态作为默认的“主”状态,因为我从未卸载它,所以它始终存在。所以如果我有一个子组件,比如。。。我可以给Cart一个函数。无论是否仍安装/显示,此功能都将更改中的状态。

如果你像这样重新构造你的应用程序,那么你可以做以下事情:

App.js添加一个将改变其状态的函数。

changeState(key, value){
   this.setState({
      key : value
   }
}

现在把这个函数作为道具传递出去

    <BrowserRouter>
        <switch>
            <div>
                <Route exact 
                       path="/displayCart" 
                       render={
                         (props) => <Cart {...props} 
                         changeStateinApp={this.changeState} /> 
                       }
                  />
                <Route component={App} />
            </div>
        </switch>
    </BrowserRouter>,

Cart.js现在调用这个函数

this.callApi()
          .then(res => 
              this.props.changeStateinApp(cartData, res.express)
          .catch(err => console.log(err));

 类似资料:
  • Blade 内部内置了一个非常简单的模板渲染引擎,如果你有一些简单的页面需要渲染可以试试它(生产环境不适用)。 渲染一个模板需要遵守一条准则: 所有的模板文件都存储在 resources/templates 目录下 你可以调用 Response 方法的 render 方法渲染或者返回一个 String 类型的视图路径。 @GetRoute("/index") public void renderI

  • 因为新版的控制器可以无需继承任何的基础类,因此在控制器中如何使用视图取决于你怎么定义控制器。 模板渲染 渲染模板最常用的是控制器类在继承系统控制器基类(\think\Controller)后调用fetch方法,调用格式: fetch('[模板文件]'[,'模板变量(数组)']) 模板文件的写法支持下面几种: 用法 描述 不带任何参数 自动定位当前操作的模板文件 [模块@][控制器/][操作] 常用

  • 我对react还比较陌生,我一直在分解一个web应用程序,并用react组件替换部分。我现在正在开发一个组件,其中包含我创建的几个不同组件。 在新组件中,我在componentDidMount函数中进行API调用,并创建子组件。乍一看,一切看起来都很完美,但当我们在其中一个子组件中进行状态更改,然后在父组件中进行更改时,子组件将其状态重置为更改之前的状态。 我知道发生了什么,州政府没有被传递给家长

  • 我试图用ajax更新一个有条件渲染的组件。 但是,这不起作用。我可以保证实际上是可用的。这是如何造成的,我如何解决它?

  • 渲染某个变量 假定我们定义了一个变量:  <script> export default { data () { return { my_value: '默认值', } }, } </script> 我们就可以这样来显示它:  <div>{{my_value}}</div> 方法的声明和调用 声明一个方法: show_my_value <script> ex

  • 问题内容: 我正在AngularJS中构建仪表板系统,但遇到通过设置URL的问题 在我们的仪表板中,我们有一堆小部件。单击它们时,每个视图都会显示一个更大的最大化视图。我们正在尝试设置深层链接,以允许用户使用最大化的小部件链接到仪表板。 目前,我们有2条路线看起来像和 当用户最大化窗口小部件时,我们使用来更新url ,但这会导致视图重新呈现。由于我们拥有所有数据,因此我们不想重新加载整个视图,我们