javascript - 在 ReactJS 的列表中连接更多项目时保持滚动位置

标签 javascript reactjs ecmascript-6 react-hooks use-state

我在 ReactJS 商店中有这个产品列表:

{productsList.map((product) => (
  <ProductItem
    product={product}
  />
)}

当我在此列表中添加更多产品时,滚动位置转到列表末尾。添加更多产品的代码:

function nextPage() {
  getMoreProducts().then((newProducts)=> {
    setProductsList(productsList.concat(newProducts))
  })
}

我需要保持滚动位置,因为这样用户必须滚动到顶部才能看到加载的新产品

我已经尝试存储滚动位置,但是更改是在列表增长之前完成的,所以没有任何反应:

function nextPage() {
  const actualScrollPosition = window.pageYOffset
  getMoreProducts().then((newProducts)=> {
    setProductsList(productsList.concat(newProducts))       //<- setState from React is async.
    window.scroll({ top: actualScrollPosition, behavior: "smooth" });
  })    
}

最佳答案

尝试在 useLayoutEffect 中设置由 productsList 更改触发的滚动位置:

import React from 'react'

type Product = {
  name: string
}

const getMoreProducts = async () => ([{name:'foo'}])

export const ProductItem: React.FC<{ product: Product> = ({ product }) => {
  return <div>{product.name}</div>
}

export const ProductList: React.FC = () => {
  const [productsList, setProductsList] = React.useState([])

  let pageYOffset = window.pageYOffset

  function nextPage() {
    getMoreProducts().then((newProducts)=> {
      pageYOffset = window.pageYOffset
      setProductsList(productsList.concat(newProducts))
    })    
  }

  React.useLayoutEffect(() => {
    window.scroll({ top: pageYOffset });
  }, [productsList])

  return (
    <>
      {productsList.map((product) => (
        <ProductItem
          product={product}
        />
      ))}
      <button onClick={nextPage}>Load more</button>
    </>
  )
}

在这种情况下,您也不希望行为:“平滑”

关于javascript - 在 ReactJS 的列表中连接更多项目时保持滚动位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63694508/

相关文章:

javascript - 为什么自定义函数在 IE8 中显示参数无效

javascript - 哪个更好 : &lt;script type ="text/javascript">. ..&lt;/script&gt; 或 &lt;script&gt;...&lt;/script&gt;

javascript - 是否可以从React组件访问App实例?

css - 在 React 的 Material-ui 上覆盖 TableRow 悬停 CSS

javascript - ECMA-262 ReturnIfAbrupt

javascript - Angular 2.0 : Does Typescript support all the features of ES6?

javascript - 单击共享按钮时打开新选项卡

javascript - 如何将 ng-repeat 中的当前对象传递给 $mdDialog?

javascript - 回顾我的代码 React 中的函数式编程

javascript - 在 ES6 模块中定义全局变量的正确方法是什么?