Как я могу вызвать компонент редактирования в другом файле?

#vue.js #vuetify.js

#vue.js #vuetify.js

Вопрос:

У меня есть проект, и этот проект предназначен для владельцев покупки для покупки автомобилей и многих других операций, но у меня есть таблица с несколькими столбцами, и внутри этих столбцов есть столбец, в котором я слушаю действие, и в этом столбце есть кнопка под названием Редактировать, и я хочу, чтобы при нажатии на неекнопка редактирования, которая будет использоваться компонентом модификации в этом файле, как я могу это сделать? И это файл редактирования, в котором находится форма редактирования. Edit.vue:

 <template>
  <v-row justify="center">
    <v-dialog v-model="editDialog" persistent max-width="1050px" height="400px">
      <template v-slot:activator="{ on, attrs }">
        <v-btn
          fab
          accent
          class="grey lighten-1 margin pa-4"
          dark
          v-bind="attrs"
          v-on="on"
        >
          <v-icon>
            mdi-pencil
          </v-icon>
        </v-btn>
      </template>
      <v-card>
        <v-layout>
          <v-flex xs12>
            <div class="myfont pl-5">
              <v-card-title>
                <span> Edit Car</span>
              </v-card-title>
            </div>
          </v-flex>
        </v-layout>
        <v-divider xs12></v-divider>
        <v-layout>
          <v-flex xs12>
            <v-card-text>
              <v-container>
                <v-row>
                  <v-col cols="12">
                    <v-text-field
                      name="name"
                      label="Name"
                      id="name"
                      class="colorLabel"
                      v-model="editedName"
                      multi-line
                      required
                    ></v-text-field>
                  </v-col>
                  <v-col cols="12">
                    <v-text-field
                      name="priceOfSale"
                      label="Price Of Sale"
                      id="priceOfSale"
                      v-model="editedPrice"
                      class="colorLabel"
                      multi-line
                      required
                    ></v-text-field>
                  </v-col>
                  <v-col cols="12">
                    <v-text-field
                      name="numberOfSeats"
                      label="NumberOfSeats"
                      id="numberOfSeats"
                      v-model="editedNumberOfSeats"
                      multi-line
                      required
                    ></v-text-field>
                  </v-col>
                </v-row>
              </v-container>
            </v-card-text>
          </v-flex>
        </v-layout>
        <v-divider></v-divider>
        <v-layout>
          <v-flex xs12>
            <v-card-actions>
              <v-btn class="myfont pl-5 text-right" text @click="onSaveChanges">
                Save
              </v-btn>
              <v-btn
                class="myfont pl-5 text-center"
                text
                @click="editDialog = false"
              >
                Cancel
              </v-btn>
            </v-card-actions>
          </v-flex>
        </v-layout>
      </v-card>
    </v-dialog>
  </v-row>
</template>
<script>
import { mapActions } from "vuex";
import ActionsTypes from "../store/types/actions-types";
export default {
  props: ["car"],
  data() {
    return {
      editedName: this.car.name,
      editedPrice: this.car.price,
      editedNumberOfSeats: this.car.seatsNumber,
    };
  },
  methods: {
    ...mapActions({
      editCarInformations: ActionsTypes.EDIT_CAR_ACTION,
    }),
    onSaveChanges() {
      const UpdatedCar = { ...this.car };
      UpdatedCar.name = this.editedName;
      UpdatedCar.price = this.editedPrice;
      UpdatedCar.seatsNumber = this.editedNumberOfSeats;
      this.editCarInformations(UpdatedCar);
    },
  },
};
</script>
 

Этот файл, в котором есть таблица, содержащая несколько столбцов, а последний столбец — Action, который содержит кнопку Modify, кнопку Modify, и когда я нажимаю на нее, вызывается юниверс поправки.
viewAllCars:

 <template>
  <v-app class="bg">
    <v-container>
      <v-card
        class="mx-auto mt-5 pa-3"
        max-width="100%"
        id="limited-products"
        :style="'border: 0px solid #D50000;'"
      >
        <v-btn class="red accent-4 color myfont pl-3" @click="onCreateCar">
          evict Cashig 
        </v-btn>
        <v-data-table
          :headers="tableHeaders"
          :items="loadedCarsGetter"
          :page.sync="page"
          :items-per-page="itemsPerPage"
          hide-default-footer
          class="elevation-1"
          @page-count="pageCount = $event"
        >
          <template #[`item.actions`]="{ item }">
            <v-btn icon @click="edit(item.id)">
              <v-icon>mdi-pencil</v-icon>
            </v-btn>
            <v-btn icon @click="delete (item.id)">
              <v-icon>mdi-delete</v-icon>
            </v-btn>
          </template>
        </v-data-table>  
        <!-- pagination -->
        <div class="text-center pt-2">
          <v-pagination v-model="page" :length="pageCount"></v-pagination>
          <v-text-field
            :value="itemsPerPage"
            label="Items per page"
            type="number"
            min="-1"
            max="15"
            @input="itemsPerPage = parseInt($event, 10)"
            class="pl-7 pr-7"
          ></v-text-field>
        </div>
      </v-card>
    </v-container>
  </v-app>
</template>
<script>
import { mapActions, mapGetters } from "vuex";
import ActionsTypes from "../../store/types/actions-types";
import GettersTypes from "../../store/types/getters-types";
export default {
  data() {
    return {
      page: 1,
      pageCount: 0,
      itemsPerPage: 10
    };
  },
  created() {},
  computed: {
    ...mapGetters({
      loadedCarsGetter: GettersTypes.GET_CAR_FORM_GETTER,
      tableHeaders: GettersTypes.GET_HEADERS_TABLE_GETTER,
    }),
  },
  mounted() {
    // this.loadedCarsGetter();
    this.loadedCarsAction();
  },
  methods: {
    ...mapActions({
      editcardispatcher: ActionsTypes.EDIT_CAR_ACTION,
      deletecardispatcher: ActionsTypes.DELETE_CAR_ACTION,
      loadedCarsAction: ActionsTypes.GET_ALL_CAR_ACTION
    }),
    edit() {
      this.editcardispatcher({});
    },
    delete(){
      this.deletecardispatcher(
        this.car.id
    )
    }
  },
};
</script>
 

Ответ №1:

Прежде всего, вам не нужна «v-row» в Edit.vue. Удалите его.

Поскольку у вас есть кнопка в качестве активатора, вы должны просто добавить компонент, как упоминал Авраам. Но вы должны знать, что при таком подходе есть некоторые оговорки

  • Это приведет к увеличению использования памяти браузером. Как отдельный экземпляр Edit.vue будет добавлен в DOM для каждой строки в вашей таблице.
  • Каждый экземпляр Edit.vue сохранит в нем данные с изменениями, которые может внести пользователь. И вам придется обрабатывать сброс данных.

Лучшим решением было бы добавить только один экземпляр Edit.vue и добавить / удалить компонент из DOM с помощью v-if .

При этом ваша таблица будет использовать один экземпляр Edit.vue, а добавление и удаление компонента будут обрабатывать сброс данных.

Что-то вроде этого

В файле, содержащем таблицу v-data, обновите шаблон следующим образом

 <template>
  ......
  <v-data-table ...>
    ...
    <template #[`item.actions`]="{ item }">
      <v-btn icon @click="edit(item.id)">
        <v-icon>mdi-pencil</v-icon>
      </v-btn>
      <v-btn icon @click="delete(item.id)">
        <v-icon>mdi-delete</v-icon>
      </v-btn>
    </template>
    ...
  </v-data-table>
  <edit :car="item" v-if="showEditDialog = true" @closed="showEditDialog = false" />
  ......
</template>

<script>
import Edit from 'Edit.vue'

export default {
  components: { Edit },
  data: () =({
    item: {},
    showEditDialog: false,
  }),
  methods: {
    edit(item) {
      this.item = item
      this.showEditDialog = true
    }
  }
}

</script>

 

В вашем Edit.vue добавьте средство наблюдения для свойства «editDialog», чтобы выдать событие для удаления диалогового окна редактирования из DOM.

 watch: {
  editDialog(val){
    if(!val)
      this.$emit('closed')
  }
}
 

И удалите эту часть из Edit.Vue

       <template v-slot:activator="{ on, attrs }">
        <v-btn
          fab
          accent
          class="grey lighten-1 margin pa-4"
          dark
          v-bind="attrs"
          v-on="on"
        >
          <v-icon>
            mdi-pencil
          </v-icon>
        </v-btn>
      </template>
 

Удачи.

Комментарии:

1. это лучшее решение

Ответ №2:

Вы должны импортировать Edit.vue компонент в компонент просмотра автомобиля и использовать его вместо кнопки редактирования:

 ...
<template #[`item.actions`]="{ item }">
  <!-- Pass the item to the `car` prop -->
  <edit :car="item" />
  <v-btn icon @click="delete (item.id)">
    <v-icon>mdi-delete</v-icon>
  </v-btn>
</template>
...
<script>
import Edit from 'Edit.vue' // make sure the path to the component is correct

export default {
  components: { Edit },
  ...
};
</script>