【问题标题】:how to send input data value from child component data object to parent?如何将输入数据值从子组件数据对象发送到父组件?
【发布时间】:2020-10-11 12:26:52
【问题描述】:

我正在尝试通过数据对象“data()”将输入数据变量从子组件表单发送到父组件。我看过vuejs update parent data from child component 文章并尝试这样做,但是我无法通过事件 $emit 捕获的数据对象。你能帮帮我吗?

父组件:

<script>
    import inputform from '../components/form.vue';
    import axios from 'axios';

  export default {
      name: 'helloword',
      data() {
          return {
          }
      },
    components: {
        inputform
    },
      methods: {
          submit() {
                const path = 'http://127.0.0.1:5000';
                axios.post(path, {
                    name: inputform.data()

                })
              .then(() => {
                  const result = 'Sucess!';
                  console.log(result);
              })
              .catch((error) => {
                  console.log(error);
              })
          }
      }
  }
</script>

子组件:

<template>
    <div>
  <table>
    <thead>
    <th>Name</th>
    <th>Email</th>
    <th>Age</th>
    </thead>
    <tr>
      <td><input type="text" id="name" v-model="details.name" @focusout="inputdata"></td>
      <td><input type="text" id="name1" v-model="details.name1" @focusout="inputdata" ></td>
      <td><input type="number" id="age" v-model="details.age" @focusout="inputdata" ></td>

    </tr>
  </table>
    </div>
</template>

<script>
    export default {
        name: "inputform",
      data() {
          return {
            details: {
            name: '',
            name1: '',
            age: ''
              }
          }
      },
      methods: {
            inputdata() {
              this.$emit("input_data", this.details)
            }
      }
    }
</script>

<style scoped>

</style>

因此,寻求帮助,将可变数据从子组件发送到父组件,并使用父组件的 axios 向 API 执行提交操作。如果有其他更好的方法请告诉我。谢谢。

【问题讨论】:

    标签: vue.js vue-component


    【解决方案1】:

    附加v-model 时,您不需要v-on。您还可以像这样将细节捕获到单个对象中,然后将其作为发出事件的一部分传递。

    子组件

    <template>
      <div>
        <table>
          <thead>
            <th>Name</th>
            <th>Email</th>
            <th>Age</th>
          </thead>
          <tr>
            <td>
              <input type="text" id="name" v-model="details.name">
            </td>
            <td>
              <input type="email" id="email" v-model="details.email">
            </td>
            <td>
              <input type="number" id="age" v-model="details.age">
            </td>
            <td>
              <button @click="inputdata">Submit</button>
            </td>
          </tr>
        </table>
      </div>
    </template>
    
    <script>
    export default {
      name: "inputform",
      data() {
        return {
          details: {
            name: "",
            email: "",
            age: ""
          }
        };
      },
      methods: {
        inputdata() {
          console.log(this.details);
          this.$emit("handledata", this.details);
        }
      }
    };
    </script>
    

    父组件

    <template>
      <div id="app">
        <HelloWorld v-on:handledata="handleInput"/>
      </div>
    </template>
    
    <script>
    import HelloWorld from "./components/HelloWorld";
    
    export default {
      name: "App",
      components: {
        HelloWorld
      },
      methods: {
        handleInput(data) {
          // object emitted from the child component
          console.log({ data });
        }
      }
    };
    </script>
    

    【讨论】:

    • 谢谢,这有效,但我不想在子组件中使用我的提交按钮。因为,我有其他组件应该将数据传递给父级,如何通过在父级上放置提交按钮来修复它?假设我使用视图文件作为父级。
    • 对不起,我不明白这个问题。
    • 您在子组件中添加了提交按钮。但是如果它在父节点上呢?
    • 您需要一些触发器才能将数据从子级发送回父级,在我的情况下是 submit,在您的情况下可能是其他任何情况 - 父级不会自动选择数据.你也可以考虑使用 vuex。
    • 谢谢。现在我可以将数据从孩子发送给父母。
    【解决方案2】:

    首先,您应该将最多两个参数传递给 $emit 方法,这是文档:https://vuejs.org/v2/api/#vm-emit,第二个是 v-on:,然后 v-models 是额外的。 所以解决方案你可以在一个对象中传递这个数据而不是三个数据,所以代码将是这样的:

    
          data() {
              return {
                name: '',
                email: '',
                age: '',
              }
          },
          methods: {
                inputdata() {
                  this.$emit("input", {
                    name: this.name, 
                    email: this.email, 
                    age: this.age
                  })
                }
          }
    

    或者我更喜欢的选项将所有数据放在这样的表单数据中

    <template>
        <div>
      <table>
        <thead>
        <th>Name</th>
        <th>Email</th>
        <th>Age</th>
        </thead>
        <tr>
          <td><input type="text" id="name" v-model="form.name"></td>
          <td><input type="email" id="email" v-model="form.email"></td>
          <td><input type="number" id="age" v-model="form.age"></td>
        </tr>
      </table>
        </div>
    </template>
    
    <script>
        export default {
            name: "inputform",
          data() {
              return {
                form: {
                  name: '',
                  email: '',
                  age: '',
                }
              }
          },
          methods: {
                inputdata() {
                  this.$emit("input", this.form)
                }
          }
        }
    </script>
    

    【讨论】:

    • 您好,如何在子组件中使用“inputdata()”函数?我知道,我没有使用该功能来捕获事件。 con提供更多细节?
    • 您需要在父组件中访问表单数据,但您不需要在父组件中调用 inputdata()。相反,您在表单数据上设置了一个观察者,并且每次更改时都会在 child 中自动调用 inputdata() 方法。
    • 那么,我如何访问数据?父母的任何逻辑?
    猜你喜欢
    • 2022-08-02
    • 2017-09-13
    • 2021-02-15
    • 2020-09-28
    • 1970-01-01
    • 2019-09-07
    • 2018-07-07
    相关资源
    最近更新 更多