【问题标题】:Loading a user's profile image加载用户的个人资料图片
【发布时间】:2020-05-05 21:30:30
【问题描述】:

我正在使用 React、Redux 和 Firebase 构建网站。我使用 firebase 存储来存储用户的个人资料图片,并希望在用户创建帐户后将其显示在网站上。我以前的方法是在需要显示个人资料图像的每个组件中包含以下图像元素:

//1st Approach
render(){

        const { auth } = this.props;

        return(
                       .......

                        <img src={firebase.storage().ref(`images/`+auth.uid).getDownloadURL()}></img>

                       ......

但是,这样做只会显示默认的图像图标(天蓝色背景的青山和白云),并且控制台报告“404”错误,指出对象“图像/未定义”不存在。很可能发生错误是因为在将身份验证从 Redux 状态传递到组件之前调用了 getDownloadUrl 方法。我尝试的另一种方法是在组件的状态中添加一个“profileimage”字段,并将该字段值设置为 componentDidMount 内的图像 URL:

//2nd Approach
        componentDidMount() {

           const { auth } = this.props;
           const id = auth.uid;
           const image = firebase.storage().ref(`images/`+id);
           image.getDownloadURL().then((url) => this.setState({ profileimage: url }));
        }

        ......

         <img src={this.state.profileimage}></img>

第二种方法成功显示图像。但是,由于 componentDidMount 在组件的生命周期中只调用一次,如果用户刷新页面,“profileimage”将被设置为空字符串。所以我想知道如何以最合适的方式实现该功能。谢谢!

【问题讨论】:

    标签: reactjs firebase redux react-redux firebase-storage


    【解决方案1】:

    auth.uid 是您从 firebase sdk 获得的那个吗?

    您可以使用“onAuthStateChanged”观察者获取 uid:

    componentDidMount() {
      firebase.auth().onAuthStateChanged((user) => {
        const image = firebase.storage().ref(`images/${user.uid}`);
        image.getDownloadURL().then((url) => this.setState({ profileimage: url }));
      });
    }
    

    这样,您可以确保用户已初始化。

    【讨论】:

    • 感谢您的回复!在我的情况下,用户确实已初始化。使用 componentDidMount 有效,但我担心的是,如果用户刷新页面,那么“profileimage”将再次设置为空字符串。
    • 每次刷新页面时,它应该一次又一次地调用componentDidMount。你确定这个没有被调用吗?它将被设置为一个空字符串,但它会在您的 firebase 存储之后立即再次加载它。
    • 我刚刚通过添加 componentWillReceiveProps 解决了这个问题。我还想知道一旦用户在编辑他/她的个人资料时完成上传,如何让图像立即显示在网页上。我后来在我的“用户”firestore 集合中添加了一个“图像”字段,以存储每个用户的唯一且恒定的图像 URL 并设置 src={profile.image}。但是,上传不同的图像后,我需要刷新页面才能看到它。解决问题肯定会改善用户体验。
    • 你在使用 Redux 吗?如果没有,你可以看一下,它可以让你在不同的页面上保持相同的数据,如果有变化会自动重新渲染你的组件。
    • 感谢您的回复。是的,我正在使用 Redux,我知道如果发生任何更改,它应该重新渲染组件。我想知道这是否与我保持个人资料图像 url 不变有关(它始终位于 firebase 存储文档“images/uid”所属的页面上)。所以即使用户上传了不同的图片,URL地址还是一样的,Redux“没有意识到变化?”
    猜你喜欢
    • 1970-01-01
    • 2011-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-25
    • 2013-04-13
    相关资源
    最近更新 更多