父子、祖孙组件组件嵌套,父级容器监听了scroll事件:在子、孙子组建中点击相应的标题,定位到对应的位置,实现平滑滚动。

参考文章:https://blog.csdn.net/iceking66/article/details/78211213?locationnum=1&fps=1

一、在子组建中设置:

子组件页面设置如下:
菜单项:“topMenu” 为菜单数组
<button v-for="(item,index) in topMenu" :key="item.value" @click.native="jump(index)">{{item.name}}</button>

<组件1 class=".textcss"></组件1>
.....................
<组件n class=".textcss"></组件n>

在method中编写个方法
jump(index){
	let jump = document.querySelecotor('.textcss');
	let param = {
		index: index,
		jump: jump,
	};
	
	this.$root.eventHub.$emit('scrollTo',param);
}

二、父组件中编写,滚动:

父组件中 如: <div ref="viewhome"></div>

在父组件的 mounted中编写如下:
this.$root.eventHub.$on('scrollTo', (params)=>{
	let _this = this;  //这行必写
	let jump = params.jump;
	let index = params.index;
	let total = jump[index].offsetTop;
	let distance = _this.$refs.viewhome.scrollTop;
	let step = total/50;
	if(total > distance){
		smoothDown();
	} else {
		let newTotal = distance - total;
		step = newTotal / 50;
		smoothUp();
	}
	
	function smoothDown(){
		if(distance < total){
			distance += step;
			_this.$refs.viewhome.scrollTop = distance - 40; //减多少 需要根据页面调试
			//如果 _this 变成 this 提示 $refs未定义  --》这就是 开头  let _this = this;的作用
			// 这里通过$refs来操作dom来替代: document.body.scrollTop = distance   和  document.documentElement.scrollTop = distance
			setTimeout(smoothDown,10);
		}else{
			_this.$refs.viewhome.scrollTop = total - 40;
		}
	}
	
	function smoothUp(){
		if(distance > total){
			distance -= step;
			_this.$refs.viewhome.scrollTop = distance - 20;
			setTimeout(smoothUp, 10);
		}else{
			_this.$refs.viewhome.scrollTop = total - 20;
		}
	}
})


Logo

前往低代码交流专区

更多推荐