为对于这样一个复杂的交互复选框,定义它的基本初始化数据状态是第一步,在调用这个组件的时候,模板会传入一个名为data的属性(这里是一个数组),props选项作为该组件的数据源组件,关注的焦点转移到组件内部数据交互的各种实现上,我先在组件状态数据中定义了一个名为targets的数组类型的变量,用来存储默认展开的复选框列表项的键值,然后根据data和targets这两个基本数据状态,可以导出两个计算属性sourceData和targetData分别渲染展开和隐藏的checkbox选择项,至此组件基本静态模板渲染的逻辑就构思好了。相关部分代码如下组件脚本部分exportdefault{name:"checkbox-transfer",props:{value:{type:Array,default:()=>[]}},计算:{checked(){returnthis.targets.map(key=>this.value.includes(key));},},方法:{check(item,e){if(!e.target.checked){constdelIndex=this.value.indexOf(item[this.props.key]);如果(delIndex>-1){this.value.splice(delIndex,1);}}else{if(!this.value.includes(item[this.props.key])){this.value.push(item[this.props.key]);}}this.$emit("check",e.target.checked,item[this.props.key]);this.$emit("输入",this.value);}}}首页页眉导航栏交互展示功能查看源码点这里介绍一下效果和功能。顶部导航栏具有页面向下滚动时吸顶的功能。横幅视频部分滚动出页面可见区域。导航栏更改主题色后,导航栏会根据页面滚动方向隐藏和显示。实现思路导航栏的前两个功能实现起来比较简单,这里就不做介绍了。下面主要分析函数中的第三点。如何根据页面的滚动方向判断导航栏的显示状态?简单的切换显示状态对于熟练使用Vue的同学来说很容易。这里的坑是在滚动过程中如何判断页面的滚动方向呢?说到这里,肯定有人想到可以使用浏览器的原生API来监听元素滚动事件,在事件滚动的回调函数中进一步处理逻辑判断。想到这对我们的最终目标来说是向前迈进了一大步,所以浏览器HTML元素的滚动事件可以为我们提供有限的回调参数,也就是说这个事件对象并没有直接提供这个滚动功能。方向信息。所以这个问题需要我们手动解决。手动封装监听元素滚动的功能为了判断元素的滚动事件相对于上一次滚动的方向,我们需要记录并存储上一次的滚动事件信息,然后通过比较坐标值来判断两个滚动事件本次页面滚动的方向(这里只判断是向下滚动还是向上滚动)。为了让这个判断元素滚动方向的逻辑更加可复用,我把它分离成一个实用函数,当我们需要用到这个逻辑的时候可以直接复用。具体实现代码helper/untilities.jsexportconstwatchScrollDirection=function(scrollElement,callback){constscrollPos={x:0,y:0};constscrollDirection={directionX:1,directionY:1,};函数onScroll(e){constscrollTop=scrollElement.scrollTop||scrollElement.pageYOffset;常量scrollLeft=scrollElement.scrollLeft||滚动元素.pageXOffset;if(scrollPos.y>scrollTop){scrollDirection.directionY=-1;(scrollPos.x>scrollLeft){scrollDirection.directionX=-1;}else{scrollDirection.directionX=1;}callback.call(scrollElement,scrollDirection,scrollPos);scrollPos.x=scrollLeft;scrollPos.y=scrollTop;}scrollElement.addEventListener("滚动",onScroll);returnfunction(){scrollElement.removeEventListener("scroll",onScroll);};};页代码实现如下views/home.vue组件脚本部分import{watchScrollDirection}from"@/helper/utilities.js";exportdefault{mounted(){constrootVm=this.$root;rootVm.$emit(“home-scrolling”,{directionX:1,directionY:-1},{x:document.body.scrollLeft,y:document.body.scrollTop});this.unwatch=watchScrollDirection(window,function(...args){rootVm.$emit("home-scrolling",...args);});},destroyed(){this.unwatch();}}应用截图首页招聘职位产品与服务职位详情员工故事支持阅读本文后,如果对您有所帮助,请点赞,谢谢!如果您想讨论项目相关问题或参与共建,欢迎留言!如果您对本项目有更好的建议或者发现bug,请提交issue申请在线地址:http://123.57.204.48:3000/项目仓库地址:https://github.com/konglingwen94/vue-bytedanceJob,欢迎Star并关注,谢谢!本文为个人原创,转载请注明出处,谢谢!