当前位置:首页 > VUE

vue实现CRUD

2026-01-08 00:44:12VUE

Vue 实现 CRUD 操作

Vue 提供了响应式数据绑定和组件化开发能力,结合后端 API 可以轻松实现 CRUD(增删改查)功能。以下是基于 Vue 3 和 Axios 的完整实现方案。

安装依赖

确保项目中已安装 axios 用于 HTTP 请求:

npm install axios

基础组件结构

创建一个 UserList.vue 组件作为示例:

<template>
  <div>
    <button @click="showAddModal">添加用户</button>
    <table>
      <tr v-for="user in users" :key="user.id">
        <td>{{ user.name }}</td>
        <td>
          <button @click="editUser(user)">编辑</button>
          <button @click="deleteUser(user.id)">删除</button>
        </td>
      </tr>
    </table>

    <!-- 添加/编辑模态框 -->
    <dialog v-if="showModal">
      <input v-model="currentUser.name" placeholder="姓名">
      <button @click="saveUser">保存</button>
      <button @click="closeModal">取消</button>
    </dialog>
  </div>
</template>

数据与状态管理

<script>
import { ref, onMounted } from 'vue'
import axios from 'axios'

export default {
  setup() {
    const users = ref([])
    const showModal = ref(false)
    const currentUser = ref({ id: null, name: '' })
    const isEditMode = ref(false)

    const fetchUsers = async () => {
      const response = await axios.get('/api/users')
      users.value = response.data
    }

    onMounted(fetchUsers)

    return {
      users,
      showModal,
      currentUser,
      isEditMode,
      fetchUsers
    }
  }
}
</script>

CRUD 方法实现

methods: {
  showAddModal() {
    this.currentUser = { id: null, name: '' }
    this.isEditMode = false
    this.showModal = true
  },

  editUser(user) {
    this.currentUser = { ...user }
    this.isEditMode = true
    this.showModal = true
  },

  async saveUser() {
    if (this.isEditMode) {
      await axios.put(`/api/users/${this.currentUser.id}`, this.currentUser)
    } else {
      await axios.post('/api/users', this.currentUser)
    }
    this.fetchUsers()
    this.closeModal()
  },

  async deleteUser(id) {
    if (confirm('确定删除吗?')) {
      await axios.delete(`/api/users/${id}`)
      this.fetchUsers()
    }
  },

  closeModal() {
    this.showModal = false
  }
}

样式优化

<style scoped>
table {
  width: 100%;
  border-collapse: collapse;
}
tr:nth-child(even) {
  background-color: #f2f2f2;
}
dialog {
  padding: 20px;
  border-radius: 5px;
}
</style>

进阶优化方案

使用 Pinia 进行状态管理

创建 usersStore.js

import { defineStore } from 'pinia'

export const useUsersStore = defineStore('users', {
  state: () => ({
    users: [],
    currentUser: null
  }),
  actions: {
    async fetchUsers() {
      const res = await axios.get('/api/users')
      this.users = res.data
    },
    async saveUser(user) {
      if (user.id) {
        await axios.put(`/api/users/${user.id}`, user)
      } else {
        await axios.post('/api/users', user)
      }
      this.fetchUsers()
    }
  }
})

表单验证

添加 Vuelidate 进行验证:

import { useVuelidate } from '@vuelidate/core'
import { required } from '@vuelidate/validators'

export default {
  setup() {
    const rules = {
      name: { required }
    }
    const v$ = useVuelidate(rules, currentUser)
    return { v$ }
  }
}

API 服务封装

创建 apiService.js

vue实现CRUD

const API_URL = '/api/users'

export default {
  getAll() {
    return axios.get(API_URL)
  },
  create(user) {
    return axios.post(API_URL, user)
  },
  update(id, user) {
    return axios.put(`${API_URL}/${id}`, user)
  },
  delete(id) {
    return axios.delete(`${API_URL}/${id}`)
  }
}

注意事项

  1. 后端 API 需要实现对应的 RESTful 接口
  2. 处理网络请求错误时应该添加 catch 块
  3. 对于大型项目建议使用 Vuex/Pinia 集中管理状态
  4. 表单提交建议添加防抖或禁用按钮防止重复提交
  5. 列表数据量大时应考虑分页加载

以上方案可根据实际项目需求进行调整,核心逻辑是通过 Vue 的响应式特性同步前端状态与后端数据。

标签: vueCRUD
分享给朋友:

相关文章

vue前端分页怎么实现

vue前端分页怎么实现

前端分页实现方法 在Vue中实现前端分页通常涉及数据分割和页面控制逻辑。以下是常见的实现方式: 使用计算属性分页 通过计算属性对数据进行切片处理: computed: { paginatedD…

vue实现导航栏切图

vue实现导航栏切图

Vue 实现导航栏切图 使用 Vue Router 实现基础导航 在 Vue 项目中,可以通过 Vue Router 实现导航栏的路由切换。创建一个导航栏组件,并在其中使用 <router-li…

vue实现mouseout

vue实现mouseout

Vue 实现 mouseout 事件的方法 在 Vue 中实现 mouseout 事件可以通过多种方式完成,以下是几种常见的方法: 使用 v-on 指令 Vue 提供了 v-on 指令(或简写为 @…

vue ref实现

vue ref实现

Vue 中 ref 的实现 在 Vue 中,ref 是一个用于创建响应式引用的 API,适用于基本类型和对象。以下是 ref 的核心实现原理和使用方法。 基本实现原理 ref 通过 Reactive…

vue键盘实现

vue键盘实现

监听键盘事件 在Vue中监听键盘事件可以通过v-on指令或@缩写实现。常见的键盘事件包括keydown、keyup和keypress。例如监听回车键事件: <template> &l…

自实现vue

自实现vue

实现 Vue 的核心功能 要实现一个简化版的 Vue,需要理解其核心功能:数据响应式、模板编译、虚拟 DOM 和组件系统。以下是关键步骤的分解: 数据响应式 Vue 使用 Object.define…