#javascript #reactjs
#javascript #reactjs
Вопрос:
В настоящее время я работаю над приложением, в котором я пытаюсь создать календарь с помощью javascript. Основываясь на текущей дате, я могу нажать кнопку «Назад» и вернуться назад на столько месяцев, сколько захочу, и выбрать дни в каждом месяце. Я также могу нажать кнопку «Вперед» и перейти на столько месяцев вперед, сколько захочу. Проблема, с которой я сталкиваюсь, заключается в том, что если я вернусь, скажем, к октябрю 2020 года, и нажму кнопку «Вперед», календарь начнется с января 2021 года, потому что я использую циклические месяцы на основе текущей даты, а не дат, в которых я сейчас нахожусь. Чего я хотел бы добиться, так это того, что если я окажусь в октябре 2020 года и нажму кнопку «Вперед», то мне бы хотелось, чтобы это произошло в ноябре 2020 года. Любые предложения приветствуются.
мой код выглядит следующим образом:
import React, { useState } from "react";
import "./styles.css";
export default function App() {
const [count, setCount] = useState(1);
const [countTwo, setCountTwo] = useState(1);
const [dates, setDates]=useState(null)
const getDaysArray = async (s, e) => {
let a = [];
for (let d = new Date(s); d <= e; d.setDate(d.getDate() 1)) {
a.push(new Date(d).toString());
}
return a;
};
const prevMonth = async () => {
setCount((state) => state 1);
let d = new Date();
d.setMonth(d.getMonth() - count);
let firstDay = new Date(d.getFullYear(), d.getMonth(), 1);
let lastDay = new Date(firstDay.getFullYear(), firstDay.getMonth() 1, 0);
const dates = await getDaysArray(firstDay, lastDay);
setDates(dates);
};
const nextMonth = async () => {
setCountTwo((state) => state 1);
let d = new Date();
d.setMonth(d.getMonth() countTwo);
let firstDay = new Date(d.getFullYear(), d.getMonth(), 1);
let lastDay = new Date(firstDay.getFullYear(), firstDay.getMonth() 1, 0);
const dates = await getDaysArray(firstDay, lastDay);
setDates(dates);
};
return (
<div className="App">
<button onClick={prevMonth}>Prev Month</button>
<button onClick={nextMonth}>Next Month</button>
{dates amp;amp;
dates.map((item, i) => {
return <div key={i}>{item}</div>;
})}
</div>
);
}
вот ручка с кодом для отладки! https://codesandbox.io/s/sweet-brook-y2n7p?file=/src/App.js:0-1413
Комментарии:
1. Вместо того, чтобы использовать
count
иcountTwo
для хранения текущего месяца в состоянии, используйтеDate()
объект для хранения текущей даты.2. не могли бы вы показать, как это сделать
Ответ №1:
Вместо отслеживания текущей даты используйте счетчик для отслеживания номера текущего месяца. Затем вычтите или добавьте единицу к этому числу для предыдущего или следующего. И укажите месяц, используя это число.
Вот ответвление вашего проекта с этим решением:
https://codesandbox.io/s/clever-rgb-mryst
И код:
import React, { useState } from "react";
import "./styles.css";
export default function App() {
const [visibleMonth, setVisibleMonth] = useState(new Date().getMonth());
// const [countTwo, setCountTwo] = useState(1);
const [dates, setDates] = useState(null);
const getDaysArray = async (s, e) => {
let a = [];
for (let d = new Date(s); d <= e; d.setDate(d.getDate() 1)) {
a.push(new Date(d).toString());
}
return a;
};
const prevMonth = async () => {
let d = new Date();
d.setMonth(visibleMonth - 1);
setVisibleMonth((state) => visibleMonth - 1);
let firstDay = new Date(d.getFullYear(), d.getMonth(), 1);
let lastDay = new Date(firstDay.getFullYear(), firstDay.getMonth() 1, 0);
const dates = await getDaysArray(firstDay, lastDay);
setDates(dates);
};
const nextMonth = async () => {
let d = new Date();
d.setMonth(visibleMonth 1);
setVisibleMonth((state) => visibleMonth 1);
let firstDay = new Date(d.getFullYear(), d.getMonth(), 1);
let lastDay = new Date(firstDay.getFullYear(), firstDay.getMonth() 1, 0);
const dates = await getDaysArray(firstDay, lastDay);
setDates(dates);
};
return (
<div className="App">
<button onClick={prevMonth}>Prev Month</button>
<button onClick={nextMonth}>Next Month</button>
{dates amp;amp;
dates.map((item, i) => {
return <div key={i}>{item}</div>;
})}
</div>
);
}
Комментарии:
1. привет, Рэнди, отправленный вами код, похоже, является исходным кодом
2. Это: » Проблема, с которой я сталкиваюсь, заключается в том, что если я вернусь, скажем, к октябрю 2020 года, и нажму кнопку «Вперед», календарь начнется с января 2021 года» — не встречается в моей вилке. В моем форке этот сценарий приводит к ноябрю 2020 года. Пожалуйста, убедитесь, что вы смотрите на мой форк.
3. ах, я вижу это сейчас, проблема, которую я замечаю, заключается в том, что когда я нажимаю предыдущую кнопку, она начинается с января 2020 года, а затем переходит к декабрю 2019 года
4. Я бы хотел, чтобы это началось в декабре 2020 года и продолжалось до ноября 2020 года и так далее и тому подобное
5. Рад помочь! Получайте удовольствие от этого материала.