如何导入基于当前 url 的组件?

How can I import a component based on the current url?

我想根据我所在的页面导入不同的 CSS。 HTML 将保持不变。我需要做什么才能访问当前位置?

我想我可以在构造函数中放置一个 if 语句并在其中导入 CSS,但我不确定这是否可行。

编辑:您无法从 constructor 中导入,那么有没有办法进行条件导入?

这是我的代码:

import React from 'react'
import Link from 'gatsby-link'


class Menu extends React.Component {

    constructor(props) {
        super(props)

        //how do I get myCurrentLocation?
        if(myCurrentLocation == '/') {
            import menuStyle from '../page-assets/global/styles/menu/_home-page.sass'
        } else {
            import menuStyle from '../page-assets/global/styles/menu/_regular-page.sass'
        }
    }

    render (){
        return (
            <nav className="menu">
                <Link to="/work-ive-done/" className="menu-item">
                    <span className="menu-item__heading">
                        Work
                    </span>
                    <span className="menu-item__sub-text">
                        ive done
                    </span>
                </Link>

                //other menu items ...

            </nav>
        )
    }
}

export default Menu;

gatsby-link 是 react-router-dom Link 的包装器,因此您应该能够使用 this.props.match.path.[=14= 访问您的路由]

否则: 您可以使用 window.location.href

访问当前的 url

https://developer.mozilla.org/en-US/docs/Web/API/Window/location

在 Gatsby v2 中,页面组件将能够通过以下方式访问它们的位置:

  • 对于 class 个组件:this.props.location.pathname
  • 对于 functional 个组件:props.location.pathname

对于函数组件,确保 props 通过它们的参数传递。例如

const IndexPage = (props) => (
  <Layout>
    <p>This works {props.location.pathname}</p>
  </Layout>
)

对于其他任何地方,您可以使用 @reach/routerLocation 组件(致谢:jlengstorf

import React from 'react';
import { Location } from '@reach/router';

export default () => (
  <Location>
    {({ navigate, location }) => /* ... */}
  </Location>
);

这是一个 codesandbox showing the above. Also credits jlengstorf