gui-one-nutui-react-taro
Version:
京东风格的轻量级移动端 React 组件库,支持一套代码生成 H5 和小程序
238 lines (237 loc) • 9.46 kB
JavaScript
import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
import _defineProperty from "@babel/runtime/helpers/defineProperty";
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, { useRef, useState, useEffect } from 'react';
import { c as cn } from './bem-893ad28d.js';
import { u as useConfig } from './configprovider.taro-6c7b3056.js';
import { I as Icon } from './icon.taro-1d0d4fb7.js';
import { C as ComponentDefaults } from './typings-1c5f2628.js';
import Taro from '@tarojs/taro';
var defaultProps = _objectSpread(_objectSpread({}, ComponentDefaults), {}, {
placeholder: '',
shape: 'square',
disabled: false,
maxLength: 9999,
clearable: true,
align: 'left',
readonly: true,
autoFocus: false,
label: '',
leftinIcon: React__default.createElement(Icon, {
name: "search",
size: "12"
})
});
var SearchBar = function SearchBar(props) {
var searchbarBem = cn('searchbar');
var _useConfig = useConfig(),
locale = _useConfig.locale;
var searchRef = useRef(null);
var _useState = useState(function () {
return props.value;
}),
_useState2 = _slicedToArray(_useState, 2),
value = _useState2[0],
setValue = _useState2[1];
var _defaultProps$props = _objectSpread(_objectSpread({}, defaultProps), props),
placeholder = _defaultProps$props.placeholder,
shape = _defaultProps$props.shape,
className = _defaultProps$props.className,
disabled = _defaultProps$props.disabled,
maxLength = _defaultProps$props.maxLength,
clearable = _defaultProps$props.clearable,
align = _defaultProps$props.align,
readOnly = _defaultProps$props.readOnly,
autoFocus = _defaultProps$props.autoFocus,
label = _defaultProps$props.label,
actionText = _defaultProps$props.actionText,
leftinIcon = _defaultProps$props.leftinIcon,
rightinIcon = _defaultProps$props.rightinIcon,
leftoutIcon = _defaultProps$props.leftoutIcon,
rightoutIcon = _defaultProps$props.rightoutIcon,
onChange = _defaultProps$props.onChange,
onFocus = _defaultProps$props.onFocus,
onBlur = _defaultProps$props.onBlur,
onClear = _defaultProps$props.onClear,
onCancel = _defaultProps$props.onCancel,
onSearch = _defaultProps$props.onSearch,
onClickInput = _defaultProps$props.onClickInput,
onClickLeftinIcon = _defaultProps$props.onClickLeftinIcon,
onClickLeftoutIcon = _defaultProps$props.onClickLeftoutIcon,
onClickRightinIcon = _defaultProps$props.onClickRightinIcon,
onClickRightoutIcon = _defaultProps$props.onClickRightoutIcon,
iconClassPrefix = _defaultProps$props.iconClassPrefix,
iconFontClassName = _defaultProps$props.iconFontClassName;
var alignClass = "".concat(align);
var change = function change(event) {
var value = event.target.value;
onChange && (onChange === null || onChange === void 0 ? void 0 : onChange(value, event));
setValue(value);
};
var focus = function focus(event) {
var value = event.target.value;
onFocus && (onFocus === null || onFocus === void 0 ? void 0 : onFocus(value, event));
};
var blur = function blur(event) {
var searchSelf = searchRef.current;
searchSelf && searchSelf.blur();
var value = event.target.value;
onBlur && (onBlur === null || onBlur === void 0 ? void 0 : onBlur(value, event));
};
useEffect(function () {
setValue(props.value);
}, [props.value]);
useEffect(function () {
if (autoFocus) {
var searchSelf = searchRef.current;
searchSelf && searchSelf.focus();
}
}, [autoFocus]);
var renderField = function renderField() {
return React__default.createElement("input", {
className: "".concat(searchbarBem('input'), " ").concat(searchbarBem(alignClass), " ").concat(shape === 'round' ? searchbarBem('round') : '', " ").concat(clearable ? searchbarBem('input-clear') : ''),
ref: searchRef,
style: _objectSpread(_objectSpread({}, props.style), {}, {
background: props.inputBackground
}),
value: value || '',
placeholder: placeholder || locale.placeholder,
disabled: disabled,
readOnly: readOnly,
maxLength: maxLength,
onKeyPress: onKeypress,
onChange: function onChange(e) {
return change(e);
},
onFocus: function onFocus(e) {
return focus(e);
},
onBlur: function onBlur(e) {
return blur(e);
},
onClick: function onClick(e) {
return clickInput(e);
}
});
};
var clickInput = function clickInput(e) {
onClickInput && onClickInput(e);
};
var renderLeftinIcon = function renderLeftinIcon() {
if (!leftinIcon) return null;
return React__default.createElement("div", {
className: "".concat(searchbarBem('leftin-icon'), " ").concat(searchbarBem('icon')),
onClick: function onClick(e) {
return clickLeftIcon('in-left', e);
}
}, leftinIcon);
};
var renderLeftoutIcon = function renderLeftoutIcon() {
if (!leftoutIcon) return null;
return React__default.createElement("div", {
className: "".concat(searchbarBem('leftout-icon')),
onClick: function onClick(e) {
return clickLeftIcon('out-left', e);
}
}, leftoutIcon);
};
var clickLeftIcon = function clickLeftIcon(flag, event) {
if (flag === 'in-left') {
onClickLeftinIcon && onClickLeftinIcon(value, event);
} else {
onClickLeftoutIcon && onClickLeftoutIcon(value, event);
}
};
var renderRightinIcon = function renderRightinIcon() {
if (!rightinIcon) return null;
return React__default.createElement("div", {
className: "".concat(searchbarBem('rightin-icon'), " ").concat(searchbarBem('icon')),
onClick: function onClick(e) {
return clickRightIcon('in-right', e);
}
}, rightinIcon);
};
var renderRightoutIcon = function renderRightoutIcon() {
if (!rightoutIcon) return null;
return React__default.createElement("div", {
className: "".concat(searchbarBem('rightout-icon')),
onClick: function onClick(e) {
return clickRightIcon('out-right', e);
}
}, rightoutIcon);
};
var clickRightIcon = function clickRightIcon(flag, event) {
if (flag === 'in-left') {
onClickRightinIcon && onClickRightinIcon(value, event);
} else {
onClickRightoutIcon && onClickRightoutIcon(value, event);
}
};
var handleClear = function handleClear() {
return React__default.createElement("div", {
className: "".concat(searchbarBem('clear'), " ").concat(rightinIcon ? 'pos-right' : ''),
onClick: function onClick(e) {
return clearaVal(e);
}
}, React__default.createElement(Icon, {
classPrefix: iconClassPrefix,
fontClassName: iconFontClassName,
name: "circle-close",
size: "12",
color: "#555"
}));
};
var clearaVal = function clearaVal(event) {
if (disabled || readOnly) {
return;
}
setValue('');
onClear && onClear(event);
};
var renderRightLabel = function renderRightLabel() {
if (actionText) {
return React__default.createElement("div", {
className: searchbarBem('action-text'),
onClick: cancel
}, actionText);
}
return null;
};
var onKeypress = function onKeypress(e) {
if (e.key === 'Enter') {
var event = e.nativeEvent;
if (typeof event.cancelable !== 'boolean' || event.cancelable) {
event.preventDefault();
}
onSearch && onSearch(value);
}
};
var cancel = function cancel() {
onCancel && onCancel();
};
var renderLabel = function renderLabel() {
if (label) {
return React__default.createElement("div", {
className: searchbarBem('label')
}, label);
}
return null;
};
var envClass = function envClass() {
return Taro.getEnv() === 'WEB' ? 'nut-searchbar-taro' : '';
};
return React__default.createElement("div", {
className: "".concat(searchbarBem(), " ").concat(envClass(), " ").concat(disabled ? searchbarBem('disabled') : '', " ").concat(className || ''),
style: _objectSpread(_objectSpread({}, props.style), {}, {
background: props.background
})
}, renderLeftoutIcon(), renderLabel(), React__default.createElement("div", {
className: "".concat(searchbarBem('content'))
}, renderLeftinIcon(), React__default.createElement("div", {
className: "nut-searchbar__input-box"
}, renderField()), renderRightinIcon(), clearable && value && handleClear()), renderRightoutIcon(), renderRightLabel());
};
SearchBar.defaultProps = defaultProps;
SearchBar.displayName = 'NutSearchBar';
export { SearchBar as S };