【问题标题】:Getting Child Component Input Data to Parent, gathering into Array in Vue.js?获取子组件输入数据到父组件,在 Vue.js 中收集到数组?
【发布时间】:2022-11-23 16:59:35
【问题描述】:

** 例如,在这里,当我单击按钮时,我将多一个组件,这意味着它将有新数据,所以我想在按下“保存数据”按钮时将所有信息收集到一个数组中,我希望,这很漂亮简单易懂

<Child v-for="count in btnNumber" :key="count" @showData="getElements" />

<v-btn
  color="primary"
  elevation="10"
  class="space"
  large
  @click="duplicateEl"
  >Add Categ & Key</v-btn
>
v-btn
      color="secondary"
      elevation="13"
      class="btnEl"
      dark
      large
      @click="getResult"
      >Save Data</v-btn

** 它使用 Emit 从我的子组件获取数据

methods:{
               getElements(emitPayload) {
              this.selectedChildCategory = emitPayload.selectedCateg;
              this.selectedChildKey = emitPayload.selectedKey;
              this.selectedChildLanguage = emitPayload.selectedLang;
              this.selectedChildContent = emitPayload.selectedCon;
        }
    }
 duplicateEl() {
  this.btnNumber++;
}

【问题讨论】:

  • 尝试将 emit 上的数据(从 get 元素)保存到一个新的数据变量数组,并使用该数组
  • 是的,如果我复制子组件怎么办?这意味着我需要复制整体结果。如果你看图片,我想复制子组件并将所有输入结果一次保存到数组中
  • 相同,首先进行检查,如果其索引或键相同(取决于您的检查值),则更新,否则进行推送
  • 你能举个例子吗?我是 Vue 的初学者希望你能理解
  • 我感谢你的回答我的朋友!下面的答案是我需要的确切答案谢谢!

标签: javascript vue.js vuejs2 vue-component vuetify.js


【解决方案1】:

您可以在父组件上保存数据,请查看以下 sn-p:

Vue.component('Child', {
  template: `
  <v-form>
    <v-container>
      <v-row>
        <v-col>
          <v-select
            :items="categories"
            label="Category"
            dense
            outlined
            v-model="content.cat"
            @change="setD"
          ></v-select>
          </v-col>
          <v-col>
          <v-select
            :items="keys"
            label="Key"
            dense
            outlined
            v-model="content.key"
            @change="setD"
          ></v-select>
          </v-col>
          <v-col>
          <v-select
            :items="langs"
            label="Lang"
            dense
            outlined
            v-model="content.lang"
            @change="setD"
          ></v-select>
          </v-col>
          <v-col>
          <v-select
            :items="contents"
            label="Cont"
            dense
            outlined
            v-model="content.cont"
            @change="setD"
          ></v-select>
        </v-col>
      </v-row>
    </v-container>
  </v-form>
  `,
  props: ['conte'],
  data() {
    return {
      content: this.conte,
      categories: ['first', 'second', 'third'],
      keys: [1,2,3],
      langs: ['g', 'h', 'j'],
      contents: ['aaa', 'bbb', 'ccc']
    }
  },
  methods: {
   setD() {
      this.$emit('show', this.content);
    },
  },
})

new Vue({
  vuetify: new Vuetify(),
  el: "#app",
  data() {
    return {
      contentFields: [{id: 0, cat: '', key: '', lang: '', cont: ''}],
      showData: false
    }
  },
  methods: {
    addInput() {
      let newI = this.contentFields.length 
      this.contentFields.push({id: newI, cat: '', key: '', lang: '', cont: ''})
    },
    getElements(e){
      const newData = this.contentFields.map(obj => {
        if(obj.id === e.id) 
           return { ...obj }
        return obj
      });
    },
    getResult() {
      this.showData = !this.showData
    }
  }
})
<head>
  <link href="https://fonts.googleapis.com/css?family=Roboto:100,300,400,500,700,900" rel="stylesheet">
  <link href="https://cdn.jsdelivr.net/npm/@mdi/font@6.x/css/materialdesignicons.min.css" rel="stylesheet">
  <link href="https://cdn.jsdelivr.net/npm/vuetify@2.x/dist/vuetify.min.css" rel="stylesheet">
  <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no, minimal-ui">
</head>
<body>
  <div id="app">
    <v-app>
      <v-main>
        <v-container>
          <v-btn
            color="primary"
            elevation="10"
            class="space"
            large
            @click="addInput"
          >Add Categ & Key</v-btn>
          <v-container v-for="(content, i) in contentFields" :key="i">
            <child :conte="content" @show="getElements" />
          </v-container>
          <v-btn
            color="secondary"
            elevation="13"
            class="btnEl"
            dark
            large
            @click="getResult"
          >Save Data</v-btn>
          <div v-if="showData">{{ contentFields }}</div>
        </v-container>
      </v-main>
    </v-app>
  </div>

  <script src="https://cdn.jsdelivr.net/npm/vue@2.x/dist/vue.js"></script>
  <script src="https://cdn.jsdelivr.net/npm/vuetify@2.x/dist/vuetify.js"></script>

【讨论】:

  • 伙计抱歉打扰了,如果我想要嵌套的孩子怎么办?请检查最后一张图片,如果能更新一下您的答案,我将不胜感激
  • 每次用户添加新的嵌套子组件时,我都想添加嵌套子组件和值。 [ { "id": 0, "cat": "", "key": "", "lang": "", "cont": "", "childlang": "", "childCon": "" } ][ { "id": 0, "cat": "", "key": "", "lang": "", "cont": "", "childlang": "", "childCon": "" “childlang”:“”,“childCon”:“”“}]
【解决方案2】:

尝试将发出事件的数据(从获取元素)保存到一个新的数据变量数组,并使用该数组

<template>
      <div>
        <Child
          v-for="count in btnNumber"
          :key="count"
          @showData="getElements(count)"
        />
        <!-- BUTTONS HERE -->
      </div>
    </template>
    <script>
    export default {
      data() {
        return {
          elementsEmmitedDataArray: [], // array
        };
      },
      methods: {
        getElements(countIndex, emitPayload) {
          const data = {
            uniqueIndex: countIndex, //or anything unique for each Child component
            selectedChildCategory: emitPayload.selectedCateg,
            selectedChildKey: emitPayload.selectedKey,
            selectedChildLanguage: emitPayload.selectedLang,
            selectedChildContent: emitPayload.selectedCon,
          };
          // check if uniqindex is already exist in array then update it else push new data
            const index = this.elementsEmmitedDataArray.findIndex(
                (element) => element.uniqueIndex === countIndex
            );
            if (index !== -1) {
                this.elementsEmmitedDataArray[index] = data;
            } else {
                this.elementsEmmitedDataArray.push(data);
            }
        },
        duplicateEl() {
          this.btnNumber++;
        },
    
        submitData(){
            // use the array 
            console.log(this.elementsEmmitedDataArray);
        }
    
      },
    };
    </script>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-01-05
    • 2017-06-10
    • 2020-11-20
    • 1970-01-01
    • 2020-03-31
    • 1970-01-01
    • 2018-08-15
    • 2019-04-11
    相关资源
    最近更新 更多