1

我想稍后动态更新 dropzone 组件的 url 选项。

以下是我拥有的 Vue 组件:

<div id="app">
  <vue-dropzone ref="myVueDropzone" id="dropzone" :options="dropzoneOptions"></vue-dropzone>
  <button @click="updateUrl()">
  Update
  </button>
</div>
<script>

new Vue({
  el: "#app",
  data: {
    dropzoneOptions: {
        url : "https://google.com"
    }
  },
  computed:{  
  },
  components: {
    vueDropzone: vue2Dropzone
  },
  methods: {
    updateUrl(){
      console.log("Updating url")
      this.dropzoneOptions.url = "http://example.com"
    }
  }
})
</script>

当我尝试使用按钮单击进行更新时,我看到 dropzoneOptions.url 已更新。但是,当我尝试上传文件时,文件仍会发布到旧网址https://google.com

链接到 JSFiddle:https ://jsfiddle.net/1t7L6ouc/3/

4

3 回答 3

2

有一个options属性可以让您定义url. 既然你给了它 a ref,你应该能够像这样更新它:

this.$refs.myVueDropzone.dropzone.options.url = 'http://example.com';
于 2018-12-21T01:10:23.403 回答
1

你需要让你的data反应。

https://vuejs.org/v2/guide/reactivity.html

data: function () {

    return {
        dropzoneOptions: {
            url : "https://google.com"
        }
    }

}

如果值仍然没有改变,您可能还需要使用 set 方法。

updateUrl(){
    this.$set(this.dropzoneOptions,'url','http://example.com');
}

https://jsfiddle.net/1t7L6ouc/8/

于 2018-12-20T08:57:13.743 回答
1

我知道这是一个旧线程,但我最近遇到了类似的问题,希望我的解决方案可以帮助某人。

我不得不将图像发布到一个看起来像的端点api/questions/24/image,24 是正在编辑的当前“问题”的 id。此 id 将是映射到我的计算属性的商店属性,如questionId. 问题是在我的情况下,没有按钮可以挂钩事件。图像必须自动上传。所以我需要与 dropzone 一起使用的 URL 是api/questions/${this.questionId}/image.

正如我所预料和担心的那样,这个 URL 无法通过将 dropzoneOptions 放在 Data 属性中的记录方式正确解析,因为在对象中,this (in this.questionId) 将不再引用 vue 实例。在玩弄了 dropzone 钩子/事件/方法之后,我最终将整个 dropzoneOptions 对象设置为一个计算属性,如下所示:

computed: {
    dropzoneOptions() {
        return {
            acceptedFileTypes: "image/*",
            url: `/api/questions/${this.questionId}/image`, 
            headers: {
                "X-CSRF-TOKEN": document.head.querySelector("[name=csrf-token]").content
            }
        }
    },
   [...]
}

这样,如果需要,您可以将任何参数映射到另一个计算属性,如下所示:

computed: {
    uploadUrl() {
        return `/api/questions/${this.questionId}/image`;
    },
    dropzoneOptions() {
        return {
            acceptedFileTypes: "image/*",
            url: this.uploadUrl, 
            headers: {
                "X-CSRF-TOKEN": document.head.querySelector("[name=csrf-token]").content
            }
        }
    },
   [...]
}

它感觉不是一个理想的解决方案,但这也不是太糟糕。

于 2021-04-23T18:48:18.153 回答