我正在尝试破坏此代码[A](请参见底部的小提琴):
<div class="q-uploader-files scroll">
<q-item
v-for="file in files"
:key="file.name"
>
<q-progress :percentage="file.__progress"/>
<div>
{{ file.__progress }}%
</div>
<q-item-side v-if="file.__img" :image="file.__img.src">
</q-item-side>
<q-item-side right>
<q-item-tile
:icon="file.__doneUploading ? 'mdi-done' : 'mdi-clear'"
:color="file.__doneUploading ? 'primary' : 'color'"
@click.native="__remove(file)"></q-item-tile>
</q-item-side>
</q-item>
</div>
插入与[B]基本相同的代码,但是带有一个子组件。 这里是父母:
<div class="q-uploader-files scroll">
<my-uploader-progress
v-for="file in files"
:file="file"
:key="file.name"
:color='color'
>
</my-uploader-progress>
</div>
这里是孩子:
<template>
<q-item>
<q-progress
:color="file.__failed ? 'negative' : 'grey'"
:percentage="file.__progress"
/>
<div>
{{ file.__progress }}%
</div>
<q-item-side v-if="file.__img" :image="file.__img.src"/>
<q-item-side v-else icon="mdi-file" :color="color"/>
<q-item-main :label="file.name" :sublabel="file.__size"/>
<q-item-side right>
<q-item-tile
:icon="file.__doneUploading ? 'mdi-done' : 'mdi-clear'"
:color="file.__doneUploading ? 'primary' : 'color'"
@click.native="__remove(file)"
/>
</q-item-side>
</q-item>
</template>
在孩子上,我设置了file
属性:
props: {
file: {
type: File,
required: true
}
},
以某种方式在父子代码中一定存在问题,因为[{B]中的file
__img属性在子对象中(在渲染时)不存在,请参见:
,但确实存在于[A]中:
怎么了?控制台中没有错误。
原始([A])代码来自here。 File Object由一个xhr实例组成(我想?!)。
这里有[A]和[B]的小提琴/沙箱。按ADD选择要上传的图像,它不会上传,但是[A]将显示其缩略图img等;对[B]执行相同操作,这些将不会显示。
NOTA BENE:我注意到file.__img
在[B]中没有首先显示,但是当我开始在子组件中编辑代码时,它突然显示了出来。因此,显然/也许这是异步的,并且在刷新渲染之后就在那里...?!
答案 0 :(得分:5)
如果您正在寻找一个可行的解决方案,则可以根据my-uploader-progress
属性的存在将密钥分配给__img
组件,这将强制其在属性出现时重新呈现变得可用..
<my-uploader-progress
v-for="file in files"
:file="file"
:key="file.__img ? '1-' + file.name : '0-' + file.name"
:hide-upload-progress="hideUploadProgress"
:color='color'
>
</my-uploader-progress>
答案 1 :(得分:5)
您必须通过返回工厂函数来使属性值具有反应性。
props: {
file: {
type: File,
required: true,
default: function () {
return {
name: '',
_progress: 0
}
}
}
},
答案 2 :(得分:4)
排序很丑陋,但我希望这可以解决此问题。尝试在已挂载的函数中设置超时,以在文件加载之前花一些时间,然后满足v-if
条件以在DOM中加载图像元素。
<template>
<q-item-side v-if="file_loaded" :image="file.__img.src"/>
</template>
<script>
data () {
file_loaded: false
},
mounted() {
setTimeout(() => {
this.file_loaded = true
}, 1000)
}
</script>
我已经在您的沙箱[B]中尝试过此方法,并且工作正常。
答案 3 :(得分:4)
如果在挂载孩子后要更新props中对象的属性值,它将无法正常工作,则必须替换完整的对象才能使其正常工作,