J'ai créé un composant Vue appelé imageUpload et passe la propriété en tant que v-model
<image-upload v-model="form.image"></image-upload>
et dans imgeUpload
composant J'ai ce code
<input type="file" accept="images/*" class="file-input" @change="upload">
upload:(e)=>{
const files = e.target.files;
if(files && files.length > 0){
console.log(files[0])
this.$emit('input',files[0])
}
}
et j'ai reçu
Uncaught TypeError: _this. $ Emit n'est pas une fonction
Merci
Ne définissez pas votre méthode avec une grosse flèche. Utilisation:
upload: function(e){
const files = e.target.files;
if(files && files.length > 0){
console.log(files[0])
this.$emit('input',files[0])
}
}
Lorsque vous définissez votre méthode avec une grosse flèche, vous capturez la portée lexicale, ce qui signifie que this
désignera la portée contenant (souvent window
ou undefined
) et non pas Vue.
Cette erreur apparaît si $ emit ne se trouve pas dans le contexte/la référence actuelle de this
, peut-être lorsque vous utilisez les méthodes then
ou catch
d'une promesse. Dans ce cas, capturez une référence à this
en dehors de la promesse d'utilisation ultérieure afin que l'appel à $emit
aboutisse.
<script type="text/javascript">
var Actions = Vue.component('action-history-component', {
template: '#action-history-component',
props: ['accrual'],
methods: {
deleteAction: function(accrualActionId) {
var self = this;
axios.post('/graphql',
{
query:
"mutation($accrualId: ID!, $accrualActionId: String!) { deleteAccrualAction(accrualId: $accrualId, accrualActionId: $accrualActionId) { accrualId accrualRate name startingDate lastModified hourlyRate isHeart isArchived minHours maxHours rows { rowId currentAccrual accrualDate hoursUsed actions { actionDate amount note dateCreated } } actions {accrualActionId accrualAction actionDate amount note dateCreated }} }",
variables: {
accrualId: this.accrual.accrualId,
accrualActionId: accrualActionId
}
}).then(function(res) {
if (res.data.errors) {
console.log(res);
alert('errors');
} else {
self.$emit('accrualUpdated', res.data.data.deleteAccrualAction);
}
}).catch(function(err) {
console.log(err);
});
}
}
});
Vous pouvez écrire brièvement la méthode en utilisant upload(e) {
au lieu de upload:(e)=>{
pour indiquer ce point au composant.
Voici l'exemple complet
watch: {
upload(e) {
const files = e.target.files;
if(files && files.length > 0) {
console.log(files[0]);
this.$emit('input',files[0]);
}
}
}