【问题标题】:understanding Vue components and fileupload了解 Vue 组件和文件上传
【发布时间】:2018-03-13 21:05:29
【问题描述】:

更多关于 Vue 组件的阅读。 我不明白 el 属性与组件的名称。

前两个组件只是使用模板。第三个似乎需要'el'属性。它应该指向什么?重新形成?

这给了我onFileChange 未定义

app.js:

Vue.component('pg-title', {
    template: '<h1>ATS Credits and Debits</h1>'
});
Vue.component('pg-subtitle', {
    template: '<h2>Table:</h2>'
});
Vue.component('form', {
        el: '#app',
        data: {
            fileinput: ''
        },
        methods: {
            onFileChange(e) {
                var files = e.target.files || e.dataTransfer.files;
                if (!files.length)
                    return;
                this.createInput(files[0]);
            },
            createInput(file) {
                var reader = new FileReader();
                var vm = this;
                reader.onload = (e) => {

                vm.fileinput = reader.result;
                }
                reader.readAsText(file);

                console.log(this.fileinput);
            }

        }});

var vm = new Vue({
    el: '#app'
});

index.html:

<pg-title></pg-title>
<pg-subtitle></pg-subtitle>

<form enctype="multipart/form-data">
    <input type="file" @change="onFileChange">
</form>

【问题讨论】:

  • 好的,所以我创建了一个新元素:sometext,并将 el 指向它。我仍然得到 onFileChange is not defined 错误。
  • 看来我一开始可能误导了你。检查我的答案。

标签: vue.js


【解决方案1】:

好吧,只是一些事情

  • 创建组件时需要使用template,而不是el
  • 将模板从主文档流中取出,并使用相应的组件标签名称作为元素或使用inline-template 属性。
  • 不要将组件命名为与任何标准 html 标记相同的名称。
  • 数据应该是一个函数。

Vue.component('v-form', {
        template: '#myform',
        data() {
          return{
            fileinput: ''
          };
        },
        methods: {
            onFileChange(e) {
                var files = e.target.files || e.dataTransfer.files;
                if (!files.length)
                    return;
                this.createInput(files[0]);
            },
            createInput(file) {
                var reader = new FileReader();
                var vm = this;
                reader.onload = (e) => {
                    vm.fileinput = reader.result;
                    console.log(vm.fileinput);
                }
                reader.readAsText(file);
            }
        }
});

new Vue({
  el: '#app',
})
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.4.4/vue.min.js"></script>

<div id="app">
  <v-form></v-form>
</div>

<template id="myform">
  <form enctype="multipart/form-data">
      <input type="file" @change="onFileChange">
  </form>
</template>

使用inline-template,从组件中删除template,并像这样定义您的html:

<div id="app">
  <v-form inline-template>
      <form enctype="multipart/form-data">
        <input type="file" @change="onFileChange">
      </form>
  </v-form>
</div>

【讨论】:

  • 恐怕代码什么也不输出,也不抛出任何错误。
  • @DaveC426913 我认为您可能不清楚 FileReader api 的工作原理。我移动了console.log,所以你可以看到它有效。只需单击“运行代码 sn-p”并从您的计算机中选择一个 .txt 文件。
  • 我已经让它出现在 console.log 中没问题。我正在尝试将其输出到页面。
  • @DaveC426913 我想我不明白这个问题。如果您想在页面上输出文件,则使用类似 mustache 语法的方式将变量写入页面。喜欢this
猜你喜欢
  • 2019-10-23
  • 1970-01-01
  • 2018-08-26
  • 2021-05-13
  • 1970-01-01
  • 2018-08-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多