首页 > 解决方案 > 反应原生如何在我的应用程序运行时显示徽章

问题描述

我已经面临一个问题 1 周。我的问题是我想在运行我的应用程序时显示新的消息徽章而不单击消息室我可以在单击消息室后显示徽章。

当我运行我的应用程序时。主页。

然后我点击了留言室 现在我可以看到徽章了

ChatList 组件src/Components/ChatList

  const [badgeCount, setBadgeCount] = useState(0);
  const {badgeStateDispatch} = useContext(GlobalContext);
  const unReadMessageQuery = db
    .collection('chats')
    .doc(id)
    .collection('messages')
    .where('user', '==', recipientEmail)
    .where('unread', '==', true);
  const [unReadMessageToBadge] = useCollection(unReadMessageQuery);
  useEffect(() => {
    const badgeMessagesCount = unReadMessageToBadge?.size;
    console.log(badgeMessagesCount);
    setBadgeCount(badgeMessagesCount);
    badgeStateDispatch({type: BADGE_SHOW});
  }, [unReadMessageToBadge]);

减速器

import {BADGE_SHOW, BADGE_RESET} from '../../Constants/actionTypes';

const badgeCount = (state, {type, payload}) => {
  switch (type) {
    case BADGE_SHOW:
      return {...state, badge: (state.badge = true)};
    case BADGE_RESET:
      return {...state, badge: (state.badge = null)};
    default:
      return state;
  }
};

export default badgeCount;

TabNavi src/Navigator/Tabnavi.js

import React, {useContext} from 'react';
import {createBottomTabNavigator} from '@react-navigation/bottom-tabs';
import HomeStackNavi from './HomeStackNavi';
import ProfileStackNavi from './ProfileStackNavi';
import MessageStackNavi from './MessageStackNavi';
import Entypo from 'react-native-vector-icons/Entypo';
import Icon from 'react-native-vector-icons/FontAwesome';
import colors from '../Assets/theme/colors';
import {GlobalContext} from '../Context/GlobalProvider';
const Tab = createBottomTabNavigator();
const TabNavi = () => {
  const {
    badgeState: {badge},
  } = useContext(GlobalContext);
  return (
    <Tab.Navigator
      tabBarOptions={{
        activeTintColor: colors.white,
        inactiveTintColor: colors.gray,
        style: {backgroundColor: colors.primary},
      }}>
      <Tab.Screen
        name="Home"
        component={HomeStackNavi}
        options={{
          tabBarIcon: () => <Icon name="home" size={25} color={colors.white} />,
        }}
      />
      <Tab.Screen
        name="Messages"
        component={MessageStackNavi}
        options={{
          tabBarIcon: () => (
            <Entypo name="message" size={25} color={colors.white} />
          ),
          tabBarBadge: badge,
          tabBarBadgeStyle: {
            top: Platform.OS === 'ios' ? 0 : 9,
            minWidth: 10,
            maxHeight: 10,
            borderRadius: 7,
            fontSize: 10,
          },
        }}
      />
      <Tab.Screen
        name="Profile"
        component={ProfileStackNavi}
        options={{
          tabBarIcon: () => <Icon name="user" size={25} color={colors.white} />,
        }}
      />
    </Tab.Navigator>
  );
};

export default TabNavi;

编辑:这是 ChatList 的父组件。


const ChatRoomList = () => {
  const [user] = useAuthState(auth);
  if (!user || !user.email) return;
  const {badgeStateDispatch} = useContext(GlobalContext);
  const renderItem = useCallback(({item}) => <ChatList item={item} />, []);
  const keyExtractor = useCallback(item => item.id, []);
  const userChatRef = db
    .collection('chats')
    .where('users', 'array-contains', user.email);
  const [chatsSnapshot] = useCollection(userChatRef);
  const [chatList, setChatList] = useState([]);
  useEffect(() => {
    const chatData = new Array();
    chatsSnapshot?.docs.map(chat => {
      chatData.push({id: chat.id, users: chat.data().users});
    });
    setChatList(chatData);
  }, [chatsSnapshot]);
  useFocusEffect(
    React.useCallback(() => {
      badgeStateDispatch({type: BADGE_RESET});
    }, []),
  );
  return (
    <View>
      <FlatList
        data={chatList}
        renderItem={renderItem}
        keyExtractor={keyExtractor}
        initialNumToRender={7}
        showsVerticalScrollIndicator={false}
      />
    </View>
  );
};

export default ChatRoomList;

我真的很感谢你的帮助。

标签: javascriptreactjsreact-native

解决方案


您的问题是您检查未读消息的调用在您的第二个选项卡中的 ChatList 组件中。react-navigation 仅在您导航到第二个选项卡时呈现该组件,因此此代码仅在您选择该选项卡时运行。

你必须把这个调用移到其他地方,要么移到更高阶的组件中,要么完全移出 React 树,尽管这需要一些返工,因为你依赖于钩子。


推荐阅读