antd3.0后的某個版本后終於支持了只選擇年份的設置。當時2.x版本的時候還不支持只選擇年份,我們項目中有這個只選擇年份的需求,為了ui風格的一致,只好自己擼了一個。
如今真是普天同慶!😄😄
然而,事情並沒有這么簡單。
import React, { Component } from 'react'; import { DatePicker } from 'antd'; export default class extends Component { onChange = val => { console.log(val) } render() { return ( <div> <DatePicker mode="year" onChange={this.onChange}/> </div> ); } }
當你按照這段代碼,打開界面你發現,nice!真的出現了只有年份的界面!❤️❤️
然后,下一秒你就該吐血了。因為你發現你點擊選擇任何一個按鈕都不會有反應,onChange事件不會觸發!你根本拿不到時間對象!
氣不氣?👹👹
百思不得其解,然后去翻看ant design的github issue。終於看到一條中肯的comment。
https://github.com/ant-design/ant-design/issues/10242#issuecomment-393055938
<DatePicker mode="year" onPanelChange={(v) => {console.log(v)}}/>
只需要把onChange換成onPanelChange就好了。大功告成!你可以愉快的獲取時間了。
然而,你還發現一個問題,時間雖然是獲取了,但是面板並沒有關閉。😠😠
繼續查找問題,發現需要open這個屬性控制面板的關閉,這個大概是antd團隊沒考慮到?🤔️🤔️
解決辦法如下:
import React, { Component } from 'react'; import { DatePicker } from 'antd'; export default class extends Component { state = { isopen: false, time: null } render() { return ( <div> <DatePicker value={this.state.time} open={this.state.isopen} mode="year" format="YYYY" onFocus={() => {this.setState({isopen: true})}} onBlur={() => {this.setState({isopen: false})}} onPanelChange={(v) => { console.log(v) this.setState({ time: v, isopen: false }) }}/> </div> ); } }
添加了open的控制才真的搞定了!🎉🎉🎉
2019-05-31追加內容>>>>>>
然而,快樂的時光總是短暫,很快,測試便提出問題。”好像你這個點擊選擇年份后面板會閃開閃關哦,不符合要求哈“
“😂,哦,那我再看看呢”
還真的有這個問題,但是我記得之前不會閃啊。
算了,繼續查找問題,發現一個方法onOpenChange,文檔描述:彈出日歷和關閉日歷的回調,function(status){}
於是通過這個方法,判斷當前的操作是要面板打開還是關閉,然后來控制面板的顯示關閉。
import React, { Component } from 'react'; import { DatePicker } from 'antd'; export default class extends Component { state = { isopen: false, time: null } handlePanelChange = (value) => { console.log(">>>>>", value) this.setState({ time: value, isopen: false }) } handleOpenChange = (status) => { // console.log(status) if(status){ this.setState({isopen: true}) } else { this.setState({isopen: false}) } } clearValue = () => { this.setState({ time: null }) } render() { return ( <div> <DatePicker value={this.state.time} open={this.state.isopen} mode="year" placeholder='請選擇年份' format="YYYY" onOpenChange={this.handleOpenChange} onPanelChange={this.handlePanelChange} onChange={this.clearValue} /> </div> ); } }
從代碼可以看到,handleOpenChange便可以控制面板的開關,並且不會閃了。
細心的你可能還發現我在onChange的時候綁定了一個clearValue函數。誒?這是為什么呢?
我們都知道,DatePicker有個屬性是allowClear,默認為true。表示,可以通過輸入框中的❎圖標清除輸入框中的值。
但是,現在點擊這個清除icon卻沒有任何反應,值並不會被清除掉。
難不難受?😂
然后,我突然想到,這個清除會不會觸發onChange事件呢?
很明顯,選擇值的時候不會觸發onChange事件,但是點擊清除icon時觸發了!
於是通過onChange事件我可以愉快的清除值了~~
完美解決問題 😝