在 React + Typescript 中的每个按钮单击事件上自动滚动到最后一个 div

Posted

技术标签:

【中文标题】在 React + Typescript 中的每个按钮单击事件上自动滚动到最后一个 div【英文标题】:Auto scroll to last div on every button click event in React + Typescript 【发布时间】:2021-12-24 04:05:15 【问题描述】:

我正在开发一些我们正在使用 React + Typescript 开发的应用程序。在这个我想实现自动滚动功能到最后一个 div。所以我有一些父 div,我正在根据我的对象数组中的数据添加子 div。我在单击按钮时在该对象中添加数据。因此,无论何时将新数据添加到该对象中,它都会在子组件中可见。所以相应地滚动应该自动在 div 的末尾。

我已经尝试了一些逻辑,因此根据该功能可以正常工作,但它滚动到父 div 的一半,但没有滚动到它的末尾。

我提供我的代码以供参考。

ParentComponant.tsx
 
import ​​​​​​​ useRef, useEffect ​​​​​​​ from"react"
import ​​​​​​​ ChildComponant ​​​​​​​ from'./ChildComponant'
 
exportconst SearchResult = () => ​​​​​​​
const myRef = useRef<null | htmlDivElement>(null)
const [oldData, setOldData] = useEffect([])
 
const executeScroll = () => ​​​​​​​
        myRef.current?.scrollIntoView()
    ​​​​​​​
 
const addMoreData = () => ​​​​​​​
let data = ​​​​​​​
            id: 1,
            content: 'dummy content'
        ​​​​​​​
let temp = [...oldData]
        temp.push(data)
        setOldData(temp)
        executeScroll()
    ​​​​​​​
 
return (
        <div>
            <button onClick=​​​​​​​addMoreData​​​​​​​>Click Me</button>
            <ChildComponant
                ref=​​​​​​​myref​​​​​​​
                someData=​​​​​​​oldData​​​​​​​
            />
        </div>
    )
​​​​​​​
 
ChildComponant.tsx
 
import React from'react'
 
interface dummyModel ​​​​​​​
    id: number
    content: string
​​​​​​​
 
exportinterface ChildComponantProps ​​​​​​​
    someData: dummyModel[]
​​​​​​​
 
exportconst ChildComponant = React.forwardRef<HTMLDivElement, ChildComponantProps>((​​​​​​​
    someData
​​​​​​​, ref) => ​​​​​​​
 
return ​​​​​​​
        <div>
            <div className="parent_div"> // We add content into this dynamically
            ​​​​​​​someData.map((v,k) => ​​​​​​​
                return (
                    <div className="child_div">
                        ​​​​​​​v.content​​​​​​​
                    </div>
                )
            ​​​​​​​)
            ​​​​​​​
            </div>
            <div ref=​​​​​​​ref​​​​​​​></div>
        </div>
    ​​​​​​​
​​​​​​​)

所以请帮我解决这个问题,因为我已经尝试了很多东西,但仍然没有得到解决。提前致谢。

【问题讨论】:

【参考方案1】:

您需要在数据更新后执行Scroll,但在您的情况下,您是在setState(异步)之后立即调用它。我建议你在 oldData 更新时调用 executeScroll:

useEffect(() => 
 executeScroll()
,[oldData])

【讨论】:

仍然无法正常工作。我的意思是我以前的行为【参考方案2】:

我已经通过使用以下代码解决了这个问题。

在底部移动滚动的调用函数内部完成的更改

const executeScroll = () => 
    if (myRef) 
      myRef.current?.scroll( top: myRef.current?.scrollHeight, behavior: 'smooth' )
    
  

在 JSX 中,我只将 ref 添加到子组件内的parent_div 类,并删除了我之前添加的最后一个空 div。

这些更改对我有用。

【讨论】:

以上是关于在 React + Typescript 中的每个按钮单击事件上自动滚动到最后一个 div的主要内容,如果未能解决你的问题,请参考以下文章

使用 Typescript(TSX 文件)将道具传递给 React 中的子组件

Typescript 中的 React + Firebase 云功能无法部署

react-redux 类型文件中的 TypeScript 错误

React Typescript:在 React.FC 中设置状态以更改 React.Component 中的值

如何在 React/TypeScript 应用程序中的模块方法上获取 VSCode 智能感知?

无法使用 Typescript 中的 React 钩子在 Ag-Grid 中获取 gridApi