【问题标题】:Semantic-UI-React Responsive component renders element in spite of minWidth/maxWidth propSemantic-UI-React Responsive 组件渲染元素尽管有 minWidth/maxWidth 属性
【发布时间】:2018-05-23 23:36:07
【问题描述】:

我有一个组件,我想根据屏幕大小呈现不同的组件。如果我在移动视图上重新加载页面,一切正常,呈现 NavBarMobile 而不是 NavbarDesktop。

如果我在桌面视图中重新加载页面,则我的 NavbarMobile 会再次呈现,而不是 NavBarDesktop。

如果我开始将屏幕大小调整为移动设备并返回桌面视图,NavBarDesktop 会正确呈现。

那么,问题是在桌面视图中加载第一页,如何解决这个问题?

 const { mainAppComponents, } = this.props
    const { visible, } = this.state
    return (
      <Fragment>
        <Responsive maxWidth={767}>
          <NavBarMobile
            onPusherClick={this.handlePusher}
            onToggle={this.handleToggle}
            rightItems={rightItems}
            visible={visible}
          >
            {mainAppComponents.header}
            {mainAppComponents.routes}
          </NavBarMobile>
        </Responsive>

        <Responsive minWidth={768}>
          <NavBarDesktop rightItems={rightItems}>{mainAppComponents.header}</NavBarDesktop>
          {mainAppComponents.routes}
        </Responsive>
      </Fragment>
    )

【问题讨论】:

    标签: reactjs semantic-ui semantics semantic-ui-react


    【解决方案1】:

    Igor-Vuk,我整理了一个快速的代码框示例,以确保您尝试实现最小/最大宽度道具的方式没有问题。正如您从这个示例中看到的那样,它们实际上确实按预期工作。 https://codesandbox.io/s/98pk46l7vr

    没有看到您的组件或应用程序的其余部分,问题可能是由于您的路由器中的某些问题。我建议尝试删除您作为 Responsive 组件的子级返回的一些其他组件,以查看它是否开始按预期工作(如在我的代码框示例中)。如果它有效,那么您就知道问题出在孩子的某个地方。如果它不起作用,那么您的应用中存在上述更大的问题。

    如果您使用的是 SSR,则在初始加载时,内容会通过不知道视口的 Responsive 组件呈现和提供。因此,您可能还需要添加 CSS 媒体查询。

    【讨论】:

    • 谢谢 brianespinosa。我想我知道问题出在哪里,但我不知道如何解决。仅当我使用服务器端渲染时才会发生错误。由于我的代码被分成几个包、bundle.js 和用于 css 的单独包等,因此下载 CSS 包需要更长的时间然后 bundle.js.Maybe 服务器侧面渲染没有考虑这个 maxWidth 和 minWidth 因为它还不知道如何处理它。然后,当所有内容都下载完毕后,它只会填充 SSR 准备的内容。如果此时我开始更改屏幕尺寸,一切正常。只是不是第一次渲染。
    • 嗯,有道理。 SSR 肯定会导致这种情况。 Responsive 组件需要知道视口/窗口宽度是多少。在 SSR 的情况下,它不知道。因此,在这种情况下,两者都应该渲染,直到您的视口大小发生变化。基本上Responsive 组件不是我推荐的用于 SSR 的情况,除非您还将这些组件与 CSS 媒体查询耦合。如果您使用媒体查询代替(或同时使用)Responsive 组件,这应该可以工作。
    • 感谢 brianespinosa。你解释得比我好得多。是的,我试过了。我删除了 max/minWidth 并将常规 css 类与媒体查询配对。现在可以了。所以我不应该在 SSR 中使用Responsive 吗?在我的示例中使用 Responsive 作为包装器没有 max/minWidth 但常规 css 类有什么好处,还是应该只放常规
      ?另外,如果我改用媒体查询,但我的 css 包仍然需要更长的时间,那么 bundle.js 下载我也会遇到同样的问题。现在测试它有点问题。
    • 基本上Responsive 组件和媒体查询在做两件不同的事情。使用媒体查询,标记仍将位于 DOM 中,并且这些组件会被渲染。您可以选择不让它们在查询中显示在 DOM 中。使用Responsive,它实际上是根据配置选择性地渲染/不渲染子级。这两种解决方案以及将它们结合起来都有好处。您需要决定什么适合您的用例。 :) 另外,如果上面的答案有帮助,请考虑将其标记为选定的解决方案。
    • 我知道这是一个较老的问题,但我想提一下,现在有一种方法可以在使用 SSR 时解决 Responsive 元素。它没有很好的记录,但this issue from the Semantic UI repo 显示了如何。如果您将fireOnMount 属性添加到组件并添加对getWidth 的调用,如图所示以检测您何时处于浏览器上下文中,您的Responsive 元素将正常工作。
    猜你喜欢
    相关资源
    最近更新 更多
    热门标签