路由反应组件什么时候挂载和卸载?

时间:2020-12-26 09:14:22

标签: reactjs react-router-dom

我正在为我将从事的项目测试 react-router-dom 行为。我一直在查看组件安装行为,但遇到了一个无法解释的问题。我在他们的文档中找到的最接近的解释是:

"当您使用组件(而不是渲染或子组件,下面)时,路由器使用 React.createElement 从给定组件创建一个新的 React 元素。这意味着如果您向组件 prop 提供内联函数,您将创建每次渲染都会有一个新组件。这会导致现有组件卸载并安装新组件,而不仅仅是更新现有组件。使用内联函数进行内联渲染时,请使用渲染或 children 属性(如下)。”

我从中得到的是,如果我向路由提供反应组件(而不是内联函数)作为路由组件,它应该只安装一次,然后更新安装的组件。在下面的代码片段中,看起来 Interval 组件再次被挂载,但从未卸载。看起来该组件每次都被重新挂载,就好像我传递了一个内联函数。< /p>

这是预期的行为吗?

如果是,我正在寻找不同的行为,无论是单次装载,还是在不再呈现组件时卸载。 react-router-dom 可以实现吗?

import React from 'react'
import {
  BrowserRouter as Router,
  Link,
  Switch,
  Route,
} from "react-router-dom";
import { Container, Col, Row } from 'reactstrap'

function RouteLinks() {
  return (
    <div>
      <div>
        <Row>
          <Col>
            <li>
              <Link to="/">None</Link>
            </li>
          </Col>
          <Col>
            <li>
              <Link to="/interval">interval</Link>
            </li>
          </Col>
          <Col>
            <li>
              <Link to="/about">about</Link>
            </li>
          </Col>
        </Row>
      </div>
    </div>
  );
}

export default function PageRouter() {
  return (
    <Container fluid={true}>
    <Router>
      <RouteLinks />
      <Switch>
        <Route exact path="/" component={Main} />
        <Route path="/interval" component={Interval} />
        <Route path="/about" component={About} />
      </Switch>
    </Router>
    </Container>
  );
}

const Main = () => {
  return (
    <div>Main!</div>
  )
}

const About = () => {
  return (
    <div>About!</div>
  )
}
class Interval extends React.Component {
  componentDidMount() {
    this.interval = setInterval(() => {
      console.log('ticking')
    }, 1000)
    console.log('mounted')
  }
  componentWilUnmount() {
    console.log('unmounting')
    clearInterval(this.interval)
  }
  render() {
    return (
      <p>Interval</p>
    )
  }
}

0 个答案:

没有答案