Vuejs вызывает метод другого компонента с параметром

#javascript #vue.js #vue-component

#javascript #vue.js #vue-компонент

Вопрос:

У меня есть два компонента, первый предназначен для загрузки файла, а второй — для отображения файла. Внутри моего компонента загрузки я хотел бы вызвать компонент предварительного просмотра и добавить параметр, чтобы метод внутри компонента предварительного просмотра использовал значение, созданное внутри компонента загрузки.

До сих пор я делал это:

UploadComponent.vue

 <template>
    …
    <button @click="upload"></button>
    <preview-component :url="this.location"></preview-component>
</template >

<script>
import PreviewComponent from '@/js/components/PreviewComponent';

export default {
    components: {
        'preview-component': PreviewComponent
    },

    props: ['url'],

    data () {
        return {
            // ...
            location: ''
        }
    },

    methods: {
        upload() {
            // ... upload stuff then update the global var location
            this.location = response.data.location;
        },
    }

}
</script>
  

Это мой компонент предварительного просмотра:

 <template>
    <div id="body">
        ///...
    </div>
</template>

<script>
export default {
    props: ['url'],

    methods: {
        loadPdf (url) {
            //
        },
    }    
}
</script>
  

Пока я получаю сообщение об ошибке, что URL не определен, поэтому на самом деле он не отправляет URL из UploadCOmponent в PreviewComponent, как мне его отправить?

Комментарии:

1. родительский компонент передает prop дочернему компоненту с :url="location" , а в дочернем компоненте получает доступ к prop в методах с this.url

Ответ №1:

У вас есть ninja this в вашем UploadComponent шаблоне.

Это должно быть <preview-component :url="location"></preview-component>

Комментарии:

1. Привет, спасибо, но я все еще получаю эту ошибку app.js:7989 [Vue warn]: Error in v-on handler: "Error: Invalid parameter object: need either .data, .range or .url" app.js:9252 Error: Invalid parameter object: need either .data, .range or .url

2. Похоже, это связано с одним из внешних компонентов, которые вы используете. Не связано с vue