react+antd的项目。
没有使用Form表单,只是单独使用了DatePicker组件,前期想的是,根据接口返回的日期数据,如果有值就将DatePicker的defaultValue的值设置为接口的数据,否则的话展示当前日期,我在DatePicker标签内使用了三元判断:
const [Info,setInfo] = useState({});
<DatePicker defaultValue={Info.time === null ? moment() : Info.time } format="YYYY-MM-DD" />
此时接口返回的time就是null,但是并没有按预期显示当前日期,DatePicker内是空的,然后我将三元调换了:
<DatePicker defaultValue={Info.time !== null ? Info.time : moment() } format="YYYY-MM-DD" />
这样写展示了当前的日期。
然后看了一下页面效果,DatePicker的defaultValue是在页面加载出现该标签之后就会赋上的一个默认值,根本不会等待接口调用完然后根据接口返回的值去赋默认值,也不会在Info改变了的时候重新赋值。
所以第一种写法的三元并没有获取到time值,运算的结果也是undefained,但是第二种三元,当它获取不到time的时候,它走了三元的else,能够赋值为当前日期。
解决办法
因为对于我目前的这个需求来说,没有要求固定设置一个默认日期,我就干脆不设置defaultValue,直接设置value,value在Info改变的时候也会随着改变
<DatePicker defaultValue={Info.time !== null ? Info.time : moment() } onChange={changeTime} format="YYYY-MM-DD" />
给DatePicker加一个onChange事件,这样在改变DatePicker的值时候可以联动
//附上一个模拟的接口请求
//已经是封装好的接口请求
http.get(url.XXX接口地址).then(res => {
setInfo(res.data)
})
//选择送照日期
const changeTime = (date, dateString) => {
//如果Info里面还存了其他的值,就用Object.assign来修改Info对象中的指定值
setInfo(Object.assign( {}, Info, { time:moment(dateString) } ))
}
这样既解决了接口请求完之后,根据接口的值展示时间的问题,也能在页面中选择DatePicker的值的时候实现联动。
如有其它更好的办法,可指教。