折腾:
期间,去试试:
貌似好看些。
去试试:
wangzuo/input-moment: React datetime picker powered by momentjs
<code>➜ ucowsapp_h5_pure_web git:(pure_web) ✗ npm i input-moment --save npm WARN [email protected] requires a peer of react@^0.14.9 but none is installed. You must install peer dependencies yourself. npm WARN [email protected] requires a peer of react-dom@^15.5.0 but none is installed. You must install peer dependencies yourself. npm WARN [email protected] requires a peer of react-dom@^15.0.0 but none is installed. You must install peer dependencies yourself. npm WARN [email protected] requires a peer of moment@^2.10.6 but none is installed. You must install peer dependencies yourself. npm WARN [email protected] requires a peer of react-dom@^15.0.0 || ^16.0.0 but none is installed. You must install peer dependencies yourself. npm WARN [email protected] requires a peer of react-dom@^15.0.0 || ^16.0.0 but none is installed. You must install peer dependencies yourself. npm WARN [email protected] No repository field. npm WARN [email protected] No license field. + [email protected] added 3 packages in 9.473s </code>
发现运行出错,先去安装:moment:
<code>npm i moment --save </code>
再去试试
结果参考了:
https://github.com/wangzuo/input-moment/blob/master/example/app.js
去写了代码后,显示异常和错乱:
貌似还需要自己准备弹框,把日期选择的放进去?
对于:
input-moment
参考:
https://github.com/wangzuo/input-moment/blob/master/example/app.js
的
import ‘../src/less/input-moment.less’;
去添加css
<code>import moment from 'moment'; import InputMoment from 'input-moment'; import 'input-moment/dist/input-moment.css'; </code>
可以显示出来了:
很明显,大小需要调整,也需要确定是否显示
然后继续调试,效果是:
还是显示不完整。
后来调整了之前的页面的显示区域的高度后:
<code>// src/components/base-modal/style.less .modal_overlay { position: fixed; top: 0; left: 0; bottom:0; z-index: 1000; background-color:rgba(11,11,11,0.4); width: 100%; .modal { position: fixed; // top: calc(~"100% - 260px"); top: calc(~"100% - 480px"); left: 0; bottom: 0; right: 0; z-index: 1001; background-color: #fff; width: 100%; // height: 260px; height: 480px; } } // /src/components/popup/style.less .ui_popup_content { // height: 216px; height: 480px; background: white; width: 100%; overflow: hidden; -webkit-overflow-scrolling : touch; } .m-input-moment { width: 100% !important; } </code>
是可以显示了:
最后是:
<code> import { Popup } from 'react-weui'; import moment from 'moment'; import InputMoment from 'input-moment'; import 'input-moment/dist/input-moment.css'; onSelectTimeChange(curSelectedMonment) { console.log("onSelectTimeChange, curSelectedMonment=", curSelectedMonment); this.setState({ curMoment: curSelectedMonment}); } onConfirmSelectTime() { console.log("onConfirmSelectTime"); console.log('saved', this.state.curMoment.format('llll')); console.log(this.state.curMoment); console.log(this.state.selected_time); this.setState({ selected_time: this.state.curMoment}); } onCancelPopup() { console.log("onCancelPopup"); this.setState({ isSelectTimeVisible: false }); } onConfirmPopup(selectedTime) { console.log("onConfirmPopup, selectedTime=", selectedTime); this.setState({ isSelectTimeVisible: false, selected_time: selectedTime }); } toggleSelectTime(){ console.log(`toggleSelectTime: this.state.isSelectTimeVisible=${this.state.isSelectTimeVisible}`); this.setState({ isSelectTimeVisible: !this.state.isSelectTimeVisible }); } <ul><span>时间</span> <li> {/* <DateSelector value={this.state.selected_time} onConfirm={this.onConfirmSwitchTime} /> */} <input readonly onClick={this.toggleSelectTime} value={this.state.selected_time} /> {/* <DateTime open input={false} /> */} {/* <DateTimeField dateTime={"1990-06-05"} format={"YYYY-MM-DD"} viewMode={"date"} inputFormat={"DD/MM/YYYY"} onChange={this.handleDateTimeFieldChange} /> */} </li> <i/> </ul> <Popup show={this.state.isSelectTimeVisible} onRequestClose={this.onCancelPopup} > <InputMoment moment={this.state.curMoment} onChange={this.onSelectTimeChange} onSave={this.onConfirmSelectTime} minStep={1} // default hourStep={1} // default prevMonthIcon="ion-ios-arrow-left" // default nextMonthIcon="ion-ios-arrow-right" // default /> </Popup> </code>
加上额外的css:
/src/style/variables.less
<code>/********************************************* for react-weui Popup *********************************************/ .m-input-moment { width: 100% !important; // width: 150px !important; // width: 375px !important; } </code>
才使得最终可以正常显示,居中显示的:
但是还是icon图标无法显示,所以再去解决图标问题:
【已解决】react中input-moment的icon图标ion-ios-arrow-left无法显示
【总结】
最终用如下代码:
js:
<code>import { h, Component } from 'preact'; import { route, Link } from 'preact-router'; import autoBind from 'react-autobind'; import { connect } from 'preact-redux'; import { bindActions } from '../../../store/util'; import reducer from '../../../store/reducers'; import * as actions from '../../../store/actions'; import style from './style.less'; import Button from '../../../components/button'; import { ROUTE_PREFIX } from "../../../common/define"; // import DateSelector from 'components/date-selector'; import { datetimeToStr, strToDatetime } from "lib/datetime"; import moment from 'moment'; import InputMoment from 'input-moment'; import 'input-moment/dist/input-moment.css'; // import Popup from 'components/popup'; // import DateTime from 'react-datetime'; // require('react-datetime'); // import 'react-datetime/css/react-datetime.css'; // import DateTimeField from 'react-bootstrap-datetimepicker'; // import weui from 'weui.js'; import { Popup } from 'react-weui'; //CowActivity Initial Invalid const CAInitialInvalid = { cow_code : "", start_time: null, end_time: null, selected_time : null }; @connect(reducer, bindActions(actions)) export default class CowActivity extends Component { state = { cow_code : CAInitialInvalid.cow_code, start_time : CAInitialInvalid.start_time, end_time : CAInitialInvalid.end_time, isSelectTimeVisible: false, selected_time : CAInitialInvalid.selected_time, curMoment: moment() }; constructor(props) { super(props); autoBind(this); this.onSelectTimeChange = this.onSelectTimeChange.bind(this); this.onConfirmSelectTime = this.onConfirmSelectTime.bind(this); this.onCancelPopup = this.onCancelPopup.bind(this); // this.onConfirmPopup = this.onConfirmPopup.bind(this); this.toggleSelectTime = this.toggleSelectTime.bind(this); console.log(`this.props.cow_code=${this.props.cow_code}`); this.state.cow_code = this.props.cow_code; } ... onSelectTimeChange(curSelectedMonment) { console.log("onSelectTimeChange, curSelectedMonment=", curSelectedMonment); this.setState({ curMoment: curSelectedMonment}); } onConfirmSelectTime() { console.log("onConfirmSelectTime"); // console.log(this.state.curMoment); // console.log('saved', this.state.curMoment.format('llll')); // console.log(`before select: this.state.selected_time=${this.state.selected_time}`); // console.log(`curMoment instanceof moment=${this.state.curMoment instanceof moment}`); // console.log(`selected_time instanceof Date=${this.state.selected_time instanceof Date}`); // console.log(`selected_time instanceof moment=${this.state.selected_time instanceof moment}`); console.log(`previous selected_time=${this.state.selected_time}`); let convertedDate = this.state.curMoment.toDate(); // console.log(`convertedDate instanceof Date=${convertedDate instanceof Date}`); this.setState({ isSelectTimeVisible: false, selected_time: convertedDate }); // console.log(`after select: this.state.selected_time=${this.state.selected_time}`); // console.log(`curMoment instanceof moment=${this.state.curMoment instanceof moment}`); // console.log(`selected_time instanceof Date=${this.state.selected_time instanceof Date}`); // console.log(`selected_time instanceof moment=${this.state.selected_time instanceof moment}`); console.log(`current selected_time=${this.state.selected_time}`); } onCancelPopup() { console.log("onCancelPopup"); this.setState({ isSelectTimeVisible: false }); } // onConfirmPopup(selectedTime) { // console.log("onConfirmPopup, selectedTime=", selectedTime); // this.setState({ // isSelectTimeVisible: false, // selected_time: selectedTime // }); // } toggleSelectTime(){ console.log(`toggleSelectTime: this.state.isSelectTimeVisible=${this.state.isSelectTimeVisible}`); this.setState({ isSelectTimeVisible: !this.state.isSelectTimeVisible }); } // handleDateTimeFieldChange = (newDate) => { // console.log("handleDateTimeFieldChange: newDate", newDate); // // return this.setState({date: newDate}); // } render() { return ( <div class={style.content_div}> <div class={style.cows_n_box}> <Link href={`${ROUTE_PREFIX.COW_SEARCH}/cowActivity`}> <ul><span>牛号</span> <li> <input value={this.state.cow_code} class={style.ui_input} placeholder="请填写牛号" readonly /> </li> <i/> </ul> </Link> <ul><span>时间</span> <li> {/* <DateSelector value={this.state.selected_time} onConfirm={this.onConfirmSwitchTime} /> */} <input value={datetimeToStr(this.state.selected_time, "无", "yyyy-MM-dd HH:mm")} class={style.ui_input} onClick={this.toggleSelectTime} readonly /> {/* <DateTime open input={false} /> */} {/* <DateTimeField dateTime={"1990-06-05"} format={"YYYY-MM-DD"} viewMode={"date"} inputFormat={"DD/MM/YYYY"} onChange={this.handleDateTimeFieldChange} /> */} </li> <i/> </ul> </div> <Button title={"查询"} onClick={this.handleQuery} /> {/* <div> <Popup onCancel={this.onCancelPopup.bind(this)} onConfirm={this.onConfirmPopup.bind(this)} centerTitle={"选择时间"} visible={this.state.isSelectTimeVisible}> <InputMoment moment={this.state.curMoment} onChange={this.onSelectTimeChange} onSave={this.onConfirmSelectTime} minStep={1} // default hourStep={1} // default prevMonthIcon="ion-ios-arrow-left" // default nextMonthIcon="ion-ios-arrow-right" // default /> </Popup> </div> */} {/* <div class={style.select_time_popup}> */} <Popup show={this.state.isSelectTimeVisible} onRequestClose={this.onCancelPopup} > <InputMoment moment={this.state.curMoment} onChange={this.onSelectTimeChange} onSave={this.onConfirmSelectTime} minStep={1} // default hourStep={1} // default prevMonthIcon="ion-ios-arrow-left" // default nextMonthIcon="ion-ios-arrow-right" // default /> </Popup> {/* </div> */} </div> ); } } </code>
css:
<code> /********************************************* for react-weui Popup *********************************************/ .m-input-moment { width: 100% !important; // width: 150px !important; // width: 375px !important; } /********************************************* for input-moment using icon from http://ionicons.com *********************************************/ // .ion-ios-arrow-right { button.next-month { background: url("@{env-prefix}/assets/ios7-arrow-right-30x30.png") no-repeat !important; } button.prev-month { background: url("@{env-prefix}/assets/ios7-arrow-left-30x30.png") no-repeat !important; } .m-calendar .toolbar button{ background-color: #1385e5 !important; } </code>
实现了,弹框选择日期:
转载请注明:在路上 » 【记录】Preact中集成日期时间选择器:input-moment