当前位置:首页 > 技术分析 > 正文内容

手把手教你Electron + Vue实战教程(二)

ruisui883个月前 (02-03)技术分析10


作者:Sufen

转发链接:
https://mp.weixin.qq.com/s/n9PeozLcIJFlORHMlzrlNQ

目录

手把手教你Electron + Vue实战教程(一)

手把手教你Electron + Vue实战教程(二)本篇

手把手教你Electron + Vue实战教程(三)

手把手教你Electron + Vue实战教程(四)

1 Electron升级

2020年5月19号,Electron更新了最新的 9.0.0 版本,带来了诸多改进,具体的我就不在此赘述了,大家可以看一下官方介绍:
https://github.com/electron/electron/blob/master/docs/breaking-changes.md

好了,我们现在就把上节课初始化好的项目升级到Electron9.0.0,只要简单的两步:1、命令行直接执行重新安装yarn add electron即可升级到最新版本Electron;2、删除src目录中background.js文件内的代码
app.allowRendererProcessReuse = true,这行代码其实就是我们上节课添加的,9.0 的版本已经设置为默认值了,所以此处我们就不需要了。

2 项目介绍

估计大家看到这里都已经忍不住了:你BB了那么久,你到底是要搞啥子项目呀……咳咳,我的锅我的锅,一开始就应该介绍一下先的了,拖到了现在……这实战教程其实并不是什么高难度的项目,就是仿有道云笔记,没错又是仿某某某的套路。。当然,鉴于时间的问题,我应该不会全放下来,只挑选 Markdown 的文件编写部分。在此,我有个小小的建议:「不要为了仿而仿,而是为了如何在一个项目中把你所学会的知识技能点糅合在一起,融会贯通举一反三,这才是我们的最终目的」

3 工欲善其事必先利其器

在开始正式写代码之前,有必要先安利一下前端最好的编辑器之一Visual Studio Code,当然,这是个仁者见仁智者见智的问题,最适合你的才是最好的!如果你选择不使用这个编辑器,那么你可以直接跳过这一小节了。 必装插件ESLint和Prettier - Code formatter,推荐一下我常用的代码风格和eslint设置,在项目根目录下分别新建三个文件.editorconfig、.eslintrc.js、.prettierrc.js,如下图所示:

「下面是代码展示,此处仅展示当前项目使用的eslint与代码风格样式,你可以自行选择是否使用。」

# 这是 .editorconfig 文件内容

[*.{js,jsx,ts,tsx,vue}]
indent_style = space
indent_size = 2
end_of_line = lf
trim_trailing_whitespace = true
insert_final_newline = true
max_line_length = 120
//?这是?.eslintrc.js?文件内容
module.exports?=?{
??root:?true,
??env:?{
????node:?true
??},
??extends:?['plugin:vue/essential',?'@vue/airbnb'],
??parserOptions:?{
????parser:?'babel-eslint'
??},
??rules:?{
????'no-console':?0,
????'no-debugger':?0,
????semi:?['error',?'never'],?//?禁用?分号
????'no-multiple-empty-lines':?['error'],?//?代码空行?数量
????'linebreak-style':?[0,?'error',?'windows'],?//?使用windows的换行
????'comma-dangle':?[2,?'never'],?//??对象数组最后一个不带逗号
????'no-trailing-spaces':?0,?//?禁用?校验代码末尾带空格
????'import/no-dynamic-require':?0,?//?禁用?动态require
????'import/no-unresolved':?0,
????'no-param-reassign':?0,?//?声明为函数参数的变量可能会引起误解
????'max-len':?['error',?120],?//?单行代码最大长度
????'guard-for-in':?0,?//?禁用?禁用for?in?循环
????'no-shadow':?0,?//?禁用??禁止页面内相容参数名
????'object-shorthand':?0,?//?禁用?禁止对象内使用带引号字符串
????'no-restricted-syntax':?0,
????'no-plusplus':?0,?//?禁用?++
????'consistent-return':?0,?//?关闭箭头函数必须要return
????'no-return-assign':?0,?//?return?语句中不能有赋值表达式
????'global-require':?0,?//?关闭禁止使用requrie
????'prefer-promise-reject-errors':?0,?//?这条规则旨在确保承诺只被Error对象拒绝。
????'import/extensions':?'off',?//?禁用文件名详细文件类型后缀
????'import/no-extraneous-dependencies':?['error',?{?devDependencies:?true?}],
????'arrow-parens':?['error',?'as-needed'],?//?箭头函数参数括号,可选?always:(默认)在所有情况下都需要参数;as-needed:当只有一个参数时允许省略参数
????'no-undef':?0,?//?关闭显式声明全局变量的要求
????'class-methods-use-this':?0,
????'no-underscore-dangle':?['error',?{?allow:?['_id']?}],?//?允许指定的标识符具有悬挂下划线
????camelcase:?0,?//?关闭使用骆驼拼写法
????'no-global-assign':?0,?//?允许修改只读全局变量,
????'space-before-function-paren':?[
??????'error',
??????{
????????anonymous:?'never',
????????named:?'never',
????????asyncArrow:?'always'
??????}
????],
????//?对象解构不需要换行
????'object-curly-newline':?[
??????'error',
??????{
????????ObjectPattern:?{
??????????multiline:?true
????????}
??????}
????],
????'no-unused-expressions':?['error',?{?allowShortCircuit:?true,?allowTernary:?true?}]?//?允许在表达式中使用三元运算符,类似于短路评估
??}
}
//?这是?.prettierrc.js?文件内容
module.exports?=?{
??semi:?false,?//?去掉分号
??singleQuote:?true,?//?使用单引号
??printWidth:?120,?//?单行代码最大长度
??trailingComma:?'none'?//?去掉结尾逗号(对象,数组等)
}

搞定!现在我们可以愉快的撸码了……

4 左侧面板开发

有道云笔记截图

可以看到,左侧面板就是一个文件列表,我们这里不仅需要做出图片中的列表,还要在列表顶部添加搜索栏,便于我们方便快捷搜索列表笔记。当前,还需要有新增笔记和导入笔记的功能,先看一下我们这一节的成品图:

4.1 整体布局

我们先删除项目中的多余页面与组件:
vue-electron-notes/src/components/HelloWorld.vuevue-electron-notes/src/views/About.vue删减后的路由文件:

import?Vue?from?'vue'
import?VueRouter?from?'vue-router'

Vue.use(VueRouter)

const?routes?=?[
??{
????path:?'/',
????name:?'Home',
????component:?()?=>?import('@/views/Home')
??}
]

const?router?=?new?VueRouter({
??mode:?'history',
??base:?process.env.BASE_URL,
??routes
})

export?default?router

删减后的App.vue文件:



*?{
??margin:?0;
??padding:?0;
??outline:?none;
??box-sizing:?border-box;
}
#app?{
??font-family:?Avenir,?Helvetica,?Arial,?sans-serif;
??-webkit-font-smoothing:?antialiased;
??-moz-osx-font-smoothing:?grayscale;
??color:?#2c3e50;
}

这里为了方便快捷,就简单粗暴地使用了 css 通配符 *,但是建议大家在实际项目中不要这么干,懂的自然懂……

我们继续修改view目录下的Home.vue文件,使用flex布局设置为最常见的两栏布局(flex的爽我就不多说了,更何况我们这里不需要考虑什么 css 兼容性),左侧面板固定宽度,右侧内容编辑区自适应:






.app-wrapper?{
??display:?flex;
??.sidebar-container?{
????width:?300px;
????height:?100vh;
????border-right:?1px?solid?#eaeefb;
??}
??.main-container?{
????flex:?1;
??}
}

4.2 引入element-ui和fontawesome图标库

在src目录中创建文件夹plugin,我们以后所有引入的外部框架与插件全部都放在这里。我们使用命令行yarn add element-ui安装element-ui,接着在plugin文件中新建文件element-ui.js:

/*
?*?@Description:?引入?element-ui?框架
?*?@Author:?sufen
?*?@Date:?2020-05-21?09:58:49
?*?@LastEditTime:?2020-05-21?09:59:20
?*?@LastEditors:?sufen
?*/
import?Vue?from?'vue'
import?ElementUI?from?'element-ui'
import?'element-ui/lib/theme-chalk/index.css'

Vue.use(ElementUI,?{?size:?'small'?})

继续安装fontawesome图标库,先安装所有的图标依赖,后续再按需引入我们所需要的图标。

MacBook-Pro:vue-electron-notes?Bill$?yarn?add?@fortawesome/vue-fontawesome?@fortawesome/free-solid-svg-icons?@fortawesome/fontawesome-svg-core?@fortawesome/free-brands-svg-icons?@fortawesome/free-regular-svg-icons

接着在plugin文件中新建文件fortawesome.js,里面的faMarkdown、faUserSecret就是我们按需引入的图标,后续如果我们需要新的图标就在这里新增就完事了:

/*
?*?@Description:?fortawesome?图标库
?*?@Author:?sufen
?*?@Date:?2020-05-21?09:55:29
?*?@LastEditTime:?2020-05-21?10:06:46
?*?@LastEditors:?sufen
?*/
import?Vue?from?'vue'
import?{?library?}?from?'@fortawesome/fontawesome-svg-core'
import?{?faUserSecret?}?from?'@fortawesome/free-solid-svg-icons'
import?{?faMarkdown?}?from?'@fortawesome/free-brands-svg-icons'
//?import?{?faUserSecret?}?from?'@fortawesome/free-regular-svg-icons'
import?{?FontAwesomeIcon?}?from?'@fortawesome/vue-fontawesome'

library.add(faUserSecret,?faMarkdown)

Vue.component('font-awesome-icon',?FontAwesomeIcon)

搞完上面两个还没完呢,最后我们需要在main.js文件中引入:

import?Vue?from?'vue'
import?App?from?'./App.vue'
import?router?from?'./router'
import?store?from?'./store'
import?'@/plugin/element-ui'
import?'@/plugin/fortawesome'

Vue.config.productionTip?=?false

new?Vue({
??router,
??store,
??render:?h?=>?h(App)
}).$mount('#app')

至此,我们就已经完成了element-ui和fortawesome的引入了,可以愉快的在项目内使用咯,不信你试试看

4.2 FileSearch 搜索组件

在components组件目录新增FileSearch组件,这个组件主要由一个输入框和下拉菜单组成,这两个我们都可以直接使用 element 的组件,需要注意的是,我们这里使用到了Vue v2.4中新增的$attrs及$listeners属性。

?

attrs:包含了父作用域中不被认为 (且不预期为) props 的特性绑定 (class 和 style 除外)。当一个组件没有声明任何 props 时,这里会包含所有父作用域的绑定 (class 和 style 除外),并且可以通过 v-bind=”$attrs” 传入内部组件——在创建更高层次的组件时非常有用。

?

?

listeners:包含了父作用域中的 (不含 .native 修饰器的) v-on 事件监听器。它可以通过 v-on=”$listeners” 传入内部组件——在创建更高层次的组件时非常有用。

?

在我们编写 vue 高阶组件中,这两个属性简直就是神器,简直不要太爽!!!

FileSearch组件调用时直接使用v-model绑定需要搜索的内容,新建文件与导入文件则通过$emit调用自定义事件,这些都是属于vue基础知识,在这里就不多说了。 看一下我们已经完成好的FileSearch组件源码:







.search-container?{
??display:?flex;
??align-items:?center;
??padding:?12px?10px;
??background:?#daecfe;

??.el-dropdown?{
????.el-button--small?{
??????margin-left:?10px;
??????padding:?6px;
??????font-size:?14px;
??????border-radius:?30%;
????}
??}
}

4.3 FileList 文件列表组件

在components组件目录新增FileList组件,我们这一节主要就是完成这么一个列表,至于后面使用到的右键菜单等等,到我们后续使用到了再说,路要一步步走。可以看到,我们这个组件props接收一个fileList数组,然后通过v-for直接渲染后搞定了。每一个li都使用flex布局,li包含了我们的文件标题和文件的最后修改时间,不得不说flex真的是布局神器,一直用一直爽!图标当然就使用我们前面所引入的fortawesome图标库了,我们前面具体的图标引入代码为:

import?{?faMarkdown?}?from?'@fortawesome/free-brands-svg-icons'
library.add(faMarkdown)

接着我们直接在FileList组件中使用fortawesome组件,markdown 图标就已经展示出来了,后面稍微修改样式调节一下间距就能很完美了:

如果仅仅到这里就结束了,那么这个组件确实也太没技术含量了吧。随着我们的文件越来越多,列表的长度会越来越长,那么就必然会出现滚动条,作为一个有追求的程序猿,浏览器原生的滚动条我是肯定无法接受的,简直丑爆了一点也不优雅好不好……为了既可以解决这个问题而又不用自己造轮子,我选用了element-ui的隐藏组件el-scrollbar,看一下官方文档的使用效果:

虽然在官方文档中没有给出这个组件,但是在源码中是有的。所以我们可以直接使用:

这个组件的使用还是些坑需要注意的,大家可以参考这篇文章所写,里面已经是写得很清晰明了了,我就不在此重复啰嗦了。

看看我们最后完整的组件代码:







.file-list?{
??user-select:?none;
??.file-item?{
????display:?flex;
????align-items:?center;
????height:?55px;
????border-bottom:?1px?solid?#eaeefb;

????.item-icon?{
??????margin-left:?20px;
??????margin-right:?12px;
????}

????.item-title?{
??????flex:?1;
??????margin-right:?5px;
??????font-size:?14px;
??????text-overflow:?ellipsis;
??????white-space:?nowrap;
??????overflow:?hidden;
????}
????.item-time?{
??????width:?80px;
??????font-size:?12px;
????}
??}
}


.scrollbar-filelist?{
??height:?calc(100vh?-?56px);
??overflow-x:?hidden?!important;
}
.el-scrollbar__bar?{
??opacity:?1;

??&.is-vertical?{
????right:?0px;
????width:?5px;
????.el-scrollbar__thumb?{
??????background-color:?rgba(144,?147,?153,?0.5);
????}
??}
}

4.4 组件引入

上面已经完成了左侧面板所需的两个组件,是时候在主页面引入看看最后的效果了,在view目录的中的Home.vue主页文件中编写:






.app-wrapper?{
??display:?flex;
??.sidebar-container?{
????width:?300px;
????height:?100vh;
????border-right:?1px?solid?#eaeefb;
??}
??.main-container?{
????flex:?1;
??}
}

列出最后的文件树:

├──?public
│???├──?favicon.ico
│???└──?index.html
├──?src
│???├──?assets
│???│???└──?logo.png
│???├──?components
│???│???├──?FileList
│???│???│???└──?index.vue
│???│???└──?FileSearch
│???│???????└──?index.vue
│???├──?plugin
│???│???├──?element-ui.js
│???│???└──?fortawesome.js
│???├──?router
│???│???└──?index.js
│???├──?store
│???│???└──?index.js
│???├──?views
│???│???└──?Home.vue
│???├──?App.vue
│???├──?background.js
│???└──?main.js
├──?.editorconfig
├──?.eslintrc.js
├──?.gitignore
├──?.prettierrc.js
├──?README.md
├──?babel.config.js
└──?package.json

搞定!这就是我们左侧面板的最后效果图:

老规矩,如果你觉得本文写得也还可以,麻烦点个赞+关注。谢谢!

推荐Vue学习资料文章:

手把手教你Electron + Vue实战教程(一)

收集22种开源Vue模板和主题框架「干货」

如何写出优秀后台管理系统?11个经典模版拿去不谢「干货」

手把手教你实现一个Vue自定义指令懒加载

基于 Vue 和高德地图实现地图组件「实践」

一个由 Vue 作者尤雨溪开发的 web 开发工具—vite

是什么让我爱上了Vue.js

1.1万字深入细品Vue3.0源码响应式系统笔记「上」

1.1万字深入细品Vue3.0源码响应式系统笔记「下」

「实践」Vue 数据更新7 种情况汇总及延伸解决总结

尤大大细说Vue3 的诞生之路「译」

提高10倍打包速度工具Snowpack 2.0正式发布,再也不需要打包器

大厂Code Review总结Vue开发规范经验「值得学习」

Vue3 插件开发详解尝鲜版「值得收藏」

带你五步学会Vue SSR

记一次Vue3.0技术干货分享会

Vue 3.x 如何有惊无险地快速入门「进阶篇」

「干货」微信支付前后端流程整理(Vue+Node)

带你了解 vue-next(Vue 3.0)之 炉火纯青「实践」

「干货」Vue+高德地图实现页面点击绘制多边形及多边形切割拆分

「干货」Vue+Element前端导入导出Excel

「实践」Deno bytes 模块全解析

细品pdf.js实践解决含水印、电子签章问题「Vue篇」

基于vue + element的后台管理系统解决方案

Vue仿蘑菇街商城项目(vue+koa+mongodb)

基于 electron-vue 开发的音乐播放器「实践」

「实践」Vue项目中标配编辑器插件Vue-Quill-Editor

基于 Vue 技术栈的微前端方案实践

消息队列助你成为高薪 Node.js 工程师

Node.js 中的 stream 模块详解

「干货」Deno TCP Echo Server 是怎么运行的?

「干货」了不起的 Deno 实战教程

「干货」通俗易懂的Deno 入门教程

Deno 正式发布,彻底弄明白和 node 的区别

「实践」基于Apify+node+react/vue搭建一个有点意思的爬虫平台

「实践」深入对比 Vue 3.0 Composition API 和 React Hooks

前端网红框架的插件机制全梳理(axios、koa、redux、vuex)

深入Vue 必学高阶组件 HOC「进阶篇」

深入学习Vue的data、computed、watch来实现最精简响应式系统

10个实例小练习,快速入门熟练 Vue3 核心新特性(一)

10个实例小练习,快速入门熟练 Vue3 核心新特性(二)

教你部署搭建一个Vue-cli4+Webpack移动端框架「实践」

2020前端就业Vue框架篇「实践」

详解Vue3中 router 带来了哪些变化?

Vue项目部署及性能优化指导篇「实践」

Vue高性能渲染大数据Tree组件「实践」

尤大大细品VuePress搭建技术网站与个人博客「实践」

10个Vue开发技巧「实践」

是什么导致尤大大选择放弃Webpack?【vite 原理解析】

带你了解 vue-next(Vue 3.0)之 小试牛刀【实践】

带你了解 vue-next(Vue 3.0)之 初入茅庐【实践】

实践Vue 3.0做JSX(TSX)风格的组件开发

一篇文章教你并列比较React.js和Vue.js的语法【实践】

手拉手带你开启Vue3世界的鬼斧神工【实践】

深入浅出通过vue-cli3构建一个SSR应用程序【实践】

怎样为你的 Vue.js 单页应用提速

聊聊昨晚尤雨溪现场针对Vue3.0 Beta版本新特性知识点汇总

【新消息】Vue 3.0 Beta 版本发布,你还学的动么?

Vue真是太好了 壹万多字的Vue知识点 超详细!

Vue + Koa从零打造一个H5页面可视化编辑器——Quark-h5

深入浅出Vue3 跟着尤雨溪学 TypeScript 之 Ref 【实践】

手把手教你深入浅出vue-cli3升级vue-cli4的方法

Vue 3.0 Beta 和React 开发者分别杠上了

手把手教你用vue drag chart 实现一个可以拖动 / 缩放的图表组件

Vue3 尝鲜

总结Vue组件的通信

Vue 开源项目 TOP45

2020 年,Vue 受欢迎程度是否会超过 React?

尤雨溪:Vue 3.0的设计原则

使用vue实现HTML页面生成图片

实现全栈收银系统(Node+Vue)(上)

实现全栈收银系统(Node+Vue)(下)

vue引入原生高德地图

Vue合理配置WebSocket并实现群聊

多年vue项目实战经验汇总

vue之将echart封装为组件

基于 Vue 的两层吸顶踩坑总结

Vue插件总结【前端开发必备】

Vue 开发必须知道的 36 个技巧【近1W字】

构建大型 Vue.js 项目的10条建议

深入理解vue中的slot与slot-scope

手把手教你Vue解析pdf(base64)转图片【实践】

使用vue+node搭建前端异常监控系统

推荐 8 个漂亮的 vue.js 进度条组件

基于Vue实现拖拽升级(九宫格拖拽)

手摸手,带你用vue撸后台 系列二(登录权限篇)

手摸手,带你用vue撸后台 系列三(实战篇)

前端框架用vue还是react?清晰对比两者差异

Vue组件间通信几种方式,你用哪种?【实践】

浅析 React / Vue 跨端渲染原理与实现

10个Vue开发技巧助力成为更好的工程师

手把手教你Vue之父子组件间通信实践讲解【props、$ref 、$emit】

1W字长文+多图,带你了解vue的双向数据绑定源码实现

深入浅出Vue3 的响应式和以前的区别到底在哪里?【实践】

干货满满!如何优雅简洁地实现时钟翻牌器(支持JS/Vue/React)

基于Vue/VueRouter/Vuex/Axios登录路由和接口级拦截原理与实现

手把手教你D3.js 实现数据可视化极速上手到Vue应用

吃透 Vue 项目开发实践|16个方面深入前端工程化开发技巧【上】

吃透 Vue 项目开发实践|16个方面深入前端工程化开发技巧【中】

吃透 Vue 项目开发实践|16个方面深入前端工程化开发技巧【下】

Vue3.0权限管理实现流程【实践】

后台管理系统,前端Vue根据角色动态设置菜单栏和路由

作者:Sufen

转发链接:
https://mp.weixin.qq.com/s/n9PeozLcIJFlORHMlzrlNQ

扫描二维码推送至手机访问。

版权声明:本文由ruisui88发布,如需转载请注明出处。

本文链接:http://www.ruisui88.com/post/788.html

标签: vue url传参
分享给朋友:

“手把手教你Electron + Vue实战教程(二)” 的相关文章

vue3父子组件传对象,子组件访问修改父组件对象中的属性值

在Vue 3中,父子组件之间的数据传输通常通过props和emit进行。父组件可以通过props向下传递数据给子组件,子组件则可以通过emit向上通知父组件更新数据。如果需要在子组件中修改父组件对象中的属性值,可以使用一个名为ref的Vue 3新特性。以下是一个示例,演示了如何在Vue 3中实现父子...

继Yuzu后,任天堂要求移除多个Switch模拟器项目

IT之家 7 月 11 日消息,任天堂美国分公司 (Nintendo of America) 已要求移除多个用于模拟 Nintendo Switch 游戏的开源模拟器项目,其中包括 Suyu、Nzu、Uzuy、Torzu、Sudachi 和 Yuzu-vanced 等。这些模拟器均被指控包含绕过任天...

代码分支规范

一.gitflow工作流说明:主分支:master,稳定版本代码分支,对外可以随时编译发布的分支,不允许直接Push代码,只能请求合并(pull request),且只接受hotfix、release分支的代码合并。gitlab上做限制。热修复分支:hotfix,针对现场紧急问题、bug修复的代码分...

祸害阿里云宕机3小时的IO HANG究竟是什么?

本文来自微信公号“CSDN”(ID:CSDNnews),作者 | 王知无, 责编| 郭 芮。2019年3月3日凌晨,微博炸锅,有网友反映说阿里云疑似出现宕机,华北很多互联网公司受到暴击伤害,APP、网站全部瘫痪,我自己的朋友圈和微信群里也有好友反馈,刚刚从被窝被叫起来去修Bug,结果发现服务器登不上...

双子座应用程序推出模型切换器以在Android上访问2.0

#头条精品计划# 快速导读谷歌推出了Gemini 2.0 Flash实验版,现已在其安卓应用中可用,之前仅在gemini.google.com网站上提供。新版本的15.50包含模型切换器,用户可以在设置中选择不同模型,包括1.5 Pro、1.5 Flash和2.0 Flash实验版。谷歌提醒,2.0...

2024最新版:前端性能优化方案汇总

前端训练营:1v1私教,终身辅导计划,帮你拿到满意的 offer。 已帮助数百位同学拿到了中大厂 offer。欢迎来撩~~~~~~~~Hello,大家好,我是 Sunday。前端性能优化一直是很多同学非常关注的问题,在日常的面试中也是经常会被问到的点。所以今天咱们就花一点时间来了解一下2024最新的...