javascript - 如何使用 reducer 和处理事件从事件数组中更新事件?

标签 javascript reactjs redux fullcalendar slice

我正在使用 fullcalendar显示我的 React 应用程序中的所有事件。

理想情况下,prevnext 事件处理程序应该重新呈现事件。

这是我的代码。

calender_slice.js

const slice = createSlice({
  name: 'calendar',
  initialState,
  reducers: {
    getEvents(state, action) {
      const { timecards } = action.payload;

      const timecard_events = timecards.map(timecard => {
        return {
          title: `${timecard.first_name} ${timecard.last_name}(${timecard.role})`,
          start: timecard.clock_in,
          end: timecard.clock_out,
          color: '#'+Math.floor(Math.random()*16777215).toString(16)
        }
      })

      state.events = [...timecard_events];

      state.isLoading = false;
    },
    ...
export const getEvents = (
  start_date = moment().startOf('month').toString(),
  end_date = moment().toString()
) => async (dispatch) => {
  dispatch(slice.actions.setLoading(true));

    const res = await axios.post(`${backend}/timecards`, {
      start_date,
      end_date
    })

    dispatch(slice.actions.getEvents({timecards: res.data.timecards}));
};

calendar_view.js

const CalendarView = () => {
    const calendarRef = useRef(null);
    const dispatch = useDispatch();
    const { events, isModalOpen, selectedRange, isLoading } = useSelector((state) => state.calendar);

    const handleDatePrev = async () => {
      const calendarEl = calendarRef.current;

      if (calendarEl) {
        const start_date = moment(calendarEl.props.defaultDate).subtract(1, 'month').startOf('month').format();
        const end_date = moment(calendarEl.props.defaultDate).subtract(1, 'month').endOf('month').format();
        const calendarApi = calendarEl.getApi();

        try {
          await dispatch(getEvents(true, start_date, end_date));
        } catch (err) {
          console.error(err);
        }

        calendarApi.prev();
        setDate(calendarApi.getDate());
      }
    };

  return (<Container maxWidth={false}>
          <Header onAddClick={handleAddClick} />
          <Toolbar
            date={date}
            onDateNext={handleDateNext}
            onDatePrev={handleDatePrev}
            onDateToday={handleDateToday}
            onViewChange={handleViewChange}
            view={view}
          />
          <Paper className={classes.calendar}>
            <FullCalendar
              allDayMaintainDuration
              defaultDate={date}
              defaultView={view}
              eventResizableFromStart
              eventResize={handleEventResize}
              events={events}
              header={false}
              height={800}
              ref={calendarRef}
              rerenderDelay={10}
              weekends
              plugins={[
                dayGridPlugin,
                timeGridPlugin,
                interactionPlugin,
                listPlugin,
                timelinePlugin
              ]}
            />
          </Paper>
        </Container>
  )
}

这段代码工作正常并且每次都正确地调度事件,但是 fullcalendar 没有显示更新的事件数组。

我想知道我应该得到什么值作为当前日期。

最佳答案

可能是因为状态的突变。 在 reducer 中,你应该返回一个新状态(而不是改变旧状态)。 请参阅:https://redux.js.org/tutorials/fundamentals/part-3-state-actions-reducers#rules-of-reducersgetEvents 更改为:

getEvents(state, action) {
  const { timecards } = action.payload;

  const timecard_events = timecards.map(timecard => {
    return {
      title: `${timecard.first_name} ${timecard.last_name}(${timecard.role})`,
      start: timecard.clock_in,
      end: timecard.clock_out,
      color: '#'+Math.floor(Math.random()*16777215).toString(16)
    }
  })

  return {
    ...state,
    events: [...timecard_events],
    isLoading: false,
  }
},

关于javascript - 如何使用 reducer 和处理事件从事件数组中更新事件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65282257/

相关文章:

javascript - Bootstrap 3.1.1 警报不解除

javascript - 原型(prototype) JS : Selecting an element by its value?

javascript - 浏览器端 CSS 抽象语法树生成器。 (JavaScript 但不是 Node)

javascript - 如何从元素中删除定义的文本字符?

reactjs - 如何获取 PanResponder 相对于父 View 的当前触摸坐标?

javascript - React : TypeError: this. props.courses.map 不是一个函数

javascript - 如何在不使用扩展运算符的情况下更改 Redux 状态的子切片

android - 带有 React Native 的 Google map 面板

javascript - 将鼠标悬停在没有包装器的样式组件上

reactjs - 在 "store"的上下文或 props 中找不到 "Connect(App)"。我已经有一个 <Provider> 包装组件