代码之家  ›  专栏  ›  技术社区  ›  drake035

如何从父组件更新子组件的props值?

  •  1
  • drake035  · 技术社区  · 6 年前

    从我 parent 组件,我需要触发 child 包含一个 Firebase 查询。注意,在子组件中,该代码是在 mounted() 钩子(但是为了从父组件执行它,我想我必须将代码移动到一个方法或其他东西上)。

    推荐的实现这一目标的方法是什么?

    这是我的 起源 部件代码-为清晰起见简化:

    <template>
      <div>
        <nav>
          <v-btn @click="viewNextWeek"></v-btn>
        </nav>
        <project-row :mon="mon"></new-row-form>
      </div>
    </template>
    
    <script>
    import ProjectRow from './ProjectRow.vue';
    import store from '../store';
    import moment from 'moment';
    
    export default {
      name: 'home',
      components: {
        ProjectRow
      },
      data() {
        return {
          mon: moment().startOf('isoWeek')
        }
      },
      methods: {
        viewNextWeek: function() {
          this.mon = moment().startOf('isoWeek').add(7, 'days');
        }
      }
    }
    </script>
    

    Child 组件-也简化了:

    <template>
      <div>
        <input v-model="monTime">
      </div>
    </template>
    
    <script>
    import { db } from '../firebase';
    
    export default {
      props: [
        'mon'
      ],
      mounted() {
        var timesRef = db.collection('times');
        var timesWeek = timesRef.where('date', '==', this.mon);
        timesWeek.get()
        .then((querySnapshot) => {      
          querySnapshot.forEach((doc) => {
            this.monTime = doc.data().time;
          });
        })
        .catch(function(error) {
          console.log('Error getting documents: ', error);
        });  
      }
    }
    </script>
    
    1 回复  |  直到 6 年前
        1
  •  0
  •   Thamer    6 年前

    为了达到你应该使用的目的 event bus 这两个组件之间的通信。首先,您应该创建一个全局事件总线,它可以是一个中央事件管理,并允许您从VueJS应用程序中的任何组件访问任何事件。在这里,您应该在 viewNextWeek 方法并在其中捕获 mounted 在子组件中。所以每次你 mon 父组件中的值更改将触发子组件的事件以进行更新 周一 在它里面。

    有关如何使用全局事件总线的更多详细信息,请阅读本文 global event bus article