0

I'm trying to use a 'file picker' component globally on my app and getting the 'imageUrl' base64 to manipulate upload on server.

I have the following on my component:

<template>
      <div class="column" style="width: 300px;">
        <q-btn @click="sendEventImage ()" style="margin-top: 16px; margin-bottom: 32px;" outline color="white" text-color="black" label="Procurar imagem" />
        <input style="display:none" ref="EventfileInput" @change="onEventFilePicked" type="file" name="upload" accept="image/*" />
        <q-img class="w-30 h-30" :src="imageUrl" />
      </div>
</template>

<script>

import { defineComponent, ref } from 'vue'

export default defineComponent({
  name: 'PageIndex',
  setup () {
    let imageUrl = ref('')
    let model = ref(null)
    return {
      sendEventImage () {
        console.log('sendEvent preview')
        this.$refs.EventfileInput.click()
      },
      onEventFilePicked (event) {
        const files = event.target.files
        let image = files[0]
        console.log(image)
        let filename = files[0].name
        if (filename.lastIndexOf('.') <= 0) {
          return alert('Por favor adicione um arquivo válido')
        }
        const fileReader = new FileReader()
        fileReader.addEventListener('load', (event) => {
          this.imageUrl = fileReader.result
          console.log('setimageUrl', this.imageUrl)
        })
        fileReader.readAsDataURL(files[0])
      },
      imageUrl,
      model
    }
  }
})
</script>

How can i use this component in every component of my app and also get the "imageUrl" parameter on my setup () to use this parameter ?

1 Answer 1

2

You'll have to emit an event so the parent component can react to it: https://v3.vuejs.org/guide/composition-api-setup.html#accessing-component-properties

Untested:

<template>
      <div class="column" style="width: 300px;">
        <q-btn @click="sendEventImage ()" style="margin-top: 16px; margin-bottom: 32px;" outline color="white" text-color="black" label="Procurar imagem" />
        <input style="display:none" ref="EventfileInput" @change="onEventFilePicked" type="file" name="upload" accept="image/*" />
        <q-img class="w-30 h-30" :src="imageUrl" />
      </div>
</template>

<script>

import { defineComponent, ref } from 'vue'

export default defineComponent({
    name: 'FileUpload',
    emits: ['imageloaded'],
    setup (props, { emit }) {
        const imageUrl = ref('');
        const EventfileInput = ref(null);
          
        const onEventFilePicked = (event) => {
            const files = event.target.files
            const image = files[0]
            console.log(image)
            const filename = files[0].name
            if (filename.lastIndexOf('.') <= 0) {
              return alert('Por favor adicione um arquivo válido')
            }
            const fileReader = new FileReader()
            fileReader.addEventListener('load', (event) => {
              imageUrl.value = fileReader.result
              console.log('setimageUrl', imageUrl.value)
              emit('imageloaded',imageUrl.value);
            })
            fileReader.readAsDataURL(files[0])
        };
        const sendEventImage = () => {
            console.log('sendEvent preview')
            EventfileInput.click()
        };
        return {
            imageUrl,
            sendEventImage,
            onEventFilePicked
        }
    }
})
</script>

A few remarks on your code which I changed in my example:

Sign up to request clarification or add additional context in comments.

2 Comments

Ok, i put an 'emit', but how can i get this 'emited value' on my father component? In my aplication i ended using store variable, but appears to be better keep this information on component.
You can just add @imageloaded="someHandler" on the component and implement this handler: v3.vuejs.org/guide/component-custom-events.html

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.