应用商店
svelte 包含一些额外的组件,从里面我们导入一些动画和辅助方法(数组推入,删除、补间动画等等)。
import { ipcRenderer as ipc, shell } from 'electron'
import marked from 'marked'
import { fade } from 'svelte-transitions'
import { push, splice } from 'svelte-extras'
添加 helper
destroy
的时候一定要移除监听,要不然会造成内存泄露。
export default {
data() {
return {
local_plugins: [], // 本地插件
all_plugins: [], // 所有插件
infoIndex: -1, // 展开详情
workingFilename: [] // 操作中文件
}
},
components: {
Back: '../components/Back.svelte'
},
helpers: {
marked, // markdown 处理
inWorking // 是否处理中
},
transitions: {
fade
},
computed: {
plugins: ({ all_plugins, local_plugins }) =>
addDownloaed(all_plugins, local_plugins)
},
methods: {
push,
splice,
showInfo(index) {
// 显示某一个插件介绍
const oldIndex = this.get().infoIndex
if (oldIndex == index) {
return this.set({
infoIndex: -1
})
}
this.set({
infoIndex: index
})
},
refresh() {
// 刷新
ipc.send('reload_local_plugins')
ipc.send('reload_all_plugins')
},
download(filename, url) {
// 下载插件
if (inWorking(this.get().workingFilename, filename)) {
return
}
this.push('workingFilename', filename)
filename,
url
})
},
del(filename) {
// 删除插件
if (inWorking(this.get().workingFilename, filename)) {
return
}
this.push('workingFilename', filename)
this.store.setMsg('info', `删除插件中`)
ipc.send('delete_plugin', {
filename
})
},
all_plugins(event, all_plugins) {
this.set({
all_plugins
})
},
local_plugins(event, local_plugins) {
this.set({
local_plugins
})
},
download_plugin_success(event, filename) {
// 下载成功
const filenames = this.get().workingFilename || []
let index = filenames.indexOf(filename)
if (index >= 0) {
this.splice('workingFilename', index, 1)
}
if (this.get().workingFilename == 0) this.store.success('下载完成')
},
delete_plugin_success(event, filename) {
// 删除成功
const filenames = this.get().workingFilename || []
let index = filenames.indexOf(filename)
if (index >= 0) {
this.splice('workingFilename', index, 1)
}
if (this.get().workingFilename == 0) this.store.success('删除完成')
}
},
ondestroy() {
// 清理监听
ipc.removeListener('all_plugins', this.all_plugins.bind(this))
ipc.removeListener('local_plugins', this.local_plugins.bind(this))
ipc.removeListener(
'download_plugin_success',
this.download_plugin_success.bind(this)
)
ipc.removeListener(
'delete_plugin_success',
this.delete_plugin_success.bind(this)
)
},
oncreate() {
ipc.send('get_all_plugins')
ipc.send('get_local_plugins')
ipc.on('all_plugins', this.all_plugins.bind(this))
ipc.on('local_plugins', this.local_plugins.bind(this))
ipc.on('download_plugin_success', this.download_plugin_success.bind(this))
ipc.on('delete_plugin_success', this.delete_plugin_success.bind(this))
this.refs.list.addEventListener(
// 处理点击事件,外部浏览器打开
'click',
e => {
if (e.target.tagName.toLowerCase() == 'a') {
e.preventDefault()
shell.openExternal(e.target.href)
}
},
true
)
}
}
样式
<div class="wrap">
<Link className="download-page-btn" to="Download">下载页面</Link>
<Link className="music-page-btn" to="Music">播放器</Link>
<Link className="store-page-btn" to="CrawlStore">爬虫商店</Link>
</div>
<script>
export default {
components: {
Link: '../components/Link.svelte'
},
};
</script>
<style>
.wrap {
display: flex;
height: 100vh;
flex-wrap: wrap;
background: #333;
}
.wrap :global(a) {
display: inline-flex;
width: 50%;
text-decoration: none;
justify-content: center;
align-items: center;
color: #fff;
font-size: 1rem;
letter-spacing: 5px;
transition: all .2s;
}
.wrap :global(a):hover {
background: #fb584c
</style>
修改窗口创建参数
创建一个无边框的应用。