在 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();
...
祝你好运
我正在尝试在单击保存按钮时更改用户的个人资料图片,我的模板如下所示:
<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();
...
祝你好运