Im making a simple application with nativescript-vue, on the home page i have a button that launch the scanner so i can scan a product. Here is my home page :
<template>
<Page class="page">
<StackLayout class="hello-world">
<Button @tap="scan" text="Scan a product"/>
</StackLayout>
</Page>
</template>
<script>
const BarcodeScanner = require("nativescript-
barcodescanner").BarcodeScanner;
import Display from "./Display";
export default {
data() {
return {
text: ""
};
},
methods: {
scan: function() {
var barcodescanner = new BarcodeScanner();
barcodescanner
.scan({
// formats: "QR_CODE,PDF_417", // Pass in of you want to restrict scanning to certain types
cancelLabel: "EXIT. Also, try the volume buttons!", // iOS only, default 'Close'
cancelLabelBackgroundColor: "#333333", // iOS only, default '#000000' (black)
message: "Use the volume buttons for extra light", // Android only, default is 'Place a barcode inside the viewfinder rectangle to scan it.'
showFlipCameraButton: true, // default false
preferFrontCamera: false, // default false
showTorchButton: true, // default false
beepOnScan: true, // Play or Suppress beep on scan (default true)
torchOn: false, // launch with the flashlight on (default false)
closeCallback: function() {
console.log("Scanner closed");
}, // invoked when the scanner was closed (success or abort)
resultDisplayDuration: 500, // Android only, default 1500 (ms), set to 0 to disable echoing the scanned text
// orientation: "landscape", // Android only, optionally lock the orientation to either "portrait" or "landscape"
openSettingsIfPermissionWasPreviouslyDenied: true // On iOS you can send the user to the settings app if access was previously denied
})
.then(
function(result) {
console.log("Scan format : " + result.format);
console.log("Scan text : " + result.text);
this.text = result.text.trim();
this.$navigateTo(Display, {context: {propsData: {"code": this.text }}});
},
function(error) {
console.log("No scan: " + error);
}
);
}
}
};
</script>
Once the scan is finish i want to navigate to my other component "Display" where i want to use the text scanned before to make a fetch request to my api and have some product information about it, here is my display component :
<template>
<Page class="page">
<ActionBar class="action-bar" title="Results"/>
<StackLayout>
<Label v-if="posts.product_name" :text="posts.product_name" />
<Image :src="posts.image_thumb_url" stretch="none" />
<Label :text="posts.ingredients_text_fr" class="list-group-item-text" textWrap="true"></Label>
</StackLayout>
</Page>
</template>
<script>
export default {
props: {
code: {
type: String,
required: true,
}
},
data() {
return {
posts: [],
};
},
methods: {},
beforeCreate() {
fetch(
`my-api.com/product/${this.code}.json`
)
.then(response => response.json())
.then(data => {
this.posts = data.product;
});
}
};
</script>
But here i have a problem i don't know how to make the call to my api and when (mounted, beforeMounted....). Because my "display" component seems already mounted at the same time than my "home" component.
You could just set a data value to true, and have your Display component use a v-if directive. That will also mount it.
data:{
showDisplay: false
}
<Display v-if ='showDisplay' />
someAsyncMethod().then(result => {
// do init here
this.showDisplay = true
}