UNPKG

@antmjs/vantui

Version:

一套适用于Taro3及React的vantui组件库

194 lines 9.85 kB
import _defineProperty from "@babel/runtime/helpers/defineProperty"; import _objectWithoutProperties from "@babel/runtime/helpers/objectWithoutProperties"; import _slicedToArray from "@babel/runtime/helpers/slicedToArray"; var _excluded = ["id", "name", "layout", "children", "label", "labelName", "required", "rules", "trigger", "validateTrigger", "labelClassName", "requiredClassName", "controllClassName", "className", "requiredIcon", "feedback", "valueKey", "renderRight", "mutiLevel", "valueFormat", "messageClassName", "borderBottom", "controllFlexEnd"]; 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 { useState, useContext, cloneElement, isValidElement, useMemo, useEffect, useCallback } from 'react'; import { View } from '@tarojs/components'; import useDeepCompareEffect from 'use-deep-compare-effect'; import FormContext from '../form/core/formContext'; import { get } from '../default-props'; import Label from './label'; import Message from './message'; import { jsx as _jsx } from "react/jsx-runtime"; import { jsxs as _jsxs } from "react/jsx-runtime"; var prefixCls = 'vant-form-formItem'; export function FormItem(props) { var _useState = useState(get().FormItem), _useState2 = _slicedToArray(_useState, 1), d = _useState2[0]; var _d$props = _objectSpread(_objectSpread({}, d), props), id = _d$props.id, name = _d$props.name, _d$props$layout = _d$props.layout, layout = _d$props$layout === void 0 ? 'horizontal' : _d$props$layout, children = _d$props.children, label = _d$props.label, labelName = _d$props.labelName, _d$props$required = _d$props.required, required = _d$props$required === void 0 ? false : _d$props$required, _d$props$rules = _d$props.rules, rules = _d$props$rules === void 0 ? {} : _d$props$rules, _d$props$trigger = _d$props.trigger, trigger = _d$props$trigger === void 0 ? 'onChange' : _d$props$trigger, _d$props$validateTrig = _d$props.validateTrigger, validateTrigger = _d$props$validateTrig === void 0 ? 'onChange' : _d$props$validateTrig, _d$props$labelClassNa = _d$props.labelClassName, labelClassName = _d$props$labelClassNa === void 0 ? '' : _d$props$labelClassNa, _d$props$requiredClas = _d$props.requiredClassName, requiredClassName = _d$props$requiredClas === void 0 ? '' : _d$props$requiredClas, _d$props$controllClas = _d$props.controllClassName, controllClassName = _d$props$controllClas === void 0 ? '' : _d$props$controllClas, _d$props$className = _d$props.className, className = _d$props$className === void 0 ? '' : _d$props$className, _d$props$requiredIcon = _d$props.requiredIcon, requiredIcon = _d$props$requiredIcon === void 0 ? '' : _d$props$requiredIcon, _d$props$feedback = _d$props.feedback, feedback = _d$props$feedback === void 0 ? 'failed' : _d$props$feedback, _d$props$valueKey = _d$props.valueKey, valueKey = _d$props$valueKey === void 0 ? 'value' : _d$props$valueKey, renderRight = _d$props.renderRight, mutiLevel = _d$props.mutiLevel, valueFormat = _d$props.valueFormat, _d$props$messageClass = _d$props.messageClassName, messageClassName = _d$props$messageClass === void 0 ? '' : _d$props$messageClass, _d$props$borderBottom = _d$props.borderBottom, borderBottom = _d$props$borderBottom === void 0 ? false : _d$props$borderBottom, _d$props$controllFlex = _d$props.controllFlexEnd, controllFlexEnd = _d$props$controllFlex === void 0 ? false : _d$props$controllFlex, others = _objectWithoutProperties(_d$props, _excluded); var formInstance = useContext(FormContext); var registerValidateFields = formInstance.registerValidateFields, dispatch = formInstance.dispatch, unRegisterValidate = formInstance.unRegisterValidate; var _useState3 = useState({}), _useState4 = _slicedToArray(_useState3, 2), forceUpdate_ = _useState4[1]; var _name = Array.isArray(name) ? name.join('.') : name; var _label = useMemo(function () { var l = ''; if (typeof label === 'string') { l = label; } else if (labelName) { l = labelName; } return l; }, [label, labelName]); var onStoreChange = useMemo(function () { var onStoreChange = { changeValue: function changeValue() { forceUpdate_({}); } }; return onStoreChange; }, []); useDeepCompareEffect(function () { /* 注册表单 */ _name && registerValidateFields(_name, onStoreChange, { rules: rules, required: required, mutiLevel: mutiLevel, label: _label }); }, [_name, mutiLevel, onStoreChange, registerValidateFields, required, rules, unRegisterValidate, _label]); useEffect(function () { return function () { _name && unRegisterValidate(_name); }; // eslint-disable-next-line react-hooks/exhaustive-deps }, []); var innnerValue = dispatch({ type: 'getFieldValue' }, _name); var nextHandle = useCallback(function (value, e, trigger_) { dispatch({ type: 'setFieldsValue' }, _name, value); if (trigger_) trigger_(e); }, [_name, dispatch]); var defaultValueFormat = useCallback(function (e, _name, _formInstance) { return e.detail; }, []); var getControlled = useCallback(function (child) { var props = _objectSpread({}, child.props); if (!_name) return props; var trigger_ = props[trigger]; var isWeappInput = /*#__PURE__*/isValidElement(children) && (children === null || children === void 0 ? void 0 : children.type) === 'input' && process.env.TARO_ENV === 'weapp'; var valueFormat_ = valueFormat || defaultValueFormat; var handleChange = function handleChange(e, isValidateField) { var result = valueFormat_(e, _name, formInstance); // 兼容注入的Promise if (result !== null && result !== void 0 && result.then && result !== null && result !== void 0 && result.catch) { if (isWeappInput) { console.warn("\u5FAE\u4FE1\u7AEFInput\u7EC4\u4EF6\u8BF7\u5C3D\u91CF\u4E0D\u8981\u5F02\u6B65\u51FD\u6570\u5904\u7406\uFF0C\u7531\u4E8EFormItem\u4EE3\u7406\u7684Input\u4F1A\u57FA\u4E8E\u5FAE\u4FE1\u7AEF\u505A\u6027\u80FD\u4F18\u5316\uFF0C\n \u8BF7\u67E5\u9605https://developers.weixin.qq.com/miniprogram/dev/component/input.html"); } result.then(function (v) { nextHandle(v, e, trigger_); isValidateField && dispatch({ type: 'validateFieldValue' }, _name); }); } else { nextHandle(result, e, trigger_); isValidateField && dispatch({ type: 'validateFieldValue' }, _name); if (isWeappInput) { // 微信端Input输入存在性能问题,微信2.1版本后基于bindInput返回值做优化 return result; } } }; props[trigger] = handleChange; if (required || rules) { var originValidateTrigger = props[validateTrigger] ? props[validateTrigger].bind({}) : undefined; // 这里不可以使用异步,否则会导致微信小程序输入框显示异常,详见:https://github.com/AntmJS/vantui/issues/459 props[validateTrigger] = function (e) { if (validateTrigger === trigger) { handleChange(e, true); } else { originValidateTrigger === null || originValidateTrigger === void 0 ? void 0 : originValidateTrigger(e); dispatch({ type: 'validateFieldValue' }, _name); } }; } props[valueKey] = innnerValue; return props; }, // eslint-disable-next-line react-hooks/exhaustive-deps [innnerValue, _name, trigger, required, rules]); var renderChildren = useMemo(function () { return /*#__PURE__*/isValidElement(children) ? /*#__PURE__*/cloneElement(children, getControlled(children)) : children; }, [children, getControlled]); return /*#__PURE__*/_jsx(View, _objectSpread(_objectSpread({ className: "".concat(prefixCls, "-wrapper") }, others), {}, { children: /*#__PURE__*/_jsxs(View, { id: id, className: "".concat(prefixCls, " ").concat(prefixCls, "-").concat(layout, " ").concat(className, "\n ").concat(borderBottom ? "vant-form-formItem-bottom-border" : ''), children: [/*#__PURE__*/_jsx(Label, { label: label, required: required, className: labelClassName, requiredClassName: requiredClassName, requiredIcon: requiredIcon }), /*#__PURE__*/_jsxs(View, { className: "".concat(prefixCls, "-controll ").concat(controllClassName), children: [/*#__PURE__*/_jsxs(View, { className: "".concat(prefixCls, "-controll-item ").concat(controllFlexEnd ? "".concat(prefixCls, "-controll-item-flex-end") : ''), children: [renderChildren, renderRight] }), /*#__PURE__*/_jsx(Message, _objectSpread({ name: label, className: messageClassName, feedback: feedback }, dispatch({ type: 'getFieldModel' }, _name)))] })] }) })); } export default FormItem;