I am using vue-grid-layout to create a draggable tile system, which will keep track of the order of steps to be executed by a system in our research lab. In short, I can create as many grid-item elements as I want by hard coding them, but I need to be able to create a function that will create/remove additional grid-items. I am stumped as to how to approach this since I suck at JavaScript, to create a grid-item in HTML I can do the following:
//these are just the ‘settings’ for the grid items//
<h2 style="color: #f6a821;">Steps</h2> <hr class="hr" /> <grid-layout :layout.sync="stepsGrid" :col-num="8" :row-height="75" :is-draggable="true" :is-resizable="false" :is-mirrored="false" :vertical-compact="true" :margin="[50, 50]" :use-css-transforms="true"> //here we actually create the grid-item, starting at [0] <grid-item :x=stepsGrid[0].x :y=stepsGrid[0].y :w=stepsGrid[0].w :h=stepsGrid[0].h :i=stepsGrid[0].i :isDraggable=stepsGrid[0].isDraggable> <div class="Panel__name">1</div> <div class="editButton"> <router-link to="/Parameters-template" class="editButton">Edit</router-link></router-link> </div><br> <div class="Panel__status">Status:</div> </grid-item>
I am essentially needing to know how I can click to add as many of these as I want, but I am unsure of how to program this. If I currently have this one grid-item, I need to press a button that will create another grid-item at :
<grid-item :x=stepsGrid[1].x :y=stepsGrid[1].y :w=stepsGrid[1].w :h=stepsGrid[1].h :i=stepsGrid[1].i :isDraggable=stepsGrid[1].isDraggable> ... content </grid-item>
-and would increment from 0 up through 1,2,3 etc. I have the states for the grid-layouts as follows:
import Vue from 'vue'; import Vuex from 'vuex'; import createPersistedState from 'vuex-persistedstate' Vue.use(Vuex); export const store = new Vuex.Store({ //strict: process.env.NODE_ENV !== 'production', state: { stepsGrid : [ {"x":0,"y":0,"w":2,"h":1,"i":"0"}, {"x":2,"y":0,"w":2,"h":1,"i":"1"}, {"x":4,"y":0,"w":2,"h":1,"i":"2"}, {"x":6,"y":0,"w":2,"h":1,"i":"3"}, {"x":0,"y":2,"w":2,"h":1,"i":"4"}, {"x":2,"y":2,"w":2,"h":1,"i":"5"} ], ....... mutations: { state.stepsGrid = [ {"x":0,"y":0,"w":2,"h":1,"i":"0"}, {"x":2,"y":0,"w":2,"h":1,"i":"1"}, {"x":4,"y":0,"w":2,"h":1,"i":"2"}, {"x":6,"y":0,"w":2,"h":1,"i":"3"}, {"x":0,"y":2,"w":2,"h":1,"i":"4"}, {"x":2,"y":2,"w":2,"h":1,"i":"5"} ],
Advertisement
Answer
You need to use v-for
to loop over your data and create each of the items.
In the example below I haven’t used grid-layout
or grid-item
but the principle is exactly the same.
const store = new Vuex.Store({ state: { stepsGrid: [ {x: 0, y: 0, w: 2, h: 1, i: 0} ] }, mutations: { addStep (state, step) { state.stepsGrid.push(step); } }, actions: { addStep ({state, commit}) { const step = {x: 2, y: 0, w: 2, h: 1, i: state.stepsGrid.length}; commit('addStep', step); } } }); new Vue({ el: '#app', store, computed: { stepsGrid () { return this.$store.state.stepsGrid; } }, methods: { onClick () { this.$store.dispatch('addStep'); } } });
<script src="https://unpkg.com/vue@2.6.10/dist/vue.js"></script> <script src="https://unpkg.com/vuex@3.1.1/dist/vuex.js"></script> <div id="app"> <ul> <li v-for="step in stepsGrid">{{ step }}</li> </ul> <button @click="onClick">Add step</button> </div>
So in your case it would be:
<grid-item v-for="step in stepsGrid" :x="step.x" :y="step.y" :w="step.w" :h="step.h" :i="step.i" :isDraggable="step.isDraggable">
You could potentially simplify this down to:
<grid-item v-for="step in stepsGrid" v-bind="step">
Relevant documentation for rendering lists:
https://v2.vuejs.org/v2/guide/list.html
https://v2.vuejs.org/v2/api/#v-for