当前位置:首页 > VUE

vue 实现删除传值

2026-01-20 09:19:13VUE

Vue 实现删除传值的方法

在 Vue 中实现删除并传值通常涉及父子组件通信或事件触发。以下是几种常见实现方式:

通过 props 和 $emit 实现父子组件传值

父组件传递数据和方法给子组件,子组件触发删除操作后回传数据:

vue 实现删除传值

<!-- 父组件 -->
<template>
  <child-component :items="items" @delete-item="handleDelete" />
</template>

<script>
export default {
  data() {
    return {
      items: [{ id: 1, name: 'Item 1' }, { id: 2, name: 'Item 2' }]
    }
  },
  methods: {
    handleDelete(itemId) {
      this.items = this.items.filter(item => item.id !== itemId)
    }
  }
}
</script>

<!-- 子组件 -->
<template>
  <div v-for="item in items" :key="item.id">
    {{ item.name }}
    <button @click="$emit('delete-item', item.id)">Delete</button>
  </div>
</template>

<script>
export default {
  props: ['items']
}
</script>

使用 v-model 实现双向绑定

通过 v-model 实现更简洁的双向数据绑定:

vue 实现删除传值

<!-- 父组件 -->
<template>
  <child-component v-model="items" />
</template>

<script>
export default {
  data() {
    return {
      items: [{ id: 1, name: 'Item 1' }, { id: 2, name: 'Item 2' }]
    }
  }
}
</script>

<!-- 子组件 -->
<template>
  <div v-for="(item, index) in value" :key="item.id">
    {{ item.name }}
    <button @click="removeItem(index)">Delete</button>
  </div>
</template>

<script>
export default {
  props: ['value'],
  methods: {
    removeItem(index) {
      this.$emit('input', [
        ...this.value.slice(0, index),
        ...this.value.slice(index + 1)
      ])
    }
  }
}
</script>

使用 Vuex 状态管理

对于大型应用,可以使用 Vuex 集中管理状态:

// store.js
export default new Vuex.Store({
  state: {
    items: [{ id: 1, name: 'Item 1' }, { id: 2, name: 'Item 2' }]
  },
  mutations: {
    DELETE_ITEM(state, itemId) {
      state.items = state.items.filter(item => item.id !== itemId)
    }
  },
  actions: {
    deleteItem({ commit }, itemId) {
      commit('DELETE_ITEM', itemId)
    }
  }
})
<!-- 组件中使用 -->
<template>
  <div v-for="item in $store.state.items" :key="item.id">
    {{ item.name }}
    <button @click="deleteItem(item.id)">Delete</button>
  </div>
</template>

<script>
export default {
  methods: {
    deleteItem(itemId) {
      this.$store.dispatch('deleteItem', itemId)
    }
  }
}
</script>

使用事件总线实现跨组件通信

对于非父子关系的组件通信,可以使用事件总线:

// eventBus.js
import Vue from 'vue'
export const EventBus = new Vue()
<!-- 发送事件的组件 -->
<template>
  <button @click="deleteItem(item.id)">Delete</button>
</template>

<script>
import { EventBus } from './eventBus'
export default {
  methods: {
    deleteItem(itemId) {
      EventBus.$emit('item-deleted', itemId)
    }
  }
}
</script>

<!-- 接收事件的组件 -->
<script>
import { EventBus } from './eventBus'
export default {
  created() {
    EventBus.$on('item-deleted', itemId => {
      // 处理删除逻辑
    })
  }
}
</script>

注意事项

  • 对于列表渲染,始终使用唯一的 key 属性
  • 考虑使用深层对象时可能需要 Vue.set 或展开运算符确保响应式更新
  • 大型应用推荐使用 Vuex 管理状态,小型项目可使用 props/emit
  • 事件总线适合简单场景,复杂场景可能产生维护问题

以上方法可根据具体项目需求选择使用,组合式 API 的写法也类似,只是语法稍有不同。

标签: vue
分享给朋友:

相关文章

vue实现发表

vue实现发表

Vue 实现发表功能 在 Vue 中实现发表功能通常涉及表单处理、数据绑定和网络请求。以下是实现步骤和代码示例: 表单设计与数据绑定 创建一个表单用于输入发表内容,使用 v-model 进行数据双向…

vue实现frame

vue实现frame

Vue 中实现 iframe 的方法 在 Vue 中可以通过直接使用 <iframe> 标签或动态绑定 src 属性来实现 iframe 功能。 基本用法 <template&g…

vue实现试卷

vue实现试卷

Vue实现试卷系统的基本思路 使用Vue.js构建试卷系统需要结合组件化开发、状态管理和后端数据交互。核心功能包括题目展示、答题逻辑、计时器和提交答案。 核心功能模块划分 试卷组件结构 试卷容器组…

vue实现ajax

vue实现ajax

Vue 中实现 AJAX 的几种方法 在 Vue 中实现 AJAX 请求可以通过原生 JavaScript 的 XMLHttpRequest、第三方库如 axios 或 fetch API 来完成。以…

vue实现数组

vue实现数组

Vue 实现数组操作的方法 在 Vue 中,数组的操作需要特别注意响应式的问题。Vue 提供了一些方法来确保数组的变动能够触发视图更新。 响应式数组方法 Vue 对以下数组方法进行了封装,确保它们能…

vue多选实现

vue多选实现

Vue 多选实现方法 基础实现(v-model + multiple) 在 Vue 中实现多选可以通过 <select> 元素的 multiple 属性结合 v-model 完成。v-mo…