gui-one-nutui-react-taro
Version:
京东风格的轻量级移动端 React 组件库,支持一套代码生成 H5 和小程序
250 lines (248 loc) • 10.1 kB
JavaScript
import _toConsumableArray from "@babel/runtime/helpers/toConsumableArray";
import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
import _objectWithoutProperties from "@babel/runtime/helpers/objectWithoutProperties";
import _defineProperty from "@babel/runtime/helpers/defineProperty";
var _excluded = ["className", "disabled", "onChange", "checkedValue", "max", "options"],
_excluded2 = ["label", "value", "disabled", "onChange"],
_excluded3 = ["iconName", "iconSize", "label", "className", "textPosition", "iconActiveName", "checked", "disabled", "onChange", "indeterminate", "iconClassPrefix", "iconFontClassName", "iconIndeterminateName", "getParentVals", "max"];
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
import React__default, { useState, useImperativeHandle, useEffect, useCallback } from 'react';
import { I as Icon } from './icon.taro-1d0d4fb7.js';
import { c as cn } from './bem-893ad28d.js';
import { C as ComponentDefaults } from './typings-1c5f2628.js';
var defaultProps$1 = {
disabled: false,
checkedValue: [],
max: undefined,
onChange: function onChange(value) {},
options: []
};
var CheckboxGroup = React__default.forwardRef(function (props, ref) {
var _defaultProps$1$props = _objectSpread(_objectSpread({}, defaultProps$1), props),
children = _defaultProps$1$props.children;
var b = cn('checkboxgroup');
var className = props.className,
disabled = props.disabled,
onChange = props.onChange,
checkedValue = props.checkedValue,
max = props.max,
options = props.options,
rest = _objectWithoutProperties(props, _excluded);
var _useState = useState(disabled),
_useState2 = _slicedToArray(_useState, 2),
innerDisabled = _useState2[0],
setInnerDisabled = _useState2[1];
var _useState3 = useState(checkedValue),
_useState4 = _slicedToArray(_useState3, 2),
innerValue = _useState4[0],
setInnerValue = _useState4[1];
useImperativeHandle(ref, function () {
return {
toggleAll: function toggleAll(state) {
if (state === false) {
setInnerValue([]);
} else {
var childrenLabel = [];
React__default.Children.map(children, function (child) {
var childProps = child.props;
childrenLabel.push(childProps.label || child.children);
});
setInnerValue(childrenLabel);
}
},
toggleReverse: function toggleReverse() {
var childrenLabel = [];
React__default.Children.map(children, function (child) {
var childProps = child.props;
childrenLabel.push(childProps.label || child.children);
});
var reverse = childrenLabel.filter(function (c) {
return (innerValue === null || innerValue === void 0 ? void 0 : innerValue.findIndex(function (v) {
return v === c;
})) === -1;
});
setInnerValue(reverse);
}
};
});
useEffect(function () {
setInnerDisabled(disabled);
setInnerValue(checkedValue);
}, [disabled, checkedValue]);
function handleChildChange(state, label) {
if (max !== undefined && innerValue && innerValue.length > max) return;
if (innerValue) {
var clippedValue = [];
if (state) {
clippedValue = [].concat(_toConsumableArray(innerValue), [label]);
} else {
innerValue === null || innerValue === void 0 ? void 0 : innerValue.splice(innerValue === null || innerValue === void 0 ? void 0 : innerValue.indexOf(label), 1);
clippedValue = _toConsumableArray(innerValue);
}
setInnerValue(clippedValue);
onChange && onChange(clippedValue);
}
}
function validateChildChecked(child) {
if (!innerValue) return false;
return (innerValue === null || innerValue === void 0 ? void 0 : innerValue.indexOf(child.props.label || child.children)) > -1;
}
function validateChecked(value) {
if (innerValue === null) return false;
return innerValue === value;
}
function getParentVals() {
return innerValue;
}
function cloneChildren() {
return React__default.Children.map(children, function (child) {
var childChecked = validateChildChecked(child);
if (child.type.displayName !== 'NutCheckBox') {
return React__default.cloneElement(child);
}
return React__default.cloneElement(child, {
disabled: innerDisabled,
checked: childChecked,
onChange: handleChildChange,
getParentVals: getParentVals,
max: max
});
});
}
var renderOptionsChildren = useCallback(function () {
return options === null || options === void 0 ? void 0 : options.map(function (_ref) {
var label = _ref.label,
value = _ref.value,
disabled = _ref.disabled,
onChange = _ref.onChange,
rest = _objectWithoutProperties(_ref, _excluded2);
var childChecked = validateChecked(value);
return React__default.createElement(Checkbox, _objectSpread(_objectSpread({
key: value === null || value === void 0 ? void 0 : value.toString(),
children: label,
label: value,
disabled: innerDisabled ? true : disabled,
onChange: handleChildChange
}, rest), {}, {
max: max,
getParentVals: getParentVals,
checked: childChecked
}));
});
}, [innerValue, options]);
return React__default.createElement("div", _objectSpread({
className: "".concat(b(), " ").concat(className || '')
}, rest), options !== null && options !== void 0 && options.length ? renderOptionsChildren() : cloneChildren());
});
CheckboxGroup.defaultProps = defaultProps$1;
CheckboxGroup.displayName = 'NutCheckboxGroup';
var defaultProps = _objectSpread(_objectSpread({}, ComponentDefaults), {}, {
checked: false,
disabled: false,
textPosition: 'right',
iconSize: 18,
iconName: 'check-normal',
iconActiveName: 'checked',
iconClassPrefix: 'nut-icon',
iconFontClassName: 'nutui-iconfont',
iconIndeterminateName: 'check-disabled',
onChange: function onChange(state, label) {}
});
var Checkbox = function Checkbox(props) {
var _defaultProps$props = _objectSpread(_objectSpread({}, defaultProps), props),
children = _defaultProps$props.children;
var b = cn('checkbox');
var iconName = props.iconName,
iconSize = props.iconSize,
label = props.label,
className = props.className,
textPosition = props.textPosition,
iconActiveName = props.iconActiveName,
checked = props.checked,
disabled = props.disabled,
onChange = props.onChange,
indeterminate = props.indeterminate,
iconClassPrefix = props.iconClassPrefix,
iconFontClassName = props.iconFontClassName,
iconIndeterminateName = props.iconIndeterminateName,
getParentVals = props.getParentVals,
max = props.max,
rest = _objectWithoutProperties(props, _excluded3);
var _useState5 = useState(checked),
_useState6 = _slicedToArray(_useState5, 2),
innerChecked = _useState6[0],
setInnerChecked = _useState6[1];
var _useState7 = useState(disabled),
_useState8 = _slicedToArray(_useState7, 2),
innerDisabled = _useState8[0],
setDisabled = _useState8[1];
var _useState9 = useState(indeterminate),
_useState10 = _slicedToArray(_useState9, 2),
_indeterminate = _useState10[0],
setIndeterminate = _useState10[1];
useEffect(function () {
setInnerChecked(checked);
setDisabled(disabled);
}, [disabled, checked]);
useEffect(function () {
setIndeterminate(indeterminate);
}, [indeterminate]);
var getIconName = function getIconName() {
if (!innerChecked) {
return iconName;
}
if (_indeterminate) {
return iconIndeterminateName;
}
return iconActiveName;
};
var renderIcon = function renderIcon() {
return React__default.createElement(Icon, {
classPrefix: iconClassPrefix,
fontClassName: iconFontClassName,
name: getIconName(),
size: iconSize,
className: color()
});
};
var color = function color() {
if (innerDisabled) {
return 'nut-checkbox__icon--disable';
}
if (innerChecked) {
if (_indeterminate) {
return 'nut-checkbox__icon--indeterminate';
}
return 'nut-checkbox__icon';
}
return 'nut-checkbox__icon--unchecked';
// return !innerDisabled ? (!innerChecked ? '#d6d6d6' : '#fa2c19') : '#f5f5f5'
};
var renderLabel = function renderLabel() {
return React__default.createElement("span", {
className: "".concat(b('label', {
disabled: innerDisabled
}), " ")
}, children || label);
};
var handleClick = function handleClick() {
if (!disabled) {
var latest = !innerChecked;
if (max !== undefined && latest && getParentVals().length >= max) return;
onChange && onChange(latest, label || children);
setInnerChecked(latest);
}
};
return React__default.createElement("div", _objectSpread(_objectSpread({
className: "".concat(b({
reverse: textPosition === 'left'
}), " ").concat(className || '')
}, rest), {}, {
onClick: handleClick
}), renderIcon(), renderLabel());
};
Checkbox.defaultProps = defaultProps;
Checkbox.displayName = 'NutCheckBox';
Checkbox.Group = CheckboxGroup;
export { Checkbox as C, CheckboxGroup as a };