从父组件重置子组件的形式

Ren*_*ira 7 vue.js vuejs2

我有一个父组件和一个子组件。子组件位于父组件的对话框内。并且显示或隐藏此对话框。

我的父组件

<template>
    <div>
        <v-dialog v-model="dialog">
            <product-form></product-form>
        </v-dialog>
    </div>
</template>
Run Code Online (Sandbox Code Playgroud)

我的子组件(产品形式)

<template>
  <div>
    .....
    <input type="text" v-model="data">
    .....
  </div>
</template>
<script>
  export default {

    data: () => ({
        data: '',
    }),
    methods:{

      onSubmitProduct(){

        //send data to server        
      }
    },
}
</script>
Run Code Online (Sandbox Code Playgroud)

每当显示对话框时,我都需要清除子窗体。问题是我通过父组件显示对话框。注意:我不想在子组件中使用 v-model,因为我需要从子组件而不是父组件将数据发送到服务器。

有人能帮我吗?

* **解决方案***

我能够使用 ref 解决问题。我不知道我的解决方案是否与良好做法背道而驰。但这是我能做到的最好的。

//parent component
<template>
    <div>
        <v-dialog v-model="dialog">
            <product-form ref="childComponent"></product-form>
        </v-dialog>
    </div>
</template>

this.$refs.childComponent.resetForm();
Run Code Online (Sandbox Code Playgroud)

——

//child compopnent
<template>
  <div>
    .....
    <input type="text" v-model="data">
    .....
  </div>
</template>
<script>
  export default {

    data: () => ({
        data: '',
    }),
    methods:{

      onSubmitProduct(){

        //send data to server        
      },
      resetForm(){
        //code to reset form
      }
    },
}
</script>
Run Code Online (Sandbox Code Playgroud)

Roy*_*y J 1

你也许应该让一辆公共汽车作为孩子的支撑。然后你可以发出一个孩子可以采取行动的事件。

new Vue({
  el: '#app',
  data: {
    showing: false,
    bus: new Vue()
  },
  methods: {
    toggleDialog() {
      this.showing = !this.showing;
      this.bus.$emit('reset');
    }
  },
  components: {
    productForm: {
      template: '#product-form-template',
      props: ['bus'],
      data() {
        return {
          value: 'you will never see this'
        }
      },
      methods: {
        resetForm() {
          this.value = 'Form was reset';
        }
      },
      created() {
        this.bus.$on('reset', this.resetForm);
      }
    }
  }
});
Run Code Online (Sandbox Code Playgroud)
.dialog {
  outline: 2px solid blue;
  height: 200px;
}
Run Code Online (Sandbox Code Playgroud)
<script src="//unpkg.com/vue@latest/dist/vue.js"></script>
<div id="app">
  <button @click="toggleDialog">Toggle dialog</button>
  <div class="dialog" v-show="showing">
    <product-form :bus="bus"></product-form>
  </div>
</div>

<template id="product-form-template">
  <div>
    Type something here: <input v-model="value">
  </div>
</template>
Run Code Online (Sandbox Code Playgroud)