在 Firebase + Vue + Quasar Framework 中更改个人资料图片

Change profile picture in Firebase + Vue + Quasar Framework

我正在尝试在单击保存按钮时更改用户的个人资料图片,我的模板如下所示:

<q-file
  v-model="file"
  label="Pick one file"
  class="text-center"
  use-chips
  accept=".jpg, image/*"
  style="width: 200px"
 />
   <q-btn flat class="text-primary" @click="saveUsersProfile(file)">
     Save
   </q-btn>

在我的脚本部分:

<script>
import { mapActions } from "vuex";

export default {
  name: "profile",
  data: () => ({
    file: null
  }),
  computed: {
    ...mapActions("store", ["saveUsersProfile"])
  },

Store.js

//Let users change Profile Picture
  saveUsersProfile({}, payload) {
    // Get the File
    const file = payload[0];
    const extension = file.name.split(".").pop();
    const uploadDate = new Date();
    const fileName = `${firebaseAuth.currentUser.uid}-${uploadDate.toDateString()}.${extension}`;
    firebaseStorage
      .ref(`users/profile/${fileName}`)
      .put(file)
      .then(res => {
        console.log(res);
      })
      .catch(err => {
        console.log(err);
      });

控制台错误:

Error in v-on handler: "TypeError: Cannot read property 'name' of undefined"

vue.runtime.esm.js?2b0e:1888 TypeError: Cannot read property 'name' of undefined
    at Store.saveUsersProfile (store.js?07a4:122)

不知道为什么获取不到文件扩展名

您使用 mapActions 调用 saveUsersProfile 操作,但没有映射它。基本上,这意味着您的操作将被称为 没有有效负载 (我相信它将被设置为 {})。因此,payload[0] 的计算结果为 undefined。尝试调用 .name 时,它会抛出您遇到的错误。

您需要映射您的操作。

来自 here:

mapActions will just, map actions.

It creates shorthands for you, and you call the methods like any other normal methods. after ...mapActions('auth', ['login'])

this.$store.dispatch('auth/login', yourPayload)

is equal to

this.login(yourPayload)

对于您的情况,您必须在脚本会话中添加一个方法:

<script>
import { mapActions } from "vuex";

export default {
  name: "profile",
  data: () => ({
    file: null
  }),
  methods: {
    ...mapActions("store", ["saveUsersProfile"]),

    saveUsersProfile({name}),
},

对于商店:

//Let users change Profile Picture
  saveUsersProfile({}, payload) {
    // Get the File
    const file = payload; // I don't understand why you need [0], but maybe I'm wrong
    const extension = file.name.split(".").pop();
    ...

祝你好运