如何在组件(同级)Vue之间传输数据?

时间:2019-04-20 12:50:20

标签: vue.js

在HeaderComponent方法中,单击时会调用“ clickPrices”

<template>
    <header>
        <div class="d-flex flex-column flex-md-row align-items-center p-3 px-md-4 mb-3 bg-white border-bottom shadow-sm">
            <h5 class="my-0 mr-md-auto font-weight-normal"><a href="/">Company name</a></h5>
            <nav class="my-2 my-md-0 mr-md-3">
                <a class="p-2 text-dark" href="#">Features</a>
                <a class="p-2 text-dark">Enterprise</a>
                <a class="p-2 text-dark" @click="clickPrices()">Get pricing</a>
            </nav>
            <a class="btn btn-outline-primary " href="#">Sign up</a>
        </div>
    </header>
</template>

<script>

    export default {
        name: "HeaderComponent",
        methods: {
            clickPrices() {
                ...
            },
        },
    }
</script>

<style scoped>

</style>

有一个定价组件,我在其中通过“ getPricing”方法向服务器发送请求

<template>
    <div class="wrap-pricing">
        <div class="pricing-header px-3 py-3 pt-md-5 pb-md-4 mx-auto text-center">
            <h1 class="display-4">Pricing</h1>
            <p class="lead">Quickly build an effective pricing table for your potential customers with this Bootstrap example. It’s built with default Bootstrap components and utilities with little customization.</p>
        </div>
        <div class="container">
            <div class="card-deck mb-3 text-center">
                <div class="card mb-4 shadow-sm">
                    <div class="card-header">
                        <h4 class="my-0 font-weight-normal">Lorem</h4>
                    </div>
                    <div class="card-body">
                        <h1 class="card-title pricing-card-title">$10 <small class="text-muted">/ mo</small></h1>
                        <ul class="list-unstyled mt-3 mb-4">
                            <li>Lorem</li>
                            <li>Lorem</li>
                            <li>Lorem</li>
                            <li>Lorem</li>
                        </ul>
                        <button type="button" class="btn btn-lg btn-block"></button>
                    </div>
                </div>
            </div>

           
        </div>
    </div>
</template>

<script>

    import router  from '../routes.js';
    import { axios } from 'axios';

    export default {
        name: "PriceComponent",
        methods: {
            getPricing() {
                axios.get('api/pricing').then((response) => {
                    //some actions
                    router.push('prices');
                });
            },
        },
    }
</script>

<style scoped>

</style>

我应该如何处理'сlickPrices'HeaderComponent方法的结果? 还是我在等待您的方式,如何通过单击一个组件来获取另一个数据

2 个答案:

答案 0 :(得分:0)

您可以发出一个事件,让父组件处理获取并将数据作为道具传递给子组件。

或者另一种方法是直接听事件,如下所示:

组件1:

this.$root.$emit('clickPrices', data);

组件2:

mounted() {
    this.$root.$on('clickPrices', data => {
        this.getPricing();
    });
}

通过@alex找出答案

答案 1 :(得分:0)

由于您使用的是2个独立组件(一个不包含在另一个组件中),因此您无法传递道具

您可以做的事情-

  1. 代替获取所有点击价格,只需像这样创建一个创建的钩子,它将在创建组件时获取所有定价详细信息-

    created () {
        this.getPricing()
    },
    
    methods: {
        getPricing() {
            axios.get('api/pricing').then((response) => {
                //some actions
                router.push('prices');
            });
        },
    },
    
  2. 使用,当用户单击按钮时,将获取价格详细信息并将其添加到该状态中。您可以像这样在应用程序中的任何位置使用状态-

    this.$store.state.prices

让我知道它是否有效,否则,我们将为您找到其他解决方案!