首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在使用React时组件的消失--React中的路由器

在使用React时组件的消失--React中的路由器
EN

Stack Overflow用户
提问于 2020-02-20 16:35:58
回答 1查看 3.8K关注 0票数 1

因此,我一直在构建一个React应用程序,并且一直面临着在刷新时组件消失的类似问题,更确切地说,它与react路由器有关,我肯定使用它不正确。

App.js看起来像

代码语言:javascript
复制
import React from "react";
import "./App.css";
import { Home } from "./components/home";

function App() {
 return <Home />;
}

export default App

家庭组件

代码语言:javascript
复制
export class Home extends Component {
render() {
  return (
    <BrowserRouter>
      <NavigationBar />
      <Switch>
        <Route path="/jobPortal" component={JobPortal} />
      </Switch>
    </BrowserRouter>
  );
}

普通海军

代码语言:javascript
复制
const NavigationBar = ({ userType }) => {
  return (
    <Navbar style={globalStyles.container} bg="dark" variant="dark">
      <Navbar.Brand style={globalStyles.container} href="/">
        Soffice
      </Navbar.Brand>
      <Nav className="ml-auto">
        <Nav.Link as={NavLink} to="/JobPortal">
          Job Portal
        </Nav.Link>
        {userType && (
          <Nav.Link as={NavLink} to="/logout">
            Log Out
          </Nav.Link>
        )}

        {!userType && (
          <React.Fragment>
            <Nav.Link as={NavLink} to="/SignUp">
              Sign Up
            </Nav.Link>
            <Nav.Link as={NavLink} to="/SignIn">
              Sign In
            </Nav.Link>
          </React.Fragment>
        )}
      </Nav>
    </Navbar>
  );
};

出口违约NavigationBar;

当我们访问jobPortal时出现的jobPortal

代码语言:javascript
复制
const NavigationBar = ({ url }) => {
  // let {url,url} =useRouteMatch();
  console.log(url);
  return (
    <Navbar style={{ ...globalStyles.container }} bg="info" variant="dark">
      <Nav className="mx-auto">
        <Nav.Link style={styles.navBarColor} as={NavLink} to="/JobPortal">
          Home
        </Nav.Link>
        <Nav.Link style={styles.navBarColor} as={NavLink} to={`${url}/Post`}>
          Post Job
        </Nav.Link>
        <Nav.Link style={styles.navBarColor} as={NavLink} to={`${url}/Want`}>
          Want Job
        </Nav.Link>
        <Nav.Link style={styles.navBarColor} as={NavLink} to={`${url}/Contact`}>
          Contact
        </Nav.Link>
      </Nav>
    </Navbar>
  );
};
const styles = {
  navBarColor: {
    color: "white",
    fontSize: 22
  }
};
export default NavigationBar;

JobPortal组件

代码语言:javascript
复制
export class JobPortal extends Component {
  componentDidMount() {
    console.log("path", this.props.match.url);
  }
  render() {
    const path = this.props.match.path;

    return (
      <BrowserRouter>
        <NavigationBar url={this.props.match.url} />
        <Switch>
          <Route path={`${path}/Want`} component={Want} />
        </Switch>
      </BrowserRouter>
    );
  }
}

想要组件

代码语言:javascript
复制
class Want extends Component {
  constructor(props) {
    super(props);
    this.state = {
      name: "",
      email: "",
      message: "",
      jobs: [
        {
          jobId: 1,
          jobTitle: "software"
        }
      ]
    };
  }

  handleClick() {
    console.log(this.state);
  }
  componentWillMount() {
    this.url = this.props.location.pathname;
    console.log("location", this.props.location.pathname);
  }
  render() {
    const styles = {
      card: {
        width: "14em",
        height: "100%",
        fontSize: 20,
        padding: 10
      }
    };
    return (
      <BrowserRouter>
        <Route path={`${this.url}/:jobId`} component={Job} />
        <Container>
          <Container></Container>
          <Container>
            <Row>
              {this.state.jobs.map((job, index) => (
                <Col style={{ padding: 20 }}>
                  <Card text="white" bg="dark" style={styles.card}>
                    <Card.Body>
                      <Card.Title>
                        <Link to={`${this.url}/${job.jobId}`}>
                          {job.jobTitle}
                        </Link>
                      </Card.Title>
                    </Card.Body>
                  </Card>
                </Col>
              ))}
            </Row>
          </Container>
        </Container>
      </BrowserRouter>
    );
  }
}

export default Want;

正在消失的作业组件

代码语言:javascript
复制
export class Job extends Component {
  render() {
    return <p>this will disappear</p>;
  }
}

完整代码沙箱链接

https://codesandbox.io/s/mystifying-yalow-6jcyn?fontsize=14&hidenavigation=1&theme=dark

当我单击软件链接时,卡片应该会消失,但它不是图像,但到目前为止,作业组件显示得很好,但当我刷新页面时,作业组件就消失了,单击软件链接以奇怪的方式扩展url。组件显示器

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-02-21 14:25:03

这是因为want.js中的这一行

代码语言:javascript
复制
<Route path={`${this.props.location.pathname}/:jobId`} component={Job} />

每次重新加载浏览器时,它都会将ID添加到路径名/JobPortal/Want/1的末尾,即/JobPortal/Want/1/1/JobPortal/Want/1/1/1,因此您不断地更改与路由匹配的路径。

只要把它改成

代码语言:javascript
复制
<Route path={`${this.props.match.path}/:jobId`} component={Job} />

我还将更加明确地显示您的链接,因为它在每次单击时都会将自己复制到路径上:

代码语言:javascript
复制
<Link to={`/JobPortal/Want/${job.jobId}`}>
 {job.jobTitle}
</Link>

在像这样使用this.props.location.pathname params时,要小心,因为它包含了

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60324668

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档