在一个典型的 Vue 单页面应用(SPA)中,我们可以通过 Vue Router 进行路由管理,通过 Vuex 实现全局状态管理,并通过 Axios 进行异步 API 请求。以下是一个完整的 SPA 实战项目的示例,涵盖 Vue 的核心功能,包括路由、Vuex、Axios 和组件化开发。
/src
/assets # 静态资源
/components # 公共组件
/store # Vuex store
/views # 路由视图组件
/router # 路由配置
/api # API 请求
App.vue # 主应用组件
main.js # 入口文件
首先,使用 Vue CLI 创建一个新项目。
vue create vue-spa-example
选择默认的配置或手动配置 Vue Router 和 Vuex。
在 /src/router/index.js
中配置路由,包含首页(Home)和用户详情页(UserDetail)。
import Vue from 'vue';
import VueRouter from 'vue-router';
import Home from '@/views/Home.vue';
import UserDetail from '@/views/UserDetail.vue';
Vue.use(VueRouter);
const routes = [
{ path: '/', name: 'Home', component: Home },
{ path: '/user/:id', name: 'UserDetail', component: UserDetail }
];
const router = new VueRouter({
mode: 'history', // 使用 HTML5 History 模式
routes
});
export default router;
在 /src/store/index.js
中创建 Vuex store,用于管理全局状态(如用户列表)。
import Vue from 'vue';
import Vuex from 'vuex';
import axios from 'axios';
Vue.use(Vuex);
export default new Vuex.Store({
state: {
users: [], // 用户列表
userDetail: {} // 当前选中的用户详情
},
mutations: {
SET_USERS(state, users) {
state.users = users;
},
SET_USER_DETAIL(state, userDetail) {
state.userDetail = userDetail;
}
},
actions: {
fetchUsers({ commit }) {
axios.get('https://jsonplaceholder.typicode.com/users')
.then(response => {
commit('SET_USERS', response.data);
});
},
fetchUserDetail({ commit }, userId) {
axios.get(`https://jsonplaceholder.typicode.com/users/${userId}`)
.then(response => {
commit('SET_USER_DETAIL', response.data);
});
}
}
});
在 /src/api/index.js
中创建 Axios 实例和 API 请求函数。
import axios from 'axios';
const apiClient = axios.create({
baseURL: 'https://jsonplaceholder.typicode.com',
timeout: 10000
});
export function getUsers() {
return apiClient.get('/users');
}
export function getUserDetail(id) {
return apiClient.get(`/users/${id}`);
}
在 /src/views/Home.vue
中创建一个用户列表页面,通过 Vuex 获取用户数据,并展示在页面上。
<template>
<div>
<h1>User List</h1>
<ul>
<li v-for="user in users" :key="user.id">
<router-link :to="{ name: 'UserDetail', params: { id: user.id } }">
{{ user.name }}
</router-link>
</li>
</ul>
</div>
</template>
<script>
export default {
computed: {
users() {
return this.$store.state.users;
}
},
created() {
this.$store.dispatch('fetchUsers'); // 获取用户列表
}
};
</script>
在 /src/views/UserDetail.vue
中创建一个用户详情页面,通过 Vuex 获取用户的详细信息,并展示出来。
<template>
<div v-if="user">
<h2>User Details</h2>
<p><strong>Name:</strong> {{ user.name }}</p>
<p><strong>Email:</strong> {{ user.email }}</p>
<p><strong>Phone:</strong> {{ user.phone }}</p>
<router-link to="/">Back to user list</router-link>
</div>
</template>
<script>
export default {
computed: {
user() {
return this.$store.state.userDetail;
}
},
created() {
const userId = this.$route.params.id;
this.$store.dispatch('fetchUserDetail', userId); // 获取用户详情
}
};
</script>
在 /src/App.vue
中设置基本布局和路由出口。
<template>
<div id="app">
<router-view></router-view> <!-- 路由出口 -->
</div>
</template>
<script>
export default {
name: 'App'
};
</script>
在 /src/main.js
中挂载 Vue 实例,并引入路由和 Vuex store。
import Vue from 'vue';
import App from './App.vue';
import router from './router';
import store from './store';
Vue.config.productionTip = false;
new Vue({
router,
store,
render: h => h(App)
}).$mount('#app');
通过以下命令启动开发服务器:
npm run serve
浏览器中打开 http://localhost:8080
,你将看到一个用户列表。点击用户名称将跳转到用户详情页面,展示详细的用户信息。
/user/:id
),可以为每个用户生成一个唯一的 URL。state
存储了用户列表和用户详情,actions
通过 Axios 请求数据,并通过 mutations
修改状态。你可以进一步扩展这个项目,添加以下功能:
通过这种 SPA 项目,你可以全面掌握 Vue 的各个核心功能,同时能够进行更复杂的 Vue 应用开发。