2021年2月2日星期二

How to display and edit image inside Vuetify Data tables

I have some data inside Vuetify data-tables. I would like to return in every row a small dessert image/s. I don't know how to insert HTML inside Photo column and how to return an image. I use a v-dialog to edit text data, so I would like to edit also a specific photo by file input. With basic text I do not have any problem. Could someone help with this problem?

Demo: https://codepen.io/noobmaster2137/pen/qBqdwXN

Example: Screenshot

HTML:

<div id="app">    <v-app id="inspire">      <v-data-table        :headers="headers"        :items="desserts"        sort-by="calories"        class="elevation-1"      >        <template v-slot:top>          <v-toolbar            flat          >            <v-toolbar-title>Desserts</v-toolbar-title>            <v-divider              class="mx-4"              inset              vertical            ></v-divider>            <v-spacer></v-spacer>            <v-dialog              v-model="dialog"              max-width="500px"            >              <template v-slot:activator="{ on, attrs }">                <v-btn                  color="primary"                  dark                  class="mb-2"                  v-bind="attrs"                  v-on="on"                >                  New Item                </v-btn>              </template>              <v-card>                <v-card-title>                  <span class="headline"></span>                </v-card-title>                    <v-card-text>                  <v-container>                    <v-row>                      <v-col                        cols="12"                        sm="6"                        md="4"                      >                        <v-text-field                          v-model="editedItem.name"                          label="Dessert name"                        ></v-text-field>                      </v-col>                      <v-col                        cols="12"                        sm="6"                        md="4"                      >                        <v-text-field                          v-model="editedItem.calories"                          label="Calories"                        ></v-text-field>                      </v-col>                      <v-col                        cols="12"                        sm="6"                        md="4"                      >                        <v-text-field                          v-model="editedItem.fat"                          label="Fat (g)"                        ></v-text-field>                      </v-col>                      <v-col                        cols="12"                        sm="6"                        md="4"                      >                        <v-text-field                          v-model="editedItem.carbs"                          label="Carbs (g)"                        ></v-text-field>                      </v-col>                      <v-col                        cols="12"                        sm="6"                        md="4"                      >                        <v-text-field                          v-model="editedItem.protein"                          label="Protein (g)"                        ></v-text-field>                      </v-col>                      <v-col                        cols="12"                        sm="12"                        md="12"                      >                        <v-file-input                          label="Photo"                          v-model="editedItem.photoURL"                          show-size                          small-chips                          truncate-length="15"                        ></v-file-input>                      </v-col>                    </v-row>                  </v-container>                </v-card-text>                    <v-card-actions>                  <v-spacer></v-spacer>                  <v-btn                    color="blue darken-1"                    text                    @click="close"                  >                    Cancel                  </v-btn>                  <v-btn                    color="blue darken-1"                    text                    @click="save"                  >                    Save                  </v-btn>                </v-card-actions>              </v-card>            </v-dialog>            <v-dialog v-model="dialogDelete" max-width="500px">              <v-card>                <v-card-title class="headline">Are you sure you want to delete this item?</v-card-title>                <v-card-actions>                  <v-spacer></v-spacer>                  <v-btn color="blue darken-1" text @click="closeDelete">Cancel</v-btn>                  <v-btn color="blue darken-1" text @click="deleteItemConfirm">OK</v-btn>                  <v-spacer></v-spacer>                </v-card-actions>              </v-card>            </v-dialog>            <!-- Snackbar here -->            <v-snackbar              v-model="snackbar"            >                          </v-snackbar>          </v-toolbar>        </template>        <template v-slot:item.actions="{ item }">          <v-icon            small            class="mr-2"            @click="editItem(item)"          >            mdi-pencil          </v-icon>          <v-icon            small            @click="deleteItem(item)"          >            mdi-delete          </v-icon>        </template>        <template v-slot:no-data>          No data        </template>      </v-data-table>    </v-app>  </div>  

Script:

new Vue({    el: '#app',    vuetify: new Vuetify(),    data: () => ({      dialog: false,      dialogDelete: false,      snackbar: false,      snackbarText: 'Item has been successfully deleted',      headers: [        {          text: 'Dessert (100g serving)',          align: 'start',          sortable: false,          value: 'name',        },        { text: 'Calories', value: 'calories' },        { text: 'Fat (g)', value: 'fat' },        { text: 'Carbs (g)', value: 'carbs' },        { text: 'Protein (g)', value: 'protein' },        { text: 'Photo', value: 'photoURL', sortable: false },        { text: 'Actions', value: 'actions', sortable: false },      ],      desserts: [],      editedIndex: -1,      editedItem: {        name: '',        calories: 0,        fat: 0,        carbs: 0,        protein: 0,        photoURL: 0,      },      defaultItem: {        name: '',        calories: 0,        fat: 0,        carbs: 0,        protein: 0,        photoURL: 0,      },    }),      computed: {      formTitle () {        return this.editedIndex === -1 ? 'New Item' : 'Edit Item'      },    },      watch: {      dialog (val) {        val || this.close()      },      dialogDelete (val) {        val || this.closeDelete()      },    },      created () {      this.initialize()    },      methods: {      initialize () {        this.desserts = [          {            name: 'Frozen Yogurt',            calories: 159,            fat: 6.0,            carbs: 24,            protein: 4.0,            // photoURL: 'IMAGE HERE',            photoURL: './assets/images/desserts/1.jpg',            // photoURL: require('@/assets/images/desserts/1.jpg'),          },          {            name: 'Ice cream sandwich',            calories: 237,            fat: 9.0,            carbs: 37,            protein: 4.3,            photoURL: 'IMAGE HERE',          },          {            name: 'Eclair',            calories: 262,            fat: 16.0,            carbs: 23,            protein: 6.0,            photoURL: 'IMAGE HERE',          },          {            name: 'Cupcake',            calories: 305,            fat: 3.7,            carbs: 67,            protein: 4.3,            photoURL: 'IMAGE HERE',          },          {            name: 'Gingerbread',            calories: 356,            fat: 16.0,            carbs: 49,            protein: 3.9,            photoURL: 'IMAGE HERE',          },          {            name: 'Jelly bean',            calories: 375,            fat: 0.0,            carbs: 94,            protein: 0.0,            photoURL: 'IMAGE HERE',          },          {            name: 'Lollipop',            calories: 392,            fat: 0.2,            carbs: 98,            protein: 0,            photoURL: 'IMAGE HERE',          },          {            name: 'Honeycomb',            calories: 408,            fat: 3.2,            carbs: 87,            protein: 6.5,            photoURL: 'IMAGE HERE',          },          {            name: 'Donut',            calories: 452,            fat: 25.0,            carbs: 51,            protein: 4.9,            photoURL: 'IMAGE HERE',          },          {            name: 'KitKat',            calories: 518,            fat: 26.0,            carbs: 65,            protein: 7,            photoURL: 'IMAGE HERE',          },        ]      },        editItem (item) {        this.editedIndex = this.desserts.indexOf(item)        this.editedItem = Object.assign({}, item)        this.dialog = true      },        deleteItem (item) {        this.editedIndex = this.desserts.indexOf(item)        this.editedItem = Object.assign({}, item)        this.dialogDelete = true      },        deleteItemConfirm () {        this.desserts.splice(this.editedIndex, 1)        this.closeDelete()        this.snackbar = true      },        close () {        this.dialog = false        this.$nextTick(() => {          this.editedItem = Object.assign({}, this.defaultItem)          this.editedIndex = -1        })      },        closeDelete () {        this.dialogDelete = false        this.$nextTick(() => {          this.editedItem = Object.assign({}, this.defaultItem)          this.editedIndex = -1        })      },        save () {        if (this.editedIndex > -1) {          Object.assign(this.desserts[this.editedIndex], this.editedItem)        } else {          this.desserts.push(this.editedItem)        }        this.close()      },    },  })  
https://stackoverflow.com/questions/66020272/how-to-display-and-edit-image-inside-vuetify-data-tables February 03, 2021 at 10:06AM

没有评论:

发表评论