【问题标题】:component not reading hook state properly组件未正确读取挂钩状态
【发布时间】:2019-09-30 20:42:20
【问题描述】:

我有一个按钮 (h1) 组件,它有一个 onclick 处理程序 (handleDateLabelClick),它更改状态以决定日历是否可见。正常工作,它应该将状态更改为当前相反的状态。目前,正确单击按钮会导致日历出现,但再次单击同一按钮不会导致日历消失。我在 handleDateLabelClick 函数中添加了一个控制台日志,以查看正在读取的内容,并且每次 calendarOpen 状态为 false。当我在 devtools 中观察到状态运行正常时,这变得更加有趣(打开时为真,关闭时为假)。这是我的代码(BookCard 是 Calendar 的父级):

书卡

const BookCard = ({
   ...props
}) => {
const [calendarOpen, setCalendarOpen] = useState(false)

const handleDateLabelClick = () => {
    setCalendarOpen(!calendarOpen)
}

<DateWrapper>
    <DateHeading onClick={handleDateLabelClick} level={4}>
        {parsedDate.toLocaleDateString('en-US', dateFormat)}
    </DateHeading>
    <Calendar
        handleChooseDate={handleChooseDate}
        calendarOpen={calendarOpen}
        setCalendarOpen={setCalendarOpen}
        {...props}
    />
</DateWrapper>

日历

const EnhancedCalendar = ({
  handleChooseDate,
  calendarOpen,
  setCalendarOpen,
  ...props
}) => {

  EnhancedCalendar.handleClickOutside = () => setCalendarOpen(false)

  return (
    <StyledCalendar
      calendarOpen={!!calendarOpen}
      showNeighboringMonth
      minDetail="month"
      onClickDay={handleChooseDate}
      activeStartDate={props.experienceDate}
      tileDisabled={({ activeStartDate, date, view }) => date < new Date()}
      tileDisabled={({ activeStartDate, date, view }) => {
        const availabilitiesForCurrentDate = getTimesForCurrentDate(date, props.detail.availabilities)
        return (
          !availabilitiesForCurrentDate.length
        )
      }}
    />
  )
}

const clickOutsideConfig = {
  handleClickOutside: () => EnhancedCalendar.handleClickOutside
}

export default onClickOutside(EnhancedCalendar, clickOutsideConfig)

【问题讨论】:

  • 日历如何使用setCalendarOpen?
  • 我在日历中有一个钩子,可以检测日历外是否有点击。它是在 Calendar 中执行的。
  • 所以点击标题会是日历外的点击?

标签: reactjs


【解决方案1】:

正如你在评论中所说:

我在日历中有一个钩子,可以检测外部是否有点击 日历。它在那个点从日历中执行。和 你发现了错误点!谢谢你!问题仍然存在, 如何在没有当前错误的情况下保留此功能

我认为您的日历正在与您的标题发生冲突。

为了轻松修复它,您可以有条件地渲染您的日历:

<DateWrapper>
    <DateHeading onClick={handleDateLabelClick} level={4}>
        {parsedDate.toLocaleDateString('en-US', dateFormat)}
    </DateHeading>
    {calendarOpen ? <Calendar
        handleChooseDate={handleChooseDate}
        calendarOpen={calendarOpen}
        setCalendarOpen={setCalendarOpen}
        {...props}
    /> : null }
</DateWrapper>

【讨论】:

  • 我正在尝试实施您的解决方案,但不幸的是我仍然遇到同样的问题。还有什么我应该修改的吗?我很想知道为什么这个解决方案有效。是不是因为:当 calendarOpen 评估为 false 时,组件不存在。因此,提供 onClickOutside 功能的 HOC 就没有什么要包装的了?
  • 嗯...你能在日历中添加你提到的相关代码吗?
  • clickOutsideConfig 在哪里使用?
  • 它只是用来包装日历。以为我把它包括在内。更新
猜你喜欢
  • 2021-03-16
  • 1970-01-01
  • 2021-03-22
  • 1970-01-01
  • 2021-08-20
  • 1970-01-01
  • 2022-10-15
  • 1970-01-01
  • 2022-12-06
相关资源
最近更新 更多