首页  >  问答  >  正文

Vue 3 composition api中如何使用'this.$refs'?

我正在尝试使用 vue 组合 api 上传。虽然上传工作正常,但我想在单击重置按钮时重置,但无法在合成 api 中访问 $refs.filethis.$refs.file

<template>
  <input type="file" class="absolute w-0 h-0 invisible opacity-0" @change="handleImageSelected" ref="file" accept="image/*">
  <button @click="$refs.file.click()">Upload</button>
  <button @click="resetUploadFile">Reset</button>
</template>

<script setup>
import {ref} from 'vue'

const imageFile = ref()
const imageUrl = ref()

function handleImageSelected(e) {
  if (!e.target.files.length) return;
  imageFile.value = e.target.files[0];
  console.log(e.target.files[0])
  let reader = new FileReader();
  reader.readAsDataURL(imageFile.value);
  reader.onload = e => {
    imageUrl.value = e.target.result;
  };
}

function resetUploadFile() {
  this.$refs.file.target.value = null
  imageFile.value = null
  imageUrl.value = null
}
</script>

P粉420958692P粉420958692298 天前435

全部回复(1)我来回复

  • P粉762447363

    P粉7624473632023-12-27 14:27:58

    你必须做什么,最初你需要包含 getCurrentInstance 组件, const instance = getCurrentInstance();然后您需要执行 instance.refs.file.value = null 总之,您的组件应如下所示。

    <template>
      <input type="file" class="absolute w-0 h-0 invisible opacity-0" @change="handleImageSelected" ref="file" accept="image/*">
      <button @click="$refs.file.click()">Upload</button>
      <button @click="resetUploadFile">Reset</button>
    </template>
    
    <script setup>
    import {ref, getCurrentInstance} from 'vue'
    
    const instance = getCurrentInstance()
    const imageFile = ref()
    const imageUrl = ref()
    
    function handleImageSelected(e) {
      if (!e.target.files.length) return;
      imageFile.value = e.target.files[0];
      console.log(e.target.files[0])
      let reader = new FileReader();
      reader.readAsDataURL(imageFile.value);
      reader.onload = e => {
        imageUrl.value = e.target.result;
      };
    }
    
    function resetUploadFile() {
      instance.refs.file.value = null
      imageFile.value = null
      imageUrl.value = null
    }
    </script>

    回复
    0
  • 取消回复