javascript - react js中类组件重构为函数组件
问题描述
我现在有类组件我想将它转换为函数组件所以我从重构构造函数开始
这是我的类组件
class EventCalendar extends React.Component {
constructor(props) {
super(props);
this.state = {
today: this.getToday(),
};
}
getToday() {
var today = new Date();
return {
day: today.getDate(),
month: today.getMonth(),
year: today.getFullYear(),
};
}
renderCalendarDays() {
return this.getDaysWithEvents().map((day, index) => {
const isToday = Calendar.interval(day, this.state.today) === 1;
return (
<CalendarDay
day={day}
isToday={isToday}
/>
);
});
}
render() {
return (
{this.renderCalendarDays()}
</div>
);
}
}
这是我从类中重构的功能组件
const EventCalendar =props=> {
const [today, setToday] = useState();
const calendar = new Calendar({siblingMonths: true, });
useEffect(() => {
setToday();
},[])
const setToday =()=>{
var today = new Date();
return {
day: today.getDate(),
month: today.getMonth(),
year: today.getFullYear(),
};
}
const renderCalendarDays = ()=>{
return getDaysWithEvents().map((day, index) => {
const isToday = Calendar.interval(day, today) === 1;
return (
<CalendarDay
day={day}
isToday={isToday}
/>
);
});
}
return (
<div className="flexContainer">
{renderCalendarDays()}
</div>
);
}
不幸的是,我正在努力完成这项工作,有人可以帮助我吗,我在这里做错了什么?
解决方案
你实际上有两种setToday
方法。在useEffect
中,你想调用这样的东西:
useEffect(() => {
...
setToday(createToday());
...
},{})
createToday = () => {
const today = new Date();
return {
day: today.getDate(),
month: today.getMonth(),
year: today.getFullYear(),
};
}
现在,当你调用setToday()
时useEffect
,老实说,我不知道你是在设置状态变量,today
还是null
调用你的辅助方法,返回一个对象,但没有分配它。
此外,请记住useEffect
副作用(因此得名),例如接触服务、执行异步操作等。
您可以跳过useEffect
并createToday
在您的状态定义中运行:
const [today, setToday] = useState(createToday());
我如何做到这一点的一个例子:
const createToday =()=>{
const today = new Date();
return {
day: today.getDate(),
month: today.getMonth(),
year: today.getFullYear(),
};
}
const EventCalendar = (/*no props yet*/)=> {
const [today, setToday] = useState(createToday());
const calendar = new Calendar({siblingMonths: true, });
const renderCalendarDays = () => getDaysWithEvents().map((day, index) => {
const isToday = Calendar.interval(day, today) === 1;
return (
<CalendarDay
day={day}
isToday={isToday}
/>
);
});
}
return (
<div className="flexContainer">
{renderCalendarDays()}
</div>
);
}
推荐阅读
- python - Django:每次我开发我的 django 应用程序时都必须打开虚拟环境吗
- python - Python & Selenium:遍历 WebElements 错误列表:StaleElementReferenceException
- python - 根据列表中的值过滤 pyspark 数据框
- java - Tess4J:结果字符串无法解析为 int
- .net-core - .NET Web API 从控制器名称中剥离斜杠 - 如何禁用该行为?
- python - jinja2.exceptions.UndefinedError:没有称为“脚本”的父块
- android - 如何在 webview 中有效地显示没有网络
- spring - 如果用户未在 Spring Security 中进行身份验证,如何将用户扔到 /login 以外的页面
- jsf - 在 IntelliJ 上的 Facelets 文件中调试表达式语言 (EL)
- node.js - 推荐杀死 VS Code Extension 的子进程的方法