前言Howdz是基于Vue3+Typescript开发的完全自定义的浏览器导航起始页。支持按需添加素材组件,可自由编辑组件的位置、大小和功能。支持响应式设计,可以自定义随机壁纸、动态壁纸等。项目提供在线访问网页、打包浏览器插件、打包桌面应用(Electron)等多种访问方式。本文记录了项目开发中使用的相关技术。表单封装工程中可以自由添加各种素材组件,每个素材组件都有自己的配置项表单,有的配置项相同,可以实现JS数据驱动的表单封装。目前使用的是ElementPlus框架,封装了一个StandardForm组件,将formData和formConf属性传递给它,生成双向绑定表单,支持JSX插入其他自定义组件。由于篇幅问题,组件封装代码可以参考这里:standard-form.vue然后就可以使用类似json的格式来实现各个material组件的配置形式。例如Weather组件的setting.tsx如下://@/materials/Weather/setting.tsximportpickfrom'../base'//pick可以自由选择publicconfigurationexportdefault{formData:{weatherMode:1,cityName:'',animationIcon:true,duration:15,position:5,baseFontSize:16,textColor:'#262626',textShadow:'001px#464646',iconShadow:'001px#464646',fontFamily:'',padding:10},formConf(formData:Record){//传入formData实现双向绑定return{weatherMode:{label:'weathercity',type:'radio-group',radio:{list:[{name:'自动获取(IP)',value:1},{name:'手动输入',value:2}],label:'name',value:'value'}},cityName:{when:(formData:Record)=>formData.weatherMode===2,//类似v-iftype:'input',attrs:{placeholder:'请输入城市名(目前只支持中文城市名)',clearable:true},规则:[{required:true,validator:(rule:unknown,value:string,callback:(e?:Error)=>void)=>{formData.weatherMode===2&&!value?callback(newError('Pleaseenterthecityname')):callback()}}]//支持el-form原生规则},animationIcon:{label:'动画图标',type:'switch',tips:'默认使用带动画的ICON,如果想提高性能,可以关闭使用staticICON'},duration:{label:'autorefreshfrequency',type:'input-number',attrs:{'controls-position':'right',min:5,max:12*60},tips:'刷新频率,单位是分钟'},...pick(formData,[//选择常用配置'position','baseFontSize','textColor','textShadow','iconShadow','fontFamily','padding'])}}}右键菜单材质组件添加后,可以在右键弹出菜单中编辑模式更改配置或删除等。右键菜单来源为作者开源@howdjs/mouse-menu。同时,在本项目中,为了兼容移动端,对插件进行了二次封装,并为其添加了长按弹出菜单的功能。二次包装码参考这里。项目使用vue命令方式。菜单插件可以接收任意参数进行回调,因此可以将点击的材质组件数据传递给回调进行各种操作。isLock,params:element,menuList}">