【问题标题】:vuejs 2 component base64 image not updatingvuejs 2组件base64图像未更新
【发布时间】:2017-08-30 01:46:02
【问题描述】:

我想要达到的目标:
从受 jwt 令牌保护的源加载图像
服务器将图像作为 base64 字符串返回,我会将此字符串作为背景 url 加载到图像上

父组件:

<template lang="html">
     <myImage v-for="photo in form.photos" :photo="photo" @delphoto="deleteImage"></myImage>
</template>

export default {
        components: {
            myImage,
        },
        data(){
            return {
                form: {
                    photos: [
                {
            id: 1,
            thumbnail: "logo1.png"
            },
                {
            id: 2,
            thumbnail: "logo2.png"
            },
                {
            id: 3,
            thumbnail: "logo3.png"
            },
                {
            id: 4,
            thumbnail: "logo4.png"
            },
            ]

                },

            }
        },
        methods: {
            deleteImage(myphoto)
            {
                this.form.photos.splice(this.form.photos.indexOf(myphoto), 1);
            }
        }
    }

myImage 组件

<template>
        <div v-if="loaded" class="img">
            <img class="albumimg" :style="{ background: img}" :title="title">
            <p @click="delimage">delete</p>
        </div>
        <div v-else class="img">
            <img class="loading" style="background: url('/images/spinner.gif')">
        </div>
</template>
<script>
    export default {
        data(){
            return {
                img: null,
                loaded: false
            }
        },
        props: {
            photo: {
                required: true
            },
            title: {
                default: ''
            },
        },
        created() {
            this.imgurl()
        },
        methods: {
            delimage() {
              this.$emit('delphoto', this.photo)
            },
            imgurl() {
                this.$http.get("/api/images/" + this.photo.id).then(response => {
                    this.img = "url('" + response.data + "')"
                    this.loaded = true
                }, response => {
                });
            },
        }
    }
</script>

现在,如果我从 form.photos 数组中删除一张照片(拼接),最后一张图像总是会被删除。 当我删除绿色图像时

蓝色图像消失

当我检查 form.photos 数组时,删除了正确的图像,只有 myImage 组件中的 img 数据属性仍然是前一个数组位置 1 的旧值。

我能够通过在照片道具上添加手表并重新获取 base64 字符串来绕过这个问题,这会导致对每个图像的新获取请求

watch: {
   photo: function (val) {
      this.imgurl()
   }
},

有没有办法移除一个数组项(子组件)并显示正确的结果,而无需再次在子组件中获取所有图像?

谢谢

【问题讨论】:

    标签: javascript laravel vue.js vuejs2 vue-component


    【解决方案1】:

    试试这个。

    <myImage v-for="photo in form.photos" :key="photo.id" :photo="photo" @delphoto="deleteImage"></myImage>
    

    来自当前的documentation

    在 2.2.0+ 中,当使用 v-for 和组件时,现在需要一个键。

    【讨论】:

    • 感谢您的回答,结果相同。数组项已正确删除,但我的 myImage 组件中的 img 变量是此位置上旧数组项的值
    • 如果我将 base64 字符串直接添加到照片数组中并且不 fetech 创建的组件处的字符串一切正常。所以这与 axios 获取请求有关
    • @markus 我很抱歉。关键属性应该是“photo.id”。我更新了答案。回想起来,这个错误很明显;您不能使用索引,因为数组发生了变化;索引都会改变。 /facepalm 时刻。
    • 非常感谢,现在一切正常!我现在尝试修复它 4 天...非常感谢!!!
    猜你喜欢
    • 1970-01-01
    • 2019-03-01
    • 2019-05-09
    • 2017-11-27
    • 2017-11-10
    • 1970-01-01
    • 1970-01-01
    • 2021-08-12
    • 2016-09-06
    相关资源
    最近更新 更多