React中查看更多返回上一页到之前离开当前页面的位置

一 在Racet中查看更多跳转到另一个路由页面,返回上一级时,又会刷新到顶部,对用户很不有好

1. 使用页面监听scroll方式

	const {rsScorllHeight,setRsScorllHeight } = props //rsScorllHeight 位置 setRsScorllHeight  设置数据方法
	let  scrollTop1:any =[]
	window.addEventListener('scroll', (e)=>{
		// 滚动的高度(兼容多种浏览器)
		let scrollTop = (e.srcElement ? e.srcElement.documentElement.scrollTop : false)  || window.pageYOffset || (e.srcElement ? e.srcElement.body.scrollTop : 0);
		scrollTop1.push(scrollTop)
	})

这里创建一个数组存放监听到的页面scrollTop 位置

2. 在页面销毁时向全局共享数据redux存放最后一次的scrollTop 位置

useEffect(() => {
		return () =>{
			setRsScorllHeight(scrollTop1[scrollTop1.length-2])
		}
	}, [state])

这里获取scrollTop1数组的长度减2的原因是最后一次为0所以减2

3. 使用react中navigate(-1)返回上一页,这个页面属于查看更多的页面

	<div className='back' onClick={() => {
						navigate(-1)
					}}>返回</div>

4.主页面加载的时候去获取共享数据里面的scrollTop 位置 赋值给页面scrollTop中

	/*监听数据的变化,改变聊天容器元素的 scrollTop 值让页面滚到对应的位置*/
	useEffect(() => {
		setTimeout(() => {
			window.document.documentElement.scrollTop = rsScorllHeight
			window.document.body.scrollTop = rsScorllHeight
		}, 400);
		return () =>{
			setRsScorllHeight(scrollTop1[scrollTop1.length-2])
		}
	}, [state])  

这里为了兼容H5或者web端所以为这两个都赋值,rsScorllHeight是redux共享数据里面之前离开时的scrollTop位置,这里用了一个setTimeout方法延迟,如果不延迟赋值了也不生效,也不会跳转到指定页面的位置。

  • 这里这个问题我目前也不知道怎么去处理解决,查阅资料大致原因应该是页面还没加载完毕,如果延迟了页面会出现不太友好的直接一下跳转过去,目前想做到就是在页面预加载的时候最好就能把位置定位到指定的位置。求各位大神指导一下

第二种方法使用ref={ref}绑定

1. 创建一个useRef并绑定到标签上

let  ref = useRef(null)

<div className={'content-wrap ' + (options ? 'big' : '')} id="code"  ref={ref }>
		{views.map((idx: any, i: number) => (
					<div key={i + idx.name} >
						......
				</div>
		</div>

2.主页面加载的时候去给这个对象中 ref.current.scrollTop中赋值

useEffect(() => {
		ref.current.scrollTop = rsScorllHeight
		return () =>{
			setRsScorllHeight(scrollTop1[scrollTop1.length-2])
		}
	}, [state])  
  • 但是这里还是一样出现问题,不会到指定位置,怎么给ref.current.scrollTop赋值永远都为0 求各位大神指导一下
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
React Hooks 返回一页并不会刷新上一页页面,这是 react-router-dom 库的默认行为。如果你需要在返回一页时刷新上一页页面,可以通过以下几种方式实现: 1. 在返回一页时手动刷新页面。可以使用 JavaScript 提供的 `location.reload()` 方法来刷新页面。具体来说,可以在需要返回一页的事件处理函数先调用 `history.goBack()` 方法,然后再调用 `location.reload()` 方法来刷新页面。 ```jsx import { useHistory } from 'react-router-dom'; function MyComponent() { const history = useHistory(); function handleGoBack() { history.goBack(); window.location.reload(); } return ( <div> <button onClick={handleGoBack}>返回一页</button> </div> ); } ``` 2. 使用路由参数来判断是否需要刷新页面。可以在路由跳转时传递一个参数,然后在上一页的组件监听该参数的变化,如果参数发生了变化,则手动刷新页面。具体来说,可以在需要返回一页的组件通过 `history.push()` 方法传递一个参数,然后在上一页的组件通过 `useEffect()` 钩子函数监听该参数的变化,如果参数发生了变化,则调用 `location.reload()` 方法来刷新页面。 ```jsx import { useEffect } from 'react'; import { useHistory } from 'react-router-dom'; function PreviousComponent() { useEffect(() => { if (location.state && location.state.forceRefresh) { window.location.reload(); } }, []); return ( <div> <h1>上一页</h1> </div> ); } function MyComponent() { const history = useHistory(); function handleGoBack() { history.push({ pathname: '/previous-page', state: { forceRefresh: true } }); } return ( <div> <button onClick={handleGoBack}>返回一页</button> </div> ); } ``` 需要注意的是,手动刷新页面可能会导致用户的操作数据丢失,因此需要谨慎使用。建议在需要刷新页面时给出提示并允许用户确认。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值