1. Vue 3 項目的文檔結構
Vue 3 項目通常基于 Vue CLI 或 Vite 等工具創建,其文檔結構如下:
常見目錄結構
my-vue-project/
├── public/ # 靜態資源目錄
│ ├── index.html # 入口頁面
├── src/ # 源代碼目錄
│ ├── assets/ # 靜態資源(如圖片、樣式文件等)
│ ├── components/ # Vue 組件
│ ├── views/ # 頁面級組件
│ ├── router/ # 路由配置
│ ├── store/ # 狀態管理(Vuex)
│ ├── App.vue # 根組件
│ ├── main.js # 入口文件
├── package.json # 項目依賴配置
├── vue.config.js # Vue 配置文件(可選)
各部分說明
-
**
public/
**:存放靜態資源,如index.html
,它是項目的入口頁面。 - **
src/
**:存放項目的源代碼。-
**
assets/
**:存放圖片、字體等靜態資源。 -
**
components/
**:存放可復用的 Vue 組件。 -
**
views/
**:存放頁面級組件。 -
**
router/
**:存放路由配置文件。 -
**
store/
**:存放 Vuex 狀態管理相關代碼。 -
**
App.vue
**:項目的根組件。 -
**
main.js
**:項目的入口文件,負責初始化 Vue 應用。
-
2. main.js
、index.html
、App.vue
的相互調用關系
index.html
-
這是項目的入口頁面,通常由 Vue CLI 或 Vite 自動生成。
-
它通過
<div id="app"></div>
定義了一個掛載點,Vue 應用會通過這個掛載點渲染到頁面上。 - 示例:
<!DOCTYPE html> <html lang=""><head><meta charset="UTF-8"><link rel="icon" href="/favicon.ico"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Vite App</title></head><body><div id="app"></div> //定義掛載點<script type="module" src="/src/main.js"></script> //掛載main.js(創建vue應用)</body> </html>
main.js
-
這是 Vue 項目的入口文件,負責創建 Vue 應用實例,并將其掛載到
index.html
中的<div id="app"></div>
上。 - 示例:
import?{?createApp?}?from?'vue'; import?App?from?'./App.vue';createApp(App).mount('#app');
- 在這段代碼中:
-
使用
createApp
創建一個 Vue 應用實例。 -
將
App.vue
作為根組件傳遞給createApp
。 -
使用
.mount('#app')
將應用掛載到index.html
中的<div id="app"></div>
上。將 Vue 應用的根組件掛載到頁面上的指定 DOM 元素(掛載點,即id="app"的div
)中,啟動 Vue 應用。 -
沒有 .mount('#app') 的后果:Vue 應用不會被掛載到頁面上,頁面上不會顯示任何 Vue 組件的內容。
-
掛載點:通常是
index.html
中的<div id="app"></div>
-
App.vue
-
這是項目的根組件,是所有組件的父組件。
-
它通常包含全局布局和一些全局組件。
- 示例:
<script setup> import HelloWorld from './components/HelloWorld.vue' import TheWelcome from './components/TheWelcome.vue' </script><template><header><img alt="Vue logo" class="logo" src="./assets/logo.svg" width="125" height="125" /><div class="wrapper"><HelloWorld msg="You did it!" /></div></header><main><TheWelcome /></main> </template><style scoped> header {line-height: 1.5; }.logo {display: block;margin: 0 auto 2rem; }@media (min-width: 1024px) {header {display: flex;place-items: center;padding-right: calc(var(--section-gap) / 2);}.logo {margin: 0 2rem 0 0;}header .wrapper {display: flex;place-items: flex-start;flex-wrap: wrap;} } </style>
調用關系
-
**
index.html
**:定義了掛載點<div id="app"></div>
。 -
**
main.js
**:創建 Vue 應用實例,并將其掛載到index.html
的<div id="app"></div>
上。 -
**
App.vue
**:作為根組件,被main.js
加載并渲染到頁面上。
3. 新開發頁面的加載位置
功能需求
-
類似于百度查詢的頁面,用戶輸入問題,點擊發送或按下回車鍵后,調用后端 API 獲取回答,并顯示在頁面上。
代碼加載位置
-
**
App.vue
**:作為根組件,可以將查詢頁面的邏輯封裝在其中。 -
**
src/components/
**:如果查詢頁面是一個獨立的組件,可以將其放在components
目錄下,例如命名為AISearch.vue
。
示例代碼
如果放在 App.vue
中
<template><div class="chat-container"><div v-for="(msg, index) in messages" :key="index"><div :class="msg.type === 'user' ? 'user-msg' : 'bot-msg'">{{ msg.content }}</div></div><input v-model="newQuestion" @keyup.enter="sendMessage" /></div>
</template><script setup>
import { ref } from 'vue';
import axios from 'axios';const messages = ref([]);
const newQuestion = ref('');const API_URL = "/api/ask";async function sendMessage() {const response = await axios.post(API_URL, {question: newQuestion.value});messages.value.push({ type: 'bot', content: response.data.answer });newQuestion.value = '';
}
</script><style>
.user-msg { align-self: flex-end; background: #0084ff; color: white; }
.bot-msg { align-self: flex-start; background: #f0f0f0; }
</style>
如果放在獨立組件 AISearch.vue
中
-
**
AISearch.vue
**:<template><div class="chat-container"><div v-for="(msg, index) in messages" :key="index"><div :class="msg.type === 'user' ? 'user-msg' : 'bot-msg'">{{ msg.content }}</div></div><input v-model="newQuestion" @keyup.enter="sendMessage" /></div> </template><script setup> import { ref } from 'vue'; import axios from 'axios';const messages = ref([]); const newQuestion = ref('');const API_URL = "/api/ask";async function sendMessage() {const response = await axios.post(API_URL, {question: newQuestion.value});messages.value.push({ type: 'bot', content: response.data.answer });newQuestion.value = ''; } </script><style> .user-msg { align-self: flex-end; background: #0084ff; color: white; } .bot-msg { align-self: flex-start; background: #f0f0f0; } </style>
-
**在
App.vue
中引入并使用AISearch.vue
**:<template><div id="app"><AISearch /></div> </template><script> import AISearch from './components/AISearch.vue';export default {components: {AISearch} }; </script>
總結
-
如果查詢頁面是項目的唯一功能,可以直接將代碼放在
App.vue
中。 -
如果項目結構更復雜,建議將查詢頁面封裝為獨立組件(如
AISearch.vue
),并在App.vue
中引入使用。