【问题标题】:Update React Native Screen when Firebase variable changesFirebase 变量更改时更新 React Native Screen
【发布时间】:2020-05-05 20:26:33
【问题描述】:

您好,我是 firebase 新手,不知道当某个 firebase 变量发生变化时如何在我的 react 本机应用程序更新中制作屏幕。

在我的应用程序的主屏幕中,用户的帖子从componentDidMount 的firebase 中获取,然后呈现:

componentDidMount = () => {
  this.setup();
};

setup = async () => {
  const { currentUser } = await firebase.auth();
  this.setState({ currentUser });

  await firebase
    .database()
    .ref("users/" + currentUser.uid + "/posts")
    .on("value", snapshot => {
      this.setState({posts: snapshot.val()})
    });
}

// render posts

在单独的屏幕中,用户可以选择添加帖子并更新 firebase 数据库:

addPost = async () => {
  const { currentUser } = firebase.auth();

  await firebase
    .database()
    .ref("users/" + currentUser.uid + "/posts")
    .push({
      post: // data for post
    });

但是,虽然数据库已成功更改,但在手动重新加载之前,主屏幕不会更新并显示新添加的帖子。如何在主屏幕上添加监听器,以便当帖子数据库变量更改时,屏幕会自动更新。

【问题讨论】:

    标签: javascript firebase react-native firebase-realtime-database


    【解决方案1】:

    如果你想在多个屏幕之间共享相同的数据,最好是使用 Redux。

    使用 Redux,如果数据更新,您的所有渲染功能(需要来自商店的特定数据)都会自动刷新。这样,您只能处理一个 firebase 侦听器来更新您的 redux 存储。

    每当我从 firebase 侦听器获得新内容时,我都会创建一个“发布”reducer 并调度一个更新操作。

    // Actions
    const ADD = 'post/ADD';
    const UPDATE = 'post/UPDATE';
    
    // Initial state
    const initialState = {
      posts: [],
    };
    
    // Reducer
    export default function reducer(state = initialState, action = {}) {
      switch (action.type) {
        case ADD:
          return {
            ...state,
            posts: [...state.posts, action.post]
          };
        case UPDATE:
          return {
            ...state,
            posts: action.posts
          };
        default:
          return state;
      }
    }
    
    // Action Creators
    export function addPost(post) {
      return {
        type: ADD,
        post
      };
    }
    
    export function updatePosts(posts) {
      return {
        type: UPDATE,
        posts
      };
    }
    

    听者会是这样的:

    import { update } from 'PostRedux.js'
    
    firebase
        .database()
        .ref("users/" + currentUser.uid + "/posts")
        .on("value", snapshot => {
          Store.dispatch(update(snapshot.val()));
        });
    

    【讨论】:

    • 我认为这不适用于此应用程序,如果其他用户在该设备上登录该应用程序,它将无法工作。但是,你能告诉我你应该在哪里添加监听器代码吗?
    • 首先,我会安装 redux-persist。然后,我会将您的用户数据保存到 redux 存储中(例如,在成功登录后),因此每次持久化存储后,您都可以知道用户之前是否登录过。然后,只有当用户登录时,您才能调用监听器。每次用户退出时不要忘记擦除存储。
    猜你喜欢
    • 2018-01-16
    • 2021-06-01
    • 2021-06-14
    • 2017-09-28
    • 2020-07-14
    • 2015-01-17
    • 1970-01-01
    • 1970-01-01
    • 2016-01-30
    相关资源
    最近更新 更多