如何使用 vuex 删除项目?

Posted

技术标签:

【中文标题】如何使用 vuex 删除项目?【英文标题】:How delete an item using vuex? 【发布时间】:2019-05-03 09:56:00 【问题描述】:

刚开始学习vuex,无法删除item。我可以直接在组件中删除项目。

deleteCar (cars, id) 
        this.$http.delete('http://localhost:3000/cars/' + cars.id)
          .then(() =>               
              this.cars.splice(id, 1)
          )
      

在 vuex 中我有:

state: 
    car: ,
    cars: []
  ,
  mutations: 
    ADD_CAR (state, car) 
      state.car = car
    ,
    GET_CARS (state, cars) 
      state.cars = cars
    

  ,
  actions: 
    createCar(commit, car) 
      axios.post('http://localhost:3000/cars', car)
        .then(() => 
          commit('ADD_CAR', car)
        )
    ,

    loadCars(commit) 
      axios.get('http://localhost:3000/cars')
        .then(res => 
            const cars = res.data
            commit('GET_CARS', cars)
        )
    
  

我要删除项目的组件中的代码:

<div class="card mb-3" v-for="(car, i) in cars" :key="i">
      <div class="card-header">
      Cars name:  car.carName 
      </div>
      <div class="card-body">
        <h5 class="card-title">Country:  car.country </h5>
        <p class="card-text">Year of manufacture:  car.carYear </p>
        <button class="btn btn-primary mb-5" @click="deleteCar(car, i)">Delete Car</button>
      </div>
    </div>

我可以添加汽车并获取汽车。但不能删除

【问题讨论】:

How to remove an item from an array in Vue.js的可能重复 【参考方案1】:

我看到你正在使用 Axios 和 Vue,所以你的请求 .delete 请求已经删除但在 .then 你应该做一些与删除或拼接无关的事情,

     deleteCar (cars) 
        this.$http
          .delete('http://localhost:3000/cars/' + cars.id',  data: payload )
          .then(
            //here write what you want after delete
            res => console.log(res);
          )
      

.then 中,您在删除后执行您需要的操作,因为.delete 请求已经从您的 JSON 数据中删除了该部分

【讨论】:

我只想从数组中删除项目。但是想用 axios 做到这一点。我可以用 axios 获取数据,可以发布。但是删除有问题【参考方案2】:

你想提交一个突变来删除汽车

这是你的方法

deleteCar (cars, id) 
        this.$http.delete('http://localhost:3000/cars/' + cars.id)
          .then(() =>               
              this.cars.splice(id, 1)
          )
      

您需要将其更改为 deleteCars(commit, id) 而不是 deleteCar(cars, id)

所以你的行动是

deleteCar (commit, id) 
        this.$http.delete('http://localhost:3000/cars/' + id)
          .then(() =>               
              commit('DELETE_CAR', id)
          )
      

你有一个突变DELETE_CAR

DELETE_CAR(state, id)
 index = state.cars.findIndex(car => car.id == id)
 state.cars.splice(index, 1)

【讨论】:

在突变 DELETE_CAR 中,我会在该索引之后放置一个 if 语句,因为如果找不到汽车 findIndex 返回 -1 哪个拼接将用于从数组末尾删除元素 - 可能不是效果你想要的。【参考方案3】:

为了清楚起见,一个简化的答案。

在模板中:

<button @click="deleteCar(car)">Delete Car</button>

组件中的方法:

 deleteCar(car) 
    this.$store.commit('DELETE_CAR', car);
 

商店中的变异:

 DELETE_CAR(state, car) 
    var index = state.cars.findIndex(c => c.id == car.id);
    state.cars.splice(index, 1);
 

【讨论】:

以上是关于如何使用 vuex 删除项目?的主要内容,如果未能解决你的问题,请参考以下文章

如何更新 vuex 存储数组中的对象?

关于如何使用vuex

如何在带有 vuetify 和 vuex 的 Vuejs 项目中使用 Jest?节点模块和 Vuetify 问题

Vue项目中如何快速上手Vuex状态管理--使用心得-值得珍藏

vuex 的使用,中大型项目必备

大型Vuex项目 ,使用module后, 如何调用其他模块的 属性值和方法