You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

react-native-calendars中Agenda子项点击状态不更新问题求助

问题解决:react-native-calendars Agenda组件第二项点击无响应

问题根源在于组件每次重渲染时,items对象和renderItem函数都会被重新创建,导致Agenda的内部渲染优化机制失效,第二项的状态更新无法触发即时重渲染。

修复方案

通过useMemo和useCallback保持数据与渲染函数的引用稳定,让Agenda能正确响应状态变化:

import React, { useState, useMemo, useCallback } from 'react';
import { View, Text, TouchableOpacity, StyleSheet } from 'react-native';
import { Agenda } from 'react-native-calendars';

const Calendar: React.FC = () => {
  const [expandedItem, setExpandedItem] = useState<string | null>(null);

  const currentDate = new Date().toISOString().split('T')[0];

  // 用useMemo缓存items,避免每次重渲染创建新对象
  const items = useMemo(() => ({
    [currentDate]: [
      { id: '1', title: 'Item 1', description: 'Dummy text for Item 1.' },
      { id: '2', title: 'Item 2', description: 'Dummy text for Item 2.' },
    ],
  }), [currentDate]);

  // 用useCallback包裹renderItem,保证函数引用稳定
  const renderItem = useCallback((item: { id: string; title: string; description: string }) => {
    const isExpanded = expandedItem === item.id;

    return (
      <View style={styles.itemContainer}>
        <TouchableOpacity onPress={() => setExpandedItem(isExpanded ? null : item.id)}>
          <Text style={styles.itemTitle}>{item.title}</Text>
        </TouchableOpacity>
        {isExpanded && <Text style={styles.itemDescription}>{item.description}</Text>}
      </View>
    );
  }, [expandedItem]);

  return (
    <View style={styles.container}>
      <Agenda
        items={items}
        renderItem={renderItem}
        selected={currentDate}
        theme={{
          agendaDayTextColor: 'blue',
          agendaDayNumColor: 'blue',
          agendaTodayColor: 'blue',
        }}
      />
    </View>
  );
};

const styles = StyleSheet.create({
  container: {
    flex: 1,
    padding: 20,
  },
  itemContainer: {
    padding: 10,
    borderBottomWidth: 1,
    borderBottomColor: '#ccc',
  },
  itemTitle: {
    fontSize: 18,
    fontWeight: 'bold',
  },
  itemDescription: {
    fontSize: 14,
    color: '#666',
    marginTop: 5,
  },
});

export default Calendar;

原理说明

  • useMemo缓存items后,只有当currentDate变化时才会重新生成对象,避免了无意义的引用变化,让Agenda能正确识别数据是否真的更新。
  • useCallback包裹renderItem后,仅在expandedItem变化时更新函数引用,确保每个列表项能即时响应状态变化,无需切换日期强制刷新。

内容的提问来源于stack exchange,提问作者newby73

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 05:33:19