calc-oa-lib
Version:
calc oa library
167 lines (144 loc) • 4.66 kB
JSX
import PropTypes from "prop-types";
import React from "react";
import $calc from "../../utils/common";
import styleObj from "./index.module.scss";
import { Select } from "zent";
// import Select from "zent/lib/select";
export default class CalcSelect extends React.Component {
// #region 属性 & 构造函数
static propTypes = {
lv: PropTypes.number,
customClass: PropTypes.string,
width: PropTypes.string,
height: PropTypes.string,
showErrorTip: PropTypes.bool,
errorTip: PropTypes.string,
// onChangeEvent: PropTypes.func,
};
static defaultProps = {
lv: 7,
customClass: "custom-calc-select",
width: "",
height: "40px",
showErrorTip: false,
errorTip: "",
// onChangeEvent: (e, optObj) => {
// },
};
constructor(props) {
super(props);
// console.log(`props`, props);
this.state = {
// popupOpen: false,
};
}
// get popupOpenClass() {
// const _self = this;
// let className = _self.state.popupOpen ? "active" : "";
// console.log(`popupOpenClass`, className);
// return className;
// }
// #endregion
//#region hooks
render() {
const _self = this;
const {
lv,
customClass,
width,
height,
onChangeEvent,
showErrorTip,
errorTip,
...otherProps
} = _self.props;
// console.log(`otherProps`, otherProps);
return (
<div className={`${styleObj["calc-select-scoped"]}`}>
<div
className={`calc-select ${customClass}`}
style={_self.getStyleObj()}
>
<Select
popupClassName="calc-select-popup"
{...otherProps}
// onChange={(e, optObj) => {
// _self.setState(
// {
// popupOpen: false,
// },
// () => {
// onChangeEvent && onChangeEvent(e, optObj);
// }
// );
// }}
// onOpen={() => {
// _self.setState(
// {
// popupOpen: true,
// },
// () => {}
// );
// }}
></Select>
{/* <i className={`calc-select-icon-dropdown icon-btn calc-oa-dropdownarrow ${_self.popupOpenClass}`}></i> */}
<i
className={`calc-select-icon-dropdown icon-btn calc-oa-dropdownarrow`}
></i>
{showErrorTip && !$calc.tool.isNullOrEmpty(errorTip) && (
<div className="error-tip-wrap">
<span className="tip-text" title={errorTip}>
{errorTip}
</span>
</div>
)}
</div>
</div>
);
}
componentDidMount() {
// console.log(`calc-select componentDidMount...`);
}
shouldComponentUpdate(nextProps, nextState) {
const _self = this;
// 若子组件无属性变化及状态更新, 则无需更新组件
// Immutable验证的效果不好, 用回JSON.stringify来处理, 排除掉循环引用的属性, 如插槽
const removeProps = ["children"];
const nextPropsClone = $calc.tool.deepClone(nextProps, removeProps);
const curPropsClone = $calc.tool.deepClone(_self.props, removeProps);
const nextStateClone = $calc.tool.deepClone(nextState, removeProps);
const curnextStateClone = $calc.tool.deepClone(_self.state, removeProps);
const needRender =
JSON.stringify(nextPropsClone) != JSON.stringify(curPropsClone) ||
JSON.stringify(nextStateClone) != JSON.stringify(curnextStateClone);
// console.log("calc-select shouldComponentUpdate...", needRender);
if (needRender) {
return true;
}
return false;
}
getSnapshotBeforeUpdate(prevProps, prevState) {}
componentDidUpdate(prevProps, prevState) {}
componentWillUnmount() {}
//#endregion
//#region methods
// 获取样式对象
getStyleObj() {
const _self = this;
let styleObj = {};
const { width, height } = _self.props;
// 设置width
if (!$calc.tool.isNullOrEmpty(width)) {
styleObj["width"] = $calc.tool.isNum(width) ? `${width}px` : width;
}
// 设置height
if (!$calc.tool.isNullOrEmpty(height)) {
styleObj["height"] = $calc.tool.isNum(height)
? `${height}px`
: (styleObj["height"] = height);
}
// console.log(`styleObj`, styleObj);
return styleObj;
}
//#endregion
}