【问题标题】:Passing props from one step to another (steppers) in Vue在 Vue 中将道具从一个步骤传递到另一个步骤(步进器)
【发布时间】:2020-06-10 02:13:29
【问题描述】:

我在 vue 中使用步进器。我在第 1 步创建代理,在第 2 步显示代理详细信息。问题是代理详细信息不会出现在步骤 2 中,直到我在进行第 2 步后刷新页面。有没有办法将代理作为道具从 agent.vue 传递给 event.vue,这样我就不需要刷新页面以使代理详细信息显示在第 2 步中。

stepper.vue

<template>
    <div >
      <v-stepper v-model="e1">
        <v-stepper-header>
          <v-stepper-step :complete="e1 > 1" step="1">Agency</v-stepper-step>

          <v-divider></v-divider>

          <v-stepper-step :complete="e1 > 2" step="2">Event</v-stepper-step>

          <v-divider></v-divider>
        </v-stepper-header>

        <v-stepper-items>
          <v-stepper-content step="1">
            <Agency @next="goTo(2, true)"></Agency>
          </v-stepper-content>

          <v-stepper-content step="2">
            <Event/>
          </v-stepper-content>
        </v-stepper-items>
      </v-stepper>
    </div>
</template>

<script>
import Agency from 'parties/agency';
import Event from 'events/event';

export default {
  components: {
    Agency,
    Event
  },
  data () {
    return {
      e1: 0,
      agency: {
        id: '',
        name: '',
        phone_number: ''
      }
    }
  },
  created() {
    this.step = 1;
    this.getAgency();
  },
  methods: {    
    getAgency() {
      this.$axios.get('/agency.json')
      .then(response => {
        if (Object.keys(response.data).length > 0) {
          this.agency = response.data;
        }
      })
    },
    goTo(step, can) {
      if (can) {
        this.e1 = step;
      }
    },
  }
};
</script>

agent.vue

<template>
  <v-card>
    <v-form :model='agency'>     
      <v-layout row wrap>
        <v-flex xs12 sm12 lg12 >
          <v-layout row wrap>
            <v-flex xs12 md6 class="add-col-padding-right">
              <v-text-field
                label='Agency Name'
                v-model='agency.name'>
              </v-text-field>
            </v-flex>
          </v-layout>
          <v-layout row wrap>
            <v-flex xs12 md6 class="add-col-padding-right">
              <v-text-field
                label='Agency Phone Number'
                v-model='agency.phone_number'>
              </v-text-field>
            </v-flex>
          </v-layout>
          <v-layout row wrap>
            <div>
              <v-btn @click.prevent='saveAgency'>Save</v-btn>
            </div>
          </v-layout>
        </v-flex>
      </v-layout>           
    </v-form>
    <v-btn @click.prevent='nextStep'>
     Next
    </v-btn>
  </v-card>
</template>

<script>

export default {

  data: function () {
    return {
      agency: {
        id: '',
        name: '',
        phone_number: ''
      }
    };
  },
  created: function() {
    this.getAgency();
  },
  methods: {
    nextStep() {
     this.$emit('next');
    },
    getAgency() {
      this.$axios.get('/agency.json')
      .then(response => {
        if (Object.keys(response.data).length > 0) {
          this.agency = response.data;          
        }
      })
    },
    saveAgency() {
      this.$axios.post('/agencies.json', { agency: this.agency })
      .then(response => {
      });           
    },    
  }
};
</script>

event.vue

<template>
  <v-card class="mb-12">

    <v-form :model='agency'>
      {{ agency.name }}<br/>
      {{ agency.phone_number }}<br/>          
    </v-form>
  </v-card>
</template>

<script>

  export default {
  data: function () {
    return {
      agency: {
        id: '',
        name: '',
        phone_number: ''
      },
      event_final: false
    };
  },

  created: function() {
    this.getAgency();
  },
  methods: {    
    getAgency() {
      this.$axios.get('/agency.json')
      .then(response => {
        if (Object.keys(response.data).length > 0) {
          this.agency = response.data;
          if (this.agency.name === "XYZ") {
           this.event_final = true;
          }
        }
      }).
      then(() => {
      });
    },   
  }
};
</script>

【问题讨论】:

    标签: javascript vue.js vuejs2 vuetify.js


    【解决方案1】:

    Agency 在其next 事件中发出详细信息,在父级捕获它们并将它们作为道具传递给Event

    假设您在stepper.vue 中加载了初始数据,您也可以将其传递给Agency 进行编辑

    例如

    // agency.vue
    props: { editAgency: Object },
    data () {
      return { agency: this.editAgency } // initialise with prop data
    },
    methods: {
      nextStep() {
        this.$emit('next', { ...this.agency }) // using spread to break references
      },
      // etc, no need for getAgency() here though
    }
    
    <!-- stepper.vue -->
    <Agency :edit-agency="agency" @next="nextAgency"></Agency>
    <!-- snip -->
    <Event :agency="agency" />
    
    // stepper.vue
    methods: {
      nextAgency (agency) {
        this.agency = agency
        this.goTo(2, true)
      },
    
    // event.vue
    export default {
      props: { agency: Object } // no need for a local "data" copy of agency, just use the prop
    }
    

    【讨论】:

    • Phil 你的回答几乎解决了我的问题,就像我在 events.vue 文件中有 getAgency() 一样,在响应中我有一个条件,如果代理的名称是“XYZ”那么将 event_final 设置为 true。在作为道具出现的物体上怎么可能?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-22
    • 2019-10-27
    • 1970-01-01
    相关资源
    最近更新 更多