feat: add vue-router and layout components

This commit is contained in:
Tim
2025-07-02 21:17:37 +08:00
parent cc5aa89083
commit 425bd8a596
8 changed files with 152 additions and 10 deletions

View File

@@ -9,7 +9,8 @@
"version": "0.1.0",
"dependencies": {
"core-js": "^3.8.3",
"vue": "^3.2.13"
"vue": "^3.2.13",
"vue-router": "^4.5.1"
},
"devDependencies": {
"@babel/core": "^7.12.16",
@@ -2901,6 +2902,12 @@
"dev": true,
"license": "ISC"
},
"node_modules/@vue/devtools-api": {
"version": "6.6.4",
"resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.6.4.tgz",
"integrity": "sha512-sGhTPMuXqZ1rVOk32RylztWkfXTRhuS7vgAKv0zjqk8gbsHkJ7xfFf+jbySxt7tWObEJwyKaHMikV/WGDiQm8g==",
"license": "MIT"
},
"node_modules/@vue/reactivity": {
"version": "3.5.17",
"resolved": "https://registry.npmmirror.com/@vue/reactivity/-/reactivity-3.5.17.tgz",
@@ -11398,6 +11405,21 @@
"url": "https://github.com/chalk/chalk?sponsor=1"
}
},
"node_modules/vue-router": {
"version": "4.5.1",
"resolved": "https://registry.npmjs.org/vue-router/-/vue-router-4.5.1.tgz",
"integrity": "sha512-ogAF3P97NPm8fJsE4by9dwSYtDwXIY1nFY9T6DyQnGHd1E2Da94w9JIolpe42LJGIl0DwOHBi8TcRPlPGwbTtw==",
"license": "MIT",
"dependencies": {
"@vue/devtools-api": "^6.6.4"
},
"funding": {
"url": "https://github.com/sponsors/posva"
},
"peerDependencies": {
"vue": "^3.2.0"
}
},
"node_modules/vue-style-loader": {
"version": "4.1.3",
"resolved": "https://registry.npmmirror.com/vue-style-loader/-/vue-style-loader-4.1.3.tgz",

View File

@@ -9,7 +9,8 @@
},
"dependencies": {
"core-js": "^3.8.3",
"vue": "^3.2.13"
"vue": "^3.2.13",
"vue-router": "^4.5.1"
},
"devDependencies": {
"@babel/core": "^7.12.16",

View File

@@ -1,15 +1,22 @@
<template>
<img alt="Vue logo" src="./assets/logo.png">
<HelloWorld msg="Welcome to Your Vue.js App"/>
<div id="app">
<HeaderComponent @toggle-menu="menuVisible = !menuVisible" />
<MenuComponent :visible="menuVisible" />
<div class="content" :class="{ 'with-menu': menuVisible }">
<router-view />
</div>
</div>
</template>
<script>
import HelloWorld from './components/HelloWorld.vue'
import HeaderComponent from './components/HeaderComponent.vue'
import MenuComponent from './components/MenuComponent.vue'
export default {
name: 'App',
components: {
HelloWorld
components: { HeaderComponent, MenuComponent },
data() {
return { menuVisible: true }
}
}
</script>
@@ -19,8 +26,14 @@ export default {
font-family: Avenir, Helvetica, Arial, sans-serif;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
text-align: center;
color: #2c3e50;
margin-top: 60px;
}
.content {
margin-left: 0;
transition: margin-left 0.3s ease;
padding-top: 60px;
}
.content.with-menu {
margin-left: 200px;
}
</style>

View File

@@ -0,0 +1,30 @@
<template>
<header class="header">
<div class="logo">🌴</div>
<button class="menu-btn" @click="$emit('toggle-menu')"></button>
</header>
</template>
<script>
export default {
name: 'HeaderComponent'
}
</script>
<style scoped>
.header {
display: flex;
justify-content: space-between;
align-items: center;
padding: 10px 20px;
background-color: #42b983;
color: white;
}
.menu-btn {
font-size: 24px;
background: none;
border: none;
color: inherit;
cursor: pointer;
}
</style>

View File

@@ -0,0 +1,40 @@
<template>
<transition name="slide">
<nav v-if="visible" class="menu">
<ul>
<li><router-link to="/">Home</router-link></li>
</ul>
</nav>
</transition>
</template>
<script>
export default {
name: 'MenuComponent',
props: {
visible: {
type: Boolean,
default: true
}
}
}
</script>
<style scoped>
.menu {
width: 200px;
background-color: #f5f5f5;
padding: 10px;
position: fixed;
left: 0;
top: 0;
bottom: 0;
overflow-y: auto;
}
.slide-enter-active, .slide-leave-active {
transition: transform 0.3s ease;
}
.slide-enter-from, .slide-leave-to {
transform: translateX(-100%);
}
</style>

View File

@@ -1,4 +1,5 @@
import { createApp } from 'vue'
import App from './App.vue'
import router from './router'
createApp(App).mount('#app')
createApp(App).use(router).mount('#app')

View File

@@ -0,0 +1,17 @@
import { createRouter, createWebHistory } from 'vue-router'
import HomePageView from '../views/HomePageView.vue'
const routes = [
{
path: '/',
name: 'home',
component: HomePageView
}
]
const router = createRouter({
history: createWebHistory(),
routes
})
export default router

View File

@@ -0,0 +1,18 @@
<template>
<div class="home-page">
<h1>Home Page</h1>
<p>Welcome to OpenIsle</p>
</div>
</template>
<script>
export default {
name: 'HomePageView'
}
</script>
<style scoped>
.home-page {
padding: 20px;
}
</style>