Vue单页面应用

 前端   打工人   2024-09-14 07:03   220
  Vue

在一个典型的 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       # 入口文件

步骤 1:创建项目

首先,使用 Vue CLI 创建一个新项目。

vue create vue-spa-example

选择默认的配置或手动配置 Vue Router 和 Vuex。

步骤 2:配置 Vue Router

/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;

步骤 3:配置 Vuex

/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);
        });
    }
  }
});

步骤 4:创建 API 模块

/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}`);
}

步骤 5:创建 Home 视图

/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>

步骤 6:创建 UserDetail 视图

/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>

步骤 7:主应用组件

/src/App.vue 中设置基本布局和路由出口。

<template>
  <div id="app">
    <router-view></router-view> <!-- 路由出口 -->
  </div>
</template>

<script>
export default {
  name: 'App'
};
</script>

步骤 8:入口文件

/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');

步骤 9:项目运行

通过以下命令启动开发服务器:

npm run serve

浏览器中打开 http://localhost:8080,你将看到一个用户列表。点击用户名称将跳转到用户详情页面,展示详细的用户信息。

完整功能解释

  • Vue Router:我们使用了 Vue Router 来管理应用的不同页面(首页和用户详情页)。通过动态路由(/user/:id),可以为每个用户生成一个唯一的 URL。
  • Vuex:我们使用 Vuex 来存储全局的用户数据。state 存储了用户列表和用户详情,actions 通过 Axios 请求数据,并通过 mutations 修改状态。
  • Axios:Axios 用于与后端 API 进行交互。我们通过 Axios 请求用户列表和用户详情,并将这些数据存储在 Vuex 中。
  • 组件化开发:用户列表和用户详情页是独立的组件,这些组件通过 Vue Router 路由进行切换,同时它们都共享 Vuex 中的全局状态。

项目扩展

你可以进一步扩展这个项目,添加以下功能:

  1. 表单提交:在用户详情页中增加一个表单,用于编辑和保存用户信息。
  2. 权限控制:通过 Vue Router 的导航守卫来添加路由访问的权限控制。
  3. 分页和搜索:在用户列表中增加分页和搜索功能,使其更加实用。
  4. 错误处理:使用 Axios 拦截器或 Vuex 捕获 API 请求的错误,并在页面中显示友好的错误信息。

通过这种 SPA 项目,你可以全面掌握 Vue 的各个核心功能,同时能够进行更复杂的 Vue 应用开发。