【问题标题】:Same function doesn't work on different platform in React相同的功能在 React 的不同平台上不起作用
【发布时间】:2020-08-17 02:29:56
【问题描述】:

我正在使用 React JS 库来跟踪用户滚动高度并根据收到的数据应用功能。

它在 Codesandbox.io 上运行良好,但是一旦我在 npm localhost 上运行它,它就无法存在,尽管我使用的是完全相同的代码。

这是我试图在 localhost 上应用但总是返回 0 的函数:

//Scroll event listener to change menu background color
const ScrollingElement = () => {
  const [scrollY, setScrollY] = useState(0);

  function logit() {
    setScrollY(window.pageYOffset);
  }

  useEffect(() => {
    function watchScroll() {
      window.addEventListener("scroll", logit);
    }
    watchScroll();
    // Remove listener (like componentWillUnmount)
    return () => {
      window.removeEventListener("scroll", logit);
    };
  }, []);
  console.log(scrollY);
  return scrollY;
}

我尝试调试 scrollY 变量,在 localhost 上我收到的值总是 0,无论如何。 我猜这是某种定义错误,codeandbox.io 有,而我没有。

在App函数上也试过如下调试,同样返回0:

function App() {
  console.log(ScrollingElement());
  return (
    <div>
      <Menu scrollHeight={ScrollingElement()}></Menu>
      <Home></Home>
    </div>
  );
}

我如何在 localhost 上运行我的代码,该代码可以在代码沙盒中运行?

【问题讨论】:

  • @evolutionxbox 但如何正确返回?我真的看不出如何做到这一点的语法。
  • 对不起,我刚刚在您的 codepen 中尝试过,代码按预期工作。请确保问题中的代码是minimal reproducible example,以便我们帮助您调试问题。
  • @evolutionxbox 尝试在本地主机上运行它,它不起作用。我将分享我所做的一些调试。

标签: javascript reactjs jsx


【解决方案1】:

您的&lt;ScrollingElement /&gt; 正在工作,但您需要确保您的父组件实际上是可滚动的。最简单的解决方案是创建新的&lt;Wrapper /&gt; 组件并使用 css 设置其高度。

function Wrapper() {
  return (
    <div style={{height: "200vh"}}>
      <ScrollingElement />
    </div>
  );
}

可运行示例:

const {useState, useEffect} = React;

function Wrapper() {
  return (
    <div style={{height: "200vh", backgroundColor: "beige"}}>
      <ScrollingElement />
    </div>
  );
}

const ScrollingElement = () => {
  const [scrollY, setScrollY] = useState(0);

  function logit() {
    setScrollY(window.pageYOffset);
  }

  useEffect(() => {
    function watchScroll() {
      window.addEventListener("scroll", logit);
    }
    watchScroll();

    return () => {
      window.removeEventListener("scroll", logit);
    };
  }, []);

  console.log(scrollY);
  return scrollY;
}

ReactDOM.render(<Wrapper/>, document.getElementById("root"));
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.13.1/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.13.1/umd/react-dom.production.min.js"></script>
<div id="root"></div>

【讨论】:

  • yotamdahan.com/portfolio 我已经尝试过您提到的内容,但无法正常工作.. 似乎有些东西将页面分开,如果您尝试在菜单部分滚动,您将无法这样做..
  • 不,所以我关注了这个stackoverflow.com/questions/59559492/…,但我已经尝试了你的解决方案
  • 如果您使用“运行代码 sn-p”按钮运行上面的 sn-p 并且它不起作用,请尝试在不同的浏览器中运行它。如果这仍然不起作用,请告诉我。
  • 它在 sn-ps 中对我有用,但是一旦我在我的网站上运行它就不起作用了。
猜你喜欢
  • 1970-01-01
  • 2014-09-20
  • 2018-08-27
  • 2016-07-14
  • 1970-01-01
  • 2010-10-29
  • 1970-01-01
  • 2012-06-12
  • 1970-01-01
相关资源
最近更新 更多