通过 v-for 循环获取照片预览

get a photo preview over v-for loop

我想在下面的代码中预览照片。我正在使用 BootstrapVue。

但我不知道问题出在哪里..在查看我的 Vue devtools 后,我可以看到表单文件有图片,但我的“手表”不工作..

如果有人能帮助我,那将非常有帮助!

我的模板:

<template>
  <div>
    <div v-for="item in files" :key="item.id">
      <b-button v-b-toggle="item.id" variant="danger btn-block mb-2">
        Upload {{ item.id }}</b-button>
      <b-collapse :id="item.id" class="mt-2">
        <div class="m-2 mt-3">
          <table class="table table-striped mt-2">
            <tbody>
              <div class="mt-3 mb-2 ml-1">Upload</div>
              <b-form-file
                :v-model="item.request"
                placeholder="Upload ..."
                class="mb-2"
              ></b-form-file>
              <b-img
                v-if="item.request"
                :src="item.src"
                class="mb-3"
                fluid
                block
                rounded
              ></b-img>
            </tbody>
          </table>
        </div>
      </b-collapse>
    </div>
  </div>
</template>

我的脚本:

<script>
const base64Encode = (data) =>
  new Promise((resolve, reject) => {
    const reader = new FileReader();
    reader.readAsDataURL(data);
    reader.onload = () => resolve(reader.result);
    reader.onerror = (error) => reject(error);
  });

export default {
  data() {
    return {
      files: [
        { id: "1", src: null, request: null },
        { id: "2", src: null, request: null },
        { id: "3", src: null, request: null },
      ],
    };
  },

  watch: {
    files: {
      deep: true, //watch changes at objects properties
      handler(newValue, oldValue) {
        if (newValue !== oldValue) {
          if (newValue) {
            base64Encode(newValue.src)
              .then((value) => {
                newValue.src = value;
              })
              .catch(() => {
                newValue.src = null;
              });
          } else {
            newValue.src = null;
          }
        }
      },
    },
  },
};
</script>

你犯了一个小错误!

不要为 b-form-file 组件编写 :v-model,而是使用 v-model

在手表 属性 中,您无法了解哪些上传输入发生了变化。因此,请尝试为 b-form-file 使用 input 事件处理程序。然后你可以传递每个 files 和 运行 base64Encode 函数的索引。

您可以看到代码的工作版本 here