简体   繁体   中英

Append input element to form fieldset using vue

As the header describes, I would like to append input elements to some fieldset in my form. I build a staged form with 3 fieldsets which appear only when "Next" button is clicked.

Now in fieldset number 3 I want to input elements based on keys I'm extracting from a external json object.

Data:

data: () => ({
    
        currentPage: 0,
        brand: '',
        platform: '',
        affiliate: '',
        fieldsetThree: document.getElementById("fieldset3"),
}),

Fieldset(only appears when currentPage value is 2):

<div v-if="currentPage === 2">
  <fieldset id="fieldset3">
    <h2 class="fs-title">API Credentials</h2>
    <h3 class="fs-subtitle">Step 3- Add any parameter for the integration</h3>
  </fieldset>
  </div>

Function to append the input fields after Stage 2 is done:

 appendFields() {
          let check = json[this.platform];

          console.log(this.fieldsetThree);
          for (const [key, value] of Object.entries(check)) {

            let inputfield = document.createElement("input");
            this.inputfield.setAttribute("type", "text");
            this.inputfield.setAttribute("name",`${key}`);
            this.inputfield.setAttribute("placeholder",`${key}`);
            console.log("Input FIeld \n", this.inputfield)
            this.fieldsetThree.appendChild(this.inputfield);
          }
          //Build it before.
        },

The goal is to create an input field for every key in the JSON, I will add the json format for example:

"exmaple": {
                "Username": "",
                "Password": "",
                "AffiliateID": "",
                "GI": "",
                "CI": "",
                "freeTextArea": ""
            },

FUll code(without Template):

export default {
    data: () => ({
        
            currentPage: 0,
            brand: '',
            platform: '',
            affiliate: '',

    }),
    computed: {
      platformData: function () {
          return json[this.platform];
      }
    },
    methods: {
        isNextClicked() {
            var nextStage = this.currentPage;
            this.currentPage++;
            console.log("CurrentPage =>", this.currentPage);
            $("#progressbar li").eq($("fieldset").index(nextStage)).addClass("active");
            return this.currentPage;
        },
        isPreviousClicked() {

            this.currentPage--;
            var previousStage = this.currentPage;
            console.log("CurrentPage at decrease =>", this.currentPage);
            $("#progressbar li").eq($("fieldset").index(previousStage)).removeClass("active");
            return this.currentPage;
        },
        appendFields() {
          // let check = json[this.platform];
          // console.log(this.fieldsetThree);
          // for (const [key, value] of Object.entries(check)) {
          //
          //   let inputfield = document.createElement("input");
          //   this.inputfield.setAttribute("type", "text");
          //   this.inputfield.setAttribute("name",`${key}`);
          //   this.inputfield.setAttribute("placeholder",`${key}`);
          //   console.log("Input FIeld \n", this.inputfield)
          //   this.fieldsetThree.appendChild(this.inputfield);
          // }
          //Build it before.
        },
        nextPlusappend() {
            //this.appendFields();
            this.isNextClicked();

        }
    }
}

If you work out the structure you want to keep your data, then you don't need to mess with DOM elements: just add the JSON to the data() & let Vue do its thing.

So, if you take the JSON data structure as the base for the form fields & fieldsets, then you can just add it to the data item holding the form input fields:

 const example = { "Username": "", "Password": "", "AffiliateID": "", "GI": "", "CI": "", "freeTextArea": "" } Vue.component("formFieldset", { props: ["fields"], methods: { handleInput(val, key) { this.$emit("update:fields", { key, val }) }, }, template: ` <div> <label v-for="(val, key) in fields":key="key" > {{ key }}: <input type="text":placeholder="key" @input="(e) => handleInput(e.target.value, key)" /> </label> <hr> </div> ` }) new Vue({ el: "#app", data() { return { fieldsets: [ { field1_1: "", field1_2: "", }, { field2_1: "", field2_2: "", }, ], } }, // just to add the items later to the data(): mounted() { this.fieldsets.push(example) }, methods: { handleUpdateFields({ key, val, idx }) { this.fieldsets[idx][key] = val }, }, template: ` <div> Putting out the data():<br /> {{ fieldsets }} <hr> <form> <form-fieldset v-for="(fieldset, i) in fieldsets":key="i":fields="fieldset" @update:fields="(e) => handleUpdateFields({...e, idx: i})" /> </form> </div> ` })
 label { display: block; padding: 8px 16px; }
 <script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/vue.js"></script> <div id="app"></div>

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM