Vue child 组件 属性 不工作
Vue child component property does not work
我正在尝试破解此代码 [A](请参阅底部的 fiddle):
<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] 基本相同的代码,但随后带有 child 组件。
这里是 parent:
<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>
这里是 child:
<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>
在 child 我设置了 file
属性:
props: {
file: {
type: File,
required: true
}
},
parent-child 代码中一定有问题,因为 file
__img 属性 在 child 中不存在(在渲染时)在 [B] 中参见:
,而它确实存在于 [A]:
怎么了?控制台没有错误。
原始 ([A]) 代码来自 here. The File Object,包含一个 xhr 实例(我想?!)。
此处 fiddles/ [A] and for [B] 的沙箱。按 ADD 和 select 要上传的图片,它不会上传,但 [A] 会显示其缩略图 img 等;对 [B] 做同样的事情,这些将不会显示。
注意:我注意到 file.__img
没有首先显示在 [B] 中,但是当我开始编辑 child 组件中的代码时...,它突然显示了。所以 apparently/ 也许它是异步的并且在 render-refresh 之后它在那里......?!
有点丑陋,但我希望这能解决问题。尝试在已安装的函数中设置超时以在文件加载之前购买一些时间,然后实现 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],它工作正常。
如果您正在寻找一个可行的解决方案,您可以根据 __img
属性 的存在简单地为 my-uploader-progress
组件分配一个键,这将强制它当 属性 可用时重新渲染 ..
<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>
如果您在安装子项后更新 props 中对象的 属性 值,它将无法工作,您必须替换整个对象才能使其工作,
您必须通过返回工厂函数使 属性 值具有反应性。
props: {
file: {
type: File,
required: true,
default: function () {
return {
name: '',
_progress: 0
}
}
}
},
我正在尝试破解此代码 [A](请参阅底部的 fiddle):
<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] 基本相同的代码,但随后带有 child 组件。 这里是 parent:
<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>
这里是 child:
<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>
在 child 我设置了 file
属性:
props: {
file: {
type: File,
required: true
}
},
parent-child 代码中一定有问题,因为 file
__img 属性 在 child 中不存在(在渲染时)在 [B] 中参见:
,而它确实存在于 [A]:
怎么了?控制台没有错误。
原始 ([A]) 代码来自 here. The File Object,包含一个 xhr 实例(我想?!)。
此处 fiddles/ [A] and for [B] 的沙箱。按 ADD 和 select 要上传的图片,它不会上传,但 [A] 会显示其缩略图 img 等;对 [B] 做同样的事情,这些将不会显示。
注意:我注意到 file.__img
没有首先显示在 [B] 中,但是当我开始编辑 child 组件中的代码时...,它突然显示了。所以 apparently/ 也许它是异步的并且在 render-refresh 之后它在那里......?!
有点丑陋,但我希望这能解决问题。尝试在已安装的函数中设置超时以在文件加载之前购买一些时间,然后实现 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],它工作正常。
如果您正在寻找一个可行的解决方案,您可以根据 __img
属性 的存在简单地为 my-uploader-progress
组件分配一个键,这将强制它当 属性 可用时重新渲染 ..
<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>
如果您在安装子项后更新 props 中对象的 属性 值,它将无法工作,您必须替换整个对象才能使其工作,
您必须通过返回工厂函数使 属性 值具有反应性。
props: {
file: {
type: File,
required: true,
default: function () {
return {
name: '',
_progress: 0
}
}
}
},