使用 vue 将输入元素附加到表单字段集

Posted

技术标签:

【中文标题】使用 vue 将输入元素附加到表单字段集【英文标题】:Append input element to form fieldset using vue 【发布时间】:2021-06-24 04:01:27 【问题描述】:

如标题所述,我想将输入元素附加到表单中的某个字段集。 我构建了一个包含 3 个字段集的分阶段表单,这些字段集仅在单击“下一步”按钮时出现。

现在在第 3 个字段集中,我想根据从外部 json 对象中提取的键输入元素。

数据:

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

Fieldset(仅在currentPage值为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>

第 2 阶段完成后追加输入字段的功能:

 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.
        ,

目标是为 JSON 中的每个键创建一个输入字段,我将添加 json 格式例如:

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

完整代码(不含模板):

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();

        
    

【问题讨论】:

【参考方案1】:

如果你想出你想要保存数据的结构,那么你不需要弄乱 DOM 元素:只需将 JSON 添加到 data() 并让 Vue 做它的事情。

因此,如果您将 JSON 数据结构作为表单字段和字段集的基础,那么您只需将其添加到包含表单输入字段的数据项中:

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>

【讨论】:

实际上,这对我来说更难理解你在这里所做的事情,json 中的每个对象都有唯一的字段,所以我需要每个对象都是动态的,这意味着不是每个对象都有“用户名”或“密码”。我很抱歉,但我是 vue 新手,我不明白你在这里做了什么 我用 export () 的结构编辑了问题,并且要提一下,Form 是我创建的不同组件,我没有在 app.vue 中构建我的应用程序。上面的所有代码都写在 Form.vue 中

以上是关于使用 vue 将输入元素附加到表单字段集的主要内容,如果未能解决你的问题,请参考以下文章

如何使用拖放将值附加到输入表单字段中

将数据字段附加到保存到表中的记录

将 Alpacajs 表单附加到现有表单

jQuery将文本字段的值附加到表单提交列表中

使用 vue/nuxt 将样式属性附加到所有(锚)元素

如何将不同类型的表单输入附加到 formData()?