在React中处理滚动位置的正确方法是什么?我真的很喜欢平滑滚动,因为更好的用户体验。因为在React中操作DOM是一个反模式,所以我遇到了一个问题:如何平滑地滚动到某个位置/元素?我通常会更改元素的scrollTop值,但这是对DOM的操作,这是不允许的。
杰斯宾
代码:
import React from 'react';
import ReactDOM from 'react-dom';
class App extends React.Component {
handleClick = e => {
for (let i = 1; i <= 100; i++) {
setTimeout(() => (this.node.scrollTop = i), i * 2);
}
};
render() {
const someArrayToMap = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
return (
<div ref={node => this.node = node} style={{overflow: 'auto', height: '100vh'}}>
<button onClick={this.handleClick}>CLICK TO SCROLL</button>
{
[...someArrayToMap,
...someArrayToMap,
...someArrayToMap,
...someArrayToMap,
...someArrayToMap,
...someArrayToMap,
...someArrayToMap].map((e, i) => <div key={i}>some text here</div>)
}
</div>
);
}
}
ReactDOM.render(<App />, document.getElementById('root'));
如何以反应的方式实现这一点?
最简单的方法是:-
window.scrollTo({top: 0, left: 0, behavior: 'smooth' });
这个简单的JavaScript代码适用于所有浏览器。
window.scroll({top: 0,左边: 0,行为:'ski'})
适用于我。
您还需要检查浏览器的兼容性
或者使用polyfill
编辑:为了完整起见,下面是如何动态地用webpack来填充。
if (!('scrollBehavior' in document.documentElement.style)) {
//safari does not support smooth scroll
(async () => {
const {default: smoothScroll} = await import(
/* webpackChunkName: 'polyfill-modern' */
'smoothscroll-polyfill'
)
smoothScroll.polyfill()
})()
}
通过这种动态多边形填充,除非浏览器支持平滑滚动,否则包将通过ajax加载。
polferd-现代
是一个任意的chunk名称,它提示webpack编译器将包组合在一起,以减少对服务器的请求数量。
您只需使用refs和scrollIntoView
方法(使用行为:“平滑”
进行平滑滚动)。它只需要几行代码,不需要包。
说这是您想要滚动到的内容
<p ref={this.myRef} className="scrollToHere">[1] ...</p>
还有某种按钮
<button onClick={() => {this.scroll(this.myRef)}} className="footnote">[1]</button>
调用scroll方法
class App extends Component {
constructor() {
super()
this.myRef = React.createRef();
scroll(ref) {
ref.current.scrollIntoView({behavior: 'smooth'})
}
}
编辑:因为此方法尚未被所有浏览器支持(浏览器支持概述),所以您可能希望使用多边形填充。
我的react中有一个滚动的事件处理程序,我正试图使它成为被动的。但它不起作用,我在控制台中不断收到以下警告: 将事件处理程序标记为“被动”以使页面更加响应。 下面是我阅读事件的地方: 这是我的EventContainer中的函数。js文件: 在这一行: {被动:被动} 我得到以下错误在我的编辑器: 参数类型{passive:boolean}不可分配给参数类型boolean 有人知道我做错了什么吗
问题内容: 使用react-router时,后退按钮上的滚动位置(历史记录popstate)遇到一些问题。由于浏览器正在实现一些自动滚动行为,因此React Router v4无法开箱即用地管理滚动。这很棒,除非浏览器窗口的高度从一个视图到另一个视图变化太大。我已经实现了ScrollToTop组件,如下所述:https : //reacttraining.com/react- router/web
问题我如何可以嵌入这个应用程序到SPlitPane,在左边将是另一个面板。 不幸的是,代码导致了错误的坐标,
问题内容: 我想知道是否有人可以提供一些有关他们如何在React.js中处理假动画的见解。我一直在使用Greensock TweenMax,并且enter动画在上可以正常工作,但是我还没有找到一种可靠的方法来对组件进行动画处理。 我的感觉是它应该进入,但是React没有提供回调机制来指示您何时准备释放组件。因此过渡动画永远不会完成,因为这些动画与React是异步的。取而代之的是,您只看到一秒钟的动
我想动态地从EditText中获取值...当用户按下添加按钮时,我生成了很多EditText...当用户按下添加按钮时,它每次都会生成3个Edittext。我不知道如何从这个动态生成的EdiTtext中获取值。现在我的问题是如何从每行的3个Edittext中获取值。我还需要验证用户是否删除了视图。请帮助我是新的android开发。当用户按下保存按钮时,应该会发生这种情况。提前谢谢! 这是课堂。 这
Scrollview通常会滚动到底部,但当我触摸TextInput并弹出键盘时,它只会滚动很短的距离,我无法查看下面的内容。 现在只关注Android Android:窗口软输入模式=“调整平移” 我的代码: 其中主要组件包含scrollView