当前位置: 首页 > news >正文

输入框无法onChange两种解决思路

如果输入框用 onChange 去同步value的话很明显会碰到例如频闪、立即格式化等问题,那么如何解决呢

一种是通过防抖或者节流,设个debance然后通过ref去处理

还有一种是只在失焦的时候再去处理

onBlur={(e) => handleRateChange(e.target.value)} // 只在失焦的时候处理 ,因为用户后面去填写核销金额肯定会导致失焦

import {BeForm,BeFormItem,BeInput,BeMButton,BeMDatePicker,BePureFormItem,BeSelect,bv,useForm,
} from '@finfe/beetle-ui';
import { Money, MoneyRead } from '@react/components';
import { Modal, message, notification } from '@ss/mtd-react3';
import { convertAmountWithCurrency } from '@tmc/business';
import { ImprestItem } from '@tmc/business/src/apis/reserveFund/imprestSearch';
import { submitWriteOff } from '@tmc/business/src/apis/reserveFund/submitWriteOff';
import {getCurrencySelectOptions,WriteOffTypeOptions,
} from '@tmc/business/src/constance/reserveFund';
import {formatter2Display,formatter2Value,getAccuracy,
} from '@tmc/business/src/logic/useMoney';
import dayjs from 'dayjs';
import { useEffect, useMemo, useState } from 'react';interface FinanceModalProps {visible: boolean;record: ImprestItem;onClose: () => void;onSuccess?: () => void;
}interface FormData {type: number;expenseCurrency: string;writeOffCurrency: string;writeOffDate: number | null;writeOffRate: string;writeOffAmount: number;remark: string;
}export default function FinanceModal(props: FinanceModalProps) {const { visible, record, onClose, onSuccess } = props;// 允许核销金额const [allowAmount, setAllowAmount] = useState<number>(0);const [rateLoading, setRateLoading] = useState(false);// 使用 BeForm 管理表单状态const form = useForm<FormData>({onSubmit: async (values) => {await handleSubmit(values);},});// 监听表单值变化const formValues = form.watch();// 初始化表单useEffect(() => {if (visible && record) {form.setValues({type: 2,expenseCurrency: record.expenseCurrency,writeOffCurrency: record.expenseCurrency,writeOffDate: null,writeOffRate: '',writeOffAmount: NaN,remark: '',});setAllowAmount(0); // 不能设置为null}}, [visible, record]);const getAmountOrRate = (customExchangeRate?: string) => {// console.log('更改', customExchangeRate);const { writeOffCurrency, writeOffDate } = formValues;if (!record || !writeOffCurrency || !writeOffDate) {return;}const calculateRate = async () => {try {setRateLoading(true);const res = await convertAmountWithCurrency([// API内部没有进行catch{amount: record.restWriteOffAmount,fromCurrency: record.expenseCurrency,toCurrency: writeOffCurrency,customExchangeRate: customExchangeRate, // formValues.writeOffRate,lineNo: 'only_one_line',},]);if (res.data && res.data.length > 0) {const result = res.data[0];setAllowAmount(result.convertAmount);if (!customExchangeRate)form.setValue('writeOffRate', result.customExchangeRate);}} catch (error: any) {notification.error({message: error.message || '汇率计算失败',});} finally {setRateLoading(false);}};calculateRate();};// 币种或日期变化时拿到后端配置的默认汇率useEffect(() => {getAmountOrRate();}, [formValues.writeOffCurrency, formValues.writeOffDate, record]);// 当汇率更改时那就是用户进行的输入,目的就是请求得到更新的可核销金额// useEffect(() => {//   getAmountOrRate(formValues.writeOffRate);// }, [formValues.writeOffRate, record]);// 选择通过失教的时候去主动调用const handleRateChange = (value: string) => {getAmountOrRate(value);};// 提交表单const handleSubmit = async (values: FormData) => {// 组装提交数据const submitData = {type: values.type,writeOffDate: values.writeOffDate!,writeOffAmount: values.writeOffAmount,remark: values.remark,expenseCurrency: record.expenseCurrency,writeOffCurrency: values.writeOffCurrency,writeOffRate: values.writeOffRate,relatedImprestExpenseBaseId: record.expenseBaseId,writeOffStaffId: record.proposerStaffId,writeOffStaffSign: record.proposerStaffSign,writeOffStaffName: record.proposerStaffName,writeOffEntityId: record.sqtInvoiceId,entInvoiceCode: record.entInvoiceCode,entInvoiceTitle: record.entInvoiceTitle,loanCurrency: record.expenseCurrency,precision: record.precision,};await submitWriteOff([submitData]);Modal.success({title: '成功',message: `成功核销 ${formValues.writeOffCurrency} ${formatter2Display(formValues.writeOffAmount)}`,});onClose();onSuccess?.();};const proposer = [record.proposerStaffName, record.proposerStaffSign].filter(Boolean);return (<ModalclassName="finance-process-modal"onClose={onClose}open={visible}style={{ width: '600px' }}title="财务处理"><Modal.Body><BeForm form={form}><BeForm.Grid><BeFormItem fieldName="type" label="核销方式"><BeSelect options={WriteOffTypeOptions} /></BeFormItem><BeFormItem fieldName="expenseCurrency" label="借款币种"><BeInput disabled /></BeFormItem><BeFormItembrules={bv.required('请选择还款币种')}fieldName="writeOffCurrency"label="还款币种"><BeSelectoptions={getCurrencySelectOptions()}placeholder="请选择还款币种"/></BeFormItem><BeFormItembrules={bv.required('请选择还款日期')}fieldName="writeOffDate"label="还款日期"><BeMDatePickerclearable={false}disabledDate={(timestamp: number) => {// 禁用大于当前日期的日子return dayjs(timestamp).isAfter(dayjs(), 'day');}}placeholder="选择时间"/></BeFormItem><BeFormItembrules={bv.required('请输入汇率').custom((value: string) => {if (value === '0') return '汇率不能为0';})}fieldName="writeOffRate"label="汇率"><BeInputdisabled={rateLoading ||!formValues.writeOffDate ||formValues.writeOffCurrency === record.expenseCurrency}// onChange={handleRateChange} // 不能用onChange这样就只能输一个字了onBlur={(e) => handleRateChange(e.target.value)} // 只在失焦的时候处理 ,因为肯定需要失焦去填写核销金额placeholder="请先选择还款日期"value={formValues.writeOffCurrency !== record.expenseCurrency? formValues.writeOffRate: '1 (当币种一致时汇率不可变)'}/></BeFormItem><BePureFormItem label="允许核销金额">{allowAmount !== null ? (<MoneyReadcurrency={formValues.writeOffCurrency}value={allowAmount}/>) : (<div>系统自动计算</div>)}</BePureFormItem><BeFormItembrules={bv.required('请输入核销金额').custom((value) => {console.log(value, allowAmount);if (!/^\\d+(\\.\\d+)?$/.test(value)) {return '核销金额只能为数字';}if (value > allowAmount) {// 注意若需要判断是否有可报销额度不能直接!,得!==null保持对0的控制// Money拿到的已经是辅币值了return `可核销金额不能超过 ${formValues.writeOffCurrency} ${formatter2Display(allowAmount)}`;// 不能return jsx 否则就用money了}})}fieldName="writeOffAmount"label="本次核销金额"><Moneycurrency={formValues.writeOffCurrency}currencyDisableddisabled={!formValues.writeOffDate}placeholder="填写本次核销金额"value={formValues.writeOffAmount}/></BeFormItem><BePureFormItem label="还款主体">{/* <div style={{ lineHeight: '32px' }}> */}<div className="leading-8">{record?.entInvoiceTitle || '-'}</div></BePureFormItem><BePureFormItem label="偿还人"><div className="leading-8">{/* <div style={{ lineHeight: '32px' }}> */}{proposer.length ? proposer.join('/') : '-'}</div></BePureFormItem><BeFormItem fieldName="remark" label="备注"><BeInputmaxLength={200}// placeholder="备注"/></BeFormItem></BeForm.Grid></BeForm></Modal.Body><Modal.Footer><BeMButtonclassName="mr-3"onClick={onClose}// style={{ marginRight: '12px' }}>取消</BeMButton><BeMButton onClick={() => form.submit()} type="primary">确定</BeMButton></Modal.Footer></Modal>);
}

http://www.dtcms.com/a/587401.html

相关文章:

  • 网站建设服务商都有哪些网站建设哪个公司比较好
  • 个人网站效果企业网站建设代理加盟
  • 网站班级文化建设三只松鼠的网站建设
  • 35网站建设深圳建筑协会
  • 上海设立企业网站中山做网站推广公司
  • 想学学做网站网站建设与维护税率
  • 薛城网站建设可视网站开发工具
  • 徐州市经济技术开发区建设局网站wordpress md5工具
  • 比较好的做网站的公司郑州seo顾问阿亮
  • 厦门网站建设有哪些公司wordpress博客怎么用
  • 郑州服装 网站建设专业的东莞网站排名
  • 中国网站建设的利弊建设英文网站的必要性
  • 有域名了如何自己做网站浪漫的html表白源代码
  • 五金机械设备网站模板建设北京做网站建设
  • 房管局备案查询网站表情包做旧网站
  • 珠宝网站建设平台分析报告360建筑网这家公司怎么样
  • 轮转数组——深度解剖逆转算法的奥秘
  • 外贸网站建设 义乌wordpress 3.9.1
  • 网站开发包含网站维护吗网站建设可行性分析报告模板
  • 广东企业网站seo点击软件意大利设计网站
  • 深圳做网页的网站平面设计课程简介
  • 嘉兴网站建设网站做网站需要前置审批
  • 培训网站推荐网站地图生成器
  • 菏泽网站建设方案wordpress 标签详解
  • 大理州城乡建设局官方网站百度公司有哪些部门
  • 网站备案会掉吗下载免费网络
  • 的网站制作利津网站建设哪家好
  • 百度推广怎么做的网站网站运营实例
  • 商城网站功能最好网站建设公司制作平台
  • 西安网站开发公司价格微商城网站建设策划