javascript - 从反应中的出生日期用户输入值计算年龄
问题描述
我正在尝试获取用户输入的出生日期值并将其转换为等效年龄。
在显示获取的值但未分配给状态变量的控制台中,dob1
执行年龄计算功能受到打击。
整个代码在 stackblitz 中可用,它的链接:https ://stackblitz.com/edit/react-geum6v?file=index.js
HTML
Number of male over certain age: <input type="date" name="date_of_birth" defaultValue= {dob1} onChange={this.handleChange_age}></input> <br /><br />
JS
handleChange_age = (event) => {
console.log("DOB:", event.target.value);
this.setState({ dob1: event.target.value })
console.log(this.state.dob1);
var age_latest = {age_latest: this.calculate_age}
console.log(age_latest);
this.setState({ age1: age_latest })
console.log("Age:", this.state.age1);
}
calculate_age = (dob1) => {
var today = new Date();
var birthDate = new Date(this.state.dob1);
var age_now = today.getFullYear() - birthDate.getFullYear();
var m = today.getMonth() - birthDate.getMonth();
if (m < 0 || (m === 0 && today.getDate() < birthDate.getDate()))
{
age_now--;
}
console.log(age_now);
return age_now;
}
解决方案
首先,setState
本质上是异步的。因此,如果您想让新 setstate
的值做某事,请使用setState 的回调参数。
其次,calculate_age
进行dob
论证。您可以直接在handleChange_age
函数中使用它。
这是修改后的代码。
您的calculate_age
函数使用dob1
参数而不是this.state.dob1
:
calculate_age = (dob1) => {
var today = new Date();
var birthDate = new Date(dob1); // create a date object directly from `dob1` argument
var age_now = today.getFullYear() - birthDate.getFullYear();
var m = today.getMonth() - birthDate.getMonth();
if (m < 0 || (m === 0 && today.getDate() < birthDate.getDate()))
{
age_now--;
}
console.log(age_now);
return age_now;
}
你handleChange_age
现在打电话this.calculate_age
给event.target.value
:
handleChange_age = (event) => {
console.log("DOB:", event.target.value);
this.setState({ dob1: event.target.value }, () => {
// example of setState callback
// this will have the latest this.state.dob1
console.log(this.state.dob1);
})
// call calculate_age with event.target.value
var age_latest = {age_latest: this.calculate_age(event.target.value)}
console.log(age_latest);
this.setState({ age1: age_latest }, () => {
// this will have the latest this.state.age1
console.log("Age:", this.state.age1);
})
}
推荐阅读
- fortran - 使用管道输入编译 Fortran 程序
- javascript - 带有模型复选框的表格,带有检查状态问题
- android - Android 将对象从 App Fragment 传递到模块 Fragment
- ruby-on-rails - 使用 Ruby on Rails 的表单中的多选下拉菜单复制和粘贴 (cmd+c/cmd+v) 功能
- python - 如何 4 路匹配 Excel 中不同工作表中的子集字符串列(Google 表格、Python、R 答案也可以)
- jquery - jQuery img alt 属性末尾带有变量
- git - Gitlab ssh 已启用但不再允许克隆/推送/等
- reactjs - 将 React 门户直接附加到 DOM 节点与分离节点之间的区别?
- java - 生命周期配置未涵盖插件执行 - Linux Maven
- redux - 使用 Redux Store 作为全局状态的 React 组件可重用性问题