javascript - ¿Cómo pasar una función como prop a un componente hijo y llamarla desde allí en Vue?
Sé que no se aconseja pasar una función como prop al componente hijo en Vue. Pero si fuera a hacerlo, ¿cómo sería posible? Esto es lo que he intentado hasta ahora -
Mi componente hijo -
<template>
<b-card :style="{'overflow-y': 'scroll', 'border-top': '0px', 'height': 'calc(100% - 53px)', 'border-top-left-radius': '0px', 'border-top-right-radius': '0px'}">
<div class="img-magnifier-container" :style="{'position': 'relative'}">
<b-img :id="('og' + curr_doc_num) + index_page" :src="pageImages[responseData[curr_doc_num-1]['page_nums'][index_page-1]-1].pageValue" fluid-grow alt="Fluid-grow image" @load="updateOnResize" >
</b-img>
<div
:key="j"
:id="(j)"
@mouseover="show_divs($event)"
@mouseout="hide_divs($event)"
v-bind:style="{
left: divKey['bbox']['left'] + 'px', position:'absolute', top:divKey['bbox']['top'] + 'px', height:divKey['bbox']['height'] + 'px', width: divKey['bbox']['width'] + 'px', 'border': divKey['border-width'] + 'px solid rgb(' +
divKey['color'][0] + ',' + divKey['color'][1] + ',' + divKey['color'][2] + ')', 'pointer-events': divKey['pointer-events'], 'z-index': divKey['z-index'], 'cursor': 'pointer' }"
v-on:click="find_cordinates($event)"
v-for="(divKey, j) in divsToBeRendered"
/>
</div>
<!-- </b-tab>
</template>
</b-tabs> -->
</b-card>
</template>
Aquí, estoy llamando a show_divs($event), hide_divs($event) y otras funciones como puedes ver. El script es:-
<script lang="ts">
import { Component, Vue, Watch, Prop } from "vue-property-decorator";
@Component({
components: {}
})
export default class Showcase extends Vue {
@Prop() public show_divs: any;
@Prop() public hide_divs: any;
@Prop() public find_cordinates: any;
@Prop() public divsToBeRendered: any;
public mounted() {
console.log("show", this.show_divs());
}
}
La plantilla del componente padre es:-
<ResultShowcase
:updateOnResize="updateOnResize"
:show_divs="show_divs"
:hide_divs="hide_divs"
:find_cordinates="find_cordinates"
:divsToBeRendered="divsToBeRendered"
>
</ResultShowcase>
Estas funciones están funcionando bien en el componente padre. ¿Qué estoy haciendo mal aquí? Además, en el componente hijo, al montarse, he intentado ejecutar el "show_divs()" pero no se ejecuta. Cualquier ayuda es muy apreciada.
Respuesta #1
Podrías emitir un evento desde el componente hijo y ejecutarlo dentro del componente padre :
@mouseover="$emit('show_divs',$event)"
en el componente padre:
v-on:show_divs="show_divs"
método :
methods:{
show_divs(event){
console.log(event)
}
}
