🎈 perf(优化所有输入框):

This commit is contained in:
2022-11-08 13:49:57 +08:00
parent d06f4137c6
commit 812971f6b2
14 changed files with 1285 additions and 1059 deletions
+51 -38
View File
@@ -1,15 +1,15 @@
import { Image, Input, Text, View } from '@tarojs/components'
import styles from './index.module.scss'
import useLogin from '@/use/useLogin'
import classnames from "classnames";
import classnames from 'classnames'
import { formatImgUrl } from '@/common/fotmat'
import { useEffect, useMemo, useRef, useState } from 'react';
import { alert } from '@/common/common';
import CloseBtn from '@/components/closeBtn';
import SuccessBind from './component/successBind';
import Taro, { useDidShow } from "@tarojs/taro";
import { BindInvitationInfoApi, GetInvitationInfoApi } from '@/api/user';
import { debounce, getFilterData, throttle } from '@/common/util';
import { useEffect, useMemo, useRef, useState } from 'react'
import { alert } from '@/common/common'
import CloseBtn from '@/components/closeBtn'
import SuccessBind from './component/successBind'
import Taro, { useDidShow } from '@tarojs/taro'
import { BindInvitationInfoApi, GetInvitationInfoApi } from '@/api/user'
import { debounce, getFilterData, throttle } from '@/common/util'
export default () => {
useLogin()
@@ -20,81 +20,94 @@ export default () => {
const [submitData, setSubmitData] = useState({
invitation_code: '',
})
//获取业务员信息
type Param = {invitation_code: string, name: string, phone: string}
const [salesMan, setSalesMan] = useState<Param|null>(null)
const {fetchData: GetInvitationInfoFetchData} = GetInvitationInfoApi()
type Param = { invitation_code: string; name: string; phone: string }
const [salesMan, setSalesMan] = useState<Param | null>(null)
const { fetchData: GetInvitationInfoFetchData } = GetInvitationInfoApi()
const getInvitationInfo = async () => {
let res = await GetInvitationInfoFetchData(getFilterData({...submitData}))
res.success?setSalesMan(res.data):setSalesMan(null)
let res = await GetInvitationInfoFetchData(getFilterData({ ...submitData }))
res.success ? setSalesMan(res.data) : setSalesMan(null)
}
useEffect(() => {
if(submitData.invitation_code.length === 4)
getInvitationInfo()
if (submitData.invitation_code.length === 4) getInvitationInfo()
}, [submitData])
const onInputCode = (e) => {
const value = e.detail.value.replace(/[\W]/g, "")
setSubmitData((val) => ({...val, invitation_code:value}))
const value = e.detail.value.replace(/[\W]/g, '')
setSubmitData((val) => ({ ...val, invitation_code: value }))
}
const oncloseEven = () => {
setSubmitData((val) => ({...val, invitation_code:''}))
setSubmitData((val) => ({ ...val, invitation_code: '' }))
setSalesMan(null)
}
//绑定业务员
const [bindShow, setBindShow] = useState(false)
const {fetchData: bindInvitationInfoFetchData} = BindInvitationInfoApi()
const { fetchData: bindInvitationInfoFetchData } = BindInvitationInfoApi()
const onSubmit = async () => {
if(!submitData.invitation_code) return alert.error('请输入邀请码')
let res = await bindInvitationInfoFetchData({...submitData})
if(res.success) setBindShow(() => true)
if (!submitData.invitation_code) return alert.error('请输入邀请码')
let res = await bindInvitationInfoFetchData({ ...submitData })
if (res.success) setBindShow(() => true)
}
const onScanCode = () => {
Taro.scanCode({
success: (res) => {
setSubmitData(() => ({invitation_code: res.result}))
}
setSubmitData(() => ({ invitation_code: res.result }))
},
})
}
//获取粘贴版内容
const onClipboardData = () => {
Taro.getClipboardData({
success: function (res){
success: function (res) {
let val = res.data.match(/InviteCode:([a-zA-Z0-9]{4})/)
if(val) setSubmitData((e) => ({...e, invitation_code: val?val[1]:''}))
}
if (val) setSubmitData((e) => ({ ...e, invitation_code: val ? val[1] : '' }))
},
})
}
return (
<View className={styles.bindSalesmanPage_main}>
<View className={styles.header_image}>
<Image src={formatImgUrl('/mall/invite_code_bg.png')} mode="aspectFill"/>
<Image src={formatImgUrl('/mall/invite_code_bg.png')} mode='aspectFill' />
</View>
<View className={styles.inputCode}>
<Input maxlength={4} value={submitData.invitation_code} placeholder='请输入邀请码' onInput={onInputCode} type="text" />
<View className={styles.close_btn} >
{submitData.invitation_code&&<CloseBtn styleObj={{backgroundColor: '#ccc', color: '#fff'}} onClose={oncloseEven}/>}
<Input
alwaysEmbed={true}
cursorSpacing={150}
maxlength={4}
value={submitData.invitation_code}
placeholder='请输入邀请码'
onInput={onInputCode}
type='text'
/>
<View className={styles.close_btn}>
{submitData.invitation_code && <CloseBtn styleObj={{ backgroundColor: '#ccc', color: '#fff' }} onClose={oncloseEven} />}
</View>
<View className={styles.scan_code} onClick={() => onScanCode()}>
<Text className={classnames('iconfont icon-saomazhifu', styles.miconfont)}></Text>
</View>
</View>
{salesMan&&<View className={styles.salesman_name}><Text>邀请人:</Text><Text>{`${salesMan.name} (${salesMan.phone})`}</Text></View>}
<View className={classnames(styles.btns, salesMan&&styles.select_btns)} onClick={onSubmit}>提交</View>
{salesMan && (
<View className={styles.salesman_name}>
<Text>邀请人:</Text>
<Text>{`${salesMan.name} (${salesMan.phone})`}</Text>
</View>
)}
<View className={classnames(styles.btns, salesMan && styles.select_btns)} onClick={onSubmit}>
提交
</View>
<View className={styles.message}>
<Text>温馨提示</Text>
<Text>1. 新用户授权手机号码后,7天内可以输入邀请码,超过时间不能输入。</Text>
<Text>2. 一个手机只能输入一次邀请码。输入邀请码。</Text>
</View>
<View className='common_safe_area_y'></View>
<SuccessBind show={bindShow} onClose={() => setBindShow(false)} saleMan={salesMan?.name}/>
<SuccessBind show={bindShow} onClose={() => setBindShow(false)} saleMan={salesMan?.name} />
</View>
)
}
+145 -104
View File
@@ -1,115 +1,156 @@
import Popup, {Params as PopuParams} from "@/components/popup"
import { Input, ScrollView, Text, Textarea, View } from "@tarojs/components"
import classnames from "classnames";
import { useEffect, useState } from "react";
import styles from './index.module.scss'
import Popup, { Params as PopuParams } from '@/components/popup'
import { Input, ScrollView, Text, Textarea, View } from '@tarojs/components'
import classnames from 'classnames'
import { useEffect, useState } from 'react'
import styles from './index.module.scss'
type params = {
onFiltr?: (val:object) => void
onFiltr?: (val: object) => void
} & PopuParams
export default ({onClose, onFiltr, show = false}:params) => {
const [filterObj, setFilterObj] = useState({
series: '',
minWidth: '',
maxWidth: '',
minWeight: '',
maxWeight: '',
element: ''
export default ({ onClose, onFiltr, show = false }: params) => {
const [filterObj, setFilterObj] = useState({
series: '',
minWidth: '',
maxWidth: '',
minWeight: '',
maxWeight: '',
element: '',
})
const onCloseEven = () => {
onClose?.()
}
const onRest = () => {
console.log('12123')
setFilterObj({
series: '',
minWidth: '',
maxWidth: '',
minWeight: '',
maxWeight: '',
element: '',
})
const onCloseEven = () => {
onClose?.()
}
const onRest = () => {
console.log('12123')
setFilterObj({
series: '',
minWidth: '',
maxWidth: '',
minWeight: '',
maxWeight: '',
element: ''
})
}
useEffect(() => {
console.log(filterObj)
}, [filterObj])
}
useEffect(() => {
console.log(filterObj)
}, [filterObj])
const onVerify = () => {
console.log(filterObj)
onFiltr?.(filterObj)
}
const onVerify = () => {
console.log(filterObj)
onFiltr?.(filterObj)
}
const setNumber = (e, field) => {
console.log(e)
let num = parseFloat(e.detail.value)
if(isNaN(num)) {
filterObj[field] = null
} else {
filterObj[field] = parseFloat(num.toFixed(2))
}
setFilterObj({...filterObj})
const setNumber = (e, field) => {
console.log(e)
let num = parseFloat(e.detail.value)
if (isNaN(num)) {
filterObj[field] = null
} else {
filterObj[field] = parseFloat(num.toFixed(2))
}
setFilterObj({ ...filterObj })
}
const setElement = (e) => {
let res = e.detail.value
setFilterObj({...filterObj, element:res})
}
return (
<Popup position="right" show={show} showTitle={false} onClose={() => onCloseEven()} showIconButton={true}>
<View className={styles.popup_main}>
<View className={styles.popup_title}>全部筛选</View>
<ScrollView scrollY className={styles.scroll}>
<View className={styles.popup_filter}>
<View className={styles.popup_filter_item}>
<View className={styles.title}>系列</View>
<View className={styles.btn_list}>
<View className={classnames(styles.btn_item, styles.select_btn_item)}>不限</View>
<View className={styles.btn_item}>不限</View>
<View className={styles.btn_item}>不限</View>
<View className={styles.btn_item}>不限</View>
<View className={styles.btn_item}>不限</View>
<View className={styles.btn_item}>不限</View>
</View>
</View>
<View className={styles.popup_filter_item}>
<View className={styles.title}>幅宽</View>
<View className={styles.btn_list_input}>
<View className={styles.btn_width}><Input value={filterObj.minWidth} type="digit" onBlur={(e) => setNumber(e,'minWidth')} placeholder="自定义最低值" placeholderStyle="font-size: 26rpx"/></View>
<Text>—</Text>
<View className={styles.btn_width}><Input value={filterObj.maxWidth} type="digit" onBlur={(e) => setNumber(e,'maxWidth')} placeholder="自定义最高值" placeholderStyle="font-size: 26rpx"/></View>
<View className={styles.unit}>cm</View>
</View>
</View>
<View className={styles.popup_filter_item}>
<View className={styles.title}>克重</View>
<View className={styles.btn_list_input}>
<View className={styles.btn_width}><Input type="digit" value={filterObj.minWeight} onBlur={(e) => setNumber(e,'minWeight')} placeholder="自定义最低值" placeholderStyle="font-size: 26rpx"/></View>
<Text>—</Text>
<View className={styles.btn_width}><Input type="digit" value={filterObj.maxWeight} onBlur={(e) => setNumber(e,'maxWeight')} placeholder="自定义最高值" placeholderStyle="font-size: 26rpx"/></View>
<View className={styles.unit}>g</View>
</View>
</View>
<View className={styles.popup_filter_item}>
<View className={styles.title}>成分</View>
<View className={styles.btn_list_element}>
<Textarea placeholder="请输入" cursorSpacing={60} value={filterObj.element} onInput={(e) => setElement(e)}/>
</View>
</View>
<View className="common_safe_area_y"></View>
</View>
</ScrollView>
<View className={styles.btns_con}>
<View className={styles.btns_two}>
<View className={styles.rest_btn} onClick={() => onRest()}>重置</View>
<View className={styles.verify_btn } onClick={() => onVerify()}>确认</View>
</View>
const setElement = (e) => {
let res = e.detail.value
setFilterObj({ ...filterObj, element: res })
}
return (
<Popup position='right' show={show} showTitle={false} onClose={() => onCloseEven()} showIconButton={true}>
<View className={styles.popup_main}>
<View className={styles.popup_title}>全部筛选</View>
<ScrollView scrollY className={styles.scroll}>
<View className={styles.popup_filter}>
<View className={styles.popup_filter_item}>
<View className={styles.title}>系列</View>
<View className={styles.btn_list}>
<View className={classnames(styles.btn_item, styles.select_btn_item)}>不限</View>
<View className={styles.btn_item}>不限</View>
<View className={styles.btn_item}>不限</View>
<View className={styles.btn_item}>不限</View>
<View className={styles.btn_item}>不限</View>
<View className={styles.btn_item}>不限</View>
</View>
</View>
<View className={styles.popup_filter_item}>
<View className={styles.title}>幅宽</View>
<View className={styles.btn_list_input}>
<View className={styles.btn_width}>
<Input
alwaysEmbed={true}
cursorSpacing={150}
value={filterObj.minWidth}
type='digit'
onBlur={(e) => setNumber(e, 'minWidth')}
placeholder='自定义最低值'
placeholderStyle='font-size: 26rpx'
/>
</View>
<Text>—</Text>
<View className={styles.btn_width}>
<Input
alwaysEmbed={true}
cursorSpacing={150}
value={filterObj.maxWidth}
type='digit'
onBlur={(e) => setNumber(e, 'maxWidth')}
placeholder='自定义最高值'
placeholderStyle='font-size: 26rpx'
/>
</View>
<View className={styles.unit}>cm</View>
</View>
</View>
<View className={styles.popup_filter_item}>
<View className={styles.title}>克重</View>
<View className={styles.btn_list_input}>
<View className={styles.btn_width}>
<Input
alwaysEmbed={true}
cursorSpacing={150}
type='digit'
value={filterObj.minWeight}
onBlur={(e) => setNumber(e, 'minWeight')}
placeholder='自定义最低值'
placeholderStyle='font-size: 26rpx'
/>
</View>
<Text>—</Text>
<View className={styles.btn_width}>
<Input
alwaysEmbed={true}
cursorSpacing={150}
type='digit'
value={filterObj.maxWeight}
onBlur={(e) => setNumber(e, 'maxWeight')}
placeholder='自定义最高值'
placeholderStyle='font-size: 26rpx'
/>
</View>
<View className={styles.unit}>g</View>
</View>
</View>
<View className={styles.popup_filter_item}>
<View className={styles.title}>成分</View>
<View className={styles.btn_list_element}>
<Textarea placeholder='请输入' cursorSpacing={60} value={filterObj.element} onInput={(e) => setElement(e)} />
</View>
</View>
</Popup>
)
}
<View className='common_safe_area_y'></View>
</View>
</ScrollView>
<View className={styles.btns_con}>
<View className={styles.btns_two}>
<View className={styles.rest_btn} onClick={() => onRest()}>
重置
</View>
<View className={styles.verify_btn} onClick={() => onVerify()}>
确认
</View>
</View>
</View>
</View>
</Popup>
)
}
@@ -48,7 +48,6 @@ export default memo(({ show = false, onClose, onSuccess, defaultValue }: ReasonI
placeholder='请输入文件夹名称'
className={styles.input}
alwaysEmbed={true}
// adjustPosition={true}
cursorSpacing={100}
onInput={changeInput}
value={defaultValue?.name}
+99 -104
View File
@@ -1,113 +1,108 @@
import { Input, View } from "@tarojs/components"
import { useEffect, useMemo, useRef, useState } from "react"
import { Input, View } from '@tarojs/components'
import { useEffect, useMemo, useRef, useState } from 'react'
import Big from 'big.js'
import styles from "./index.module.scss"
import styles from './index.module.scss'
type params = {
minNum?: number, //最小值
maxNum?: number, //最大值
step?: number, //步长
defaultNum?: number, //默认值
digits?: number //多少位小数
onChange?:(val: number, obj?: any) => void,
onBlue?:(val:number, obj?: any) => void, //失去焦点触发
onClickBtn?:(val:number, obj?: any) => void,
unit?: string,
otherData?: any
minNum?: number //最小值
maxNum?: number //最大值
step?: number //步长
defaultNum?: number //默认值
digits?: number //多少位小数
onChange?: (val: number, obj?: any) => void
onBlue?: (val: number, obj?: any) => void //失去焦点触发
onClickBtn?: (val: number, obj?: any) => void
unit?: string
otherData?: any
}
export default ({minNum = 0, maxNum = 100, step=1, digits = 0, defaultNum = 0, onChange, onBlue, onClickBtn, unit = '', otherData}: params) => {
const [value, setValue] = useState<any>({count:defaultNum})
const onPlus = () => {
let {count} = value
let num_res = Big(count).add(step).toNumber()
num_res = num_res >= maxNum?maxNum:num_res
num_res = formatDigits(num_res)
setValue({...value, count:num_res})
onChange?.(parseFloat(num_res), otherData)
onClickBtn?.(parseFloat(num_res), otherData)
}
const minus = () => {
let {count} = value
let num_res = Big(count).minus(step).toNumber()
num_res = num_res < minNum?0:num_res
setValue({...value, count:num_res})
onChange?.(parseFloat(num_res), otherData)
onClickBtn?.(parseFloat(num_res), otherData)
}
export default ({ minNum = 0, maxNum = 100, step = 1, digits = 0, defaultNum = 0, onChange, onBlue, onClickBtn, unit = '', otherData }: params) => {
const [value, setValue] = useState<any>({ count: defaultNum })
//保留小数
const formatDigits = (num) => {
num = num + ''
if(num.includes('.')&&digits > 0) {
console.log('num::',num.includes('.'))
let res = num.split('.')
let last_num = res[1].substr(0, digits)
return res[0] + '.' + last_num
}
return parseFloat(num)
}
const onPlus = () => {
let { count } = value
let num_res = Big(count).add(step).toNumber()
num_res = num_res >= maxNum ? maxNum : num_res
num_res = formatDigits(num_res)
setValue({ ...value, count: num_res })
onChange?.(parseFloat(num_res), otherData)
onClickBtn?.(parseFloat(num_res), otherData)
}
const minus = () => {
let { count } = value
let num_res = Big(count).minus(step).toNumber()
num_res = num_res < minNum ? 0 : num_res
setValue({ ...value, count: num_res })
onChange?.(parseFloat(num_res), otherData)
onClickBtn?.(parseFloat(num_res), otherData)
}
//检查数据
const checkData = (val) => {
let num = parseFloat(val)
if(num > maxNum) return maxNum
if(num < minNum) return minNum
return val
//保留小数
const formatDigits = (num) => {
num = num + ''
if (num.includes('.') && digits > 0) {
console.log('num::', num.includes('.'))
let res = num.split('.')
let last_num = res[1].substr(0, digits)
return res[0] + '.' + last_num
}
return parseFloat(num)
}
const onInputEven = (e) => {
let res = e.detail.value
if(res === '') {
setValue({...value, count:minNum})
onChange?.(minNum, otherData)
}
else if(!isNaN(Number(res))) {
let count = formatDigits(res)
count = checkData(count)
setValue({...value, count})
onChange?.(parseFloat(count as string), otherData)
} else {
let num = parseFloat(res)
if(!isNaN(num)) {
let count = formatDigits(num)
count = checkData(count)
setValue({...value, count})
onChange?.(count as number, otherData)
} else {
setValue({...value, count:defaultNum})
onChange?.(defaultNum, otherData)
}
}
//检查数据
const checkData = (val) => {
let num = parseFloat(val)
if (num > maxNum) return maxNum
if (num < minNum) return minNum
return val
}
const onInputEven = (e) => {
let res = e.detail.value
if (res === '') {
setValue({ ...value, count: minNum })
onChange?.(minNum, otherData)
} else if (!isNaN(Number(res))) {
let count = formatDigits(res)
count = checkData(count)
setValue({ ...value, count })
onChange?.(parseFloat(count as string), otherData)
} else {
let num = parseFloat(res)
if (!isNaN(num)) {
let count = formatDigits(num)
count = checkData(count)
setValue({ ...value, count })
onChange?.(count as number, otherData)
} else {
setValue({ ...value, count: defaultNum })
onChange?.(defaultNum, otherData)
}
}
}
const onBluerEven = () => {
let num = parseFloat(value.count)
if(!isNaN(num)) {
let count = formatDigits(num)
count = checkData(count)
setValue({...value, count})
onBlue?.(count as number, otherData)
} else {
setValue({...value, count:defaultNum})
onBlue?.(defaultNum, otherData)
}
}
return (
<View className={styles.main}>
<View className={styles.reduce} onClick={() => minus()}>-</View>
<View className={styles.input}>
<Input
value={String(value.count)}
onInput={onInputEven}
onBlur={onBluerEven}
type='digit'
/>
<View className={styles.unit}>{unit}</View>
</View>
<View className={styles.plus} onClick={() => onPlus()}>+</View>
</View>
)
}
const onBluerEven = () => {
let num = parseFloat(value.count)
if (!isNaN(num)) {
let count = formatDigits(num)
count = checkData(count)
setValue({ ...value, count })
onBlue?.(count as number, otherData)
} else {
setValue({ ...value, count: defaultNum })
onBlue?.(defaultNum, otherData)
}
}
return (
<View className={styles.main}>
<View className={styles.reduce} onClick={() => minus()}>
-
</View>
<View className={styles.input}>
<Input value={String(value.count)} onInput={onInputEven} onBlur={onBluerEven} type='digit' alwaysEmbed={true} cursorSpacing={150} />
<View className={styles.unit}>{unit}</View>
</View>
<View className={styles.plus} onClick={() => onPlus()}>
+
</View>
</View>
)
}
+145 -104
View File
@@ -1,115 +1,156 @@
import Popup, {Params as PopuParams} from "@/components/popup"
import { Input, ScrollView, Text, Textarea, View } from "@tarojs/components"
import classnames from "classnames";
import { useEffect, useState } from "react";
import styles from './index.module.scss'
import Popup, { Params as PopuParams } from '@/components/popup'
import { Input, ScrollView, Text, Textarea, View } from '@tarojs/components'
import classnames from 'classnames'
import { useEffect, useState } from 'react'
import styles from './index.module.scss'
type params = {
onFiltr?: (val:object) => void
onFiltr?: (val: object) => void
} & PopuParams
export default ({onClose, onFiltr, show = false}:params) => {
const [filterObj, setFilterObj] = useState({
series: '',
minWidth: '',
maxWidth: '',
minWeight: '',
maxWeight: '',
element: ''
export default ({ onClose, onFiltr, show = false }: params) => {
const [filterObj, setFilterObj] = useState({
series: '',
minWidth: '',
maxWidth: '',
minWeight: '',
maxWeight: '',
element: '',
})
const onCloseEven = () => {
onClose?.()
}
const onRest = () => {
console.log('12123')
setFilterObj({
series: '',
minWidth: '',
maxWidth: '',
minWeight: '',
maxWeight: '',
element: '',
})
const onCloseEven = () => {
onClose?.()
}
const onRest = () => {
console.log('12123')
setFilterObj({
series: '',
minWidth: '',
maxWidth: '',
minWeight: '',
maxWeight: '',
element: ''
})
}
useEffect(() => {
console.log(filterObj)
}, [filterObj])
}
useEffect(() => {
console.log(filterObj)
}, [filterObj])
const onVerify = () => {
console.log(filterObj)
onFiltr?.(filterObj)
}
const onVerify = () => {
console.log(filterObj)
onFiltr?.(filterObj)
}
const setNumber = (e, field) => {
console.log(e)
let num = parseFloat(e.detail.value)
if(isNaN(num)) {
filterObj[field] = null
} else {
filterObj[field] = parseFloat(num.toFixed(2))
}
setFilterObj({...filterObj})
const setNumber = (e, field) => {
console.log(e)
let num = parseFloat(e.detail.value)
if (isNaN(num)) {
filterObj[field] = null
} else {
filterObj[field] = parseFloat(num.toFixed(2))
}
setFilterObj({ ...filterObj })
}
const setElement = (e) => {
let res = e.detail.value
setFilterObj({...filterObj, element:res})
}
return (
<Popup position="right" show={show} showTitle={false} onClose={() => onCloseEven()} showIconButton={true}>
<View className={styles.popup_main}>
<View className={styles.popup_title}>全部筛选</View>
<ScrollView scrollY className={styles.scroll}>
<View className={styles.popup_filter}>
<View className={styles.popup_filter_item}>
<View className={styles.title}>系列</View>
<View className={styles.btn_list}>
<View className={classnames(styles.btn_item, styles.select_btn_item)}>不限</View>
<View className={styles.btn_item}>不限</View>
<View className={styles.btn_item}>不限</View>
<View className={styles.btn_item}>不限</View>
<View className={styles.btn_item}>不限</View>
<View className={styles.btn_item}>不限</View>
</View>
</View>
<View className={styles.popup_filter_item}>
<View className={styles.title}>幅宽</View>
<View className={styles.btn_list_input}>
<View className={styles.btn_width}><Input value={filterObj.minWidth} type="digit" onBlur={(e) => setNumber(e,'minWidth')} placeholder="自定义最低值" placeholderStyle="font-size: 26rpx"/></View>
<Text>—</Text>
<View className={styles.btn_width}><Input value={filterObj.maxWidth} type="digit" onBlur={(e) => setNumber(e,'maxWidth')} placeholder="自定义最高值" placeholderStyle="font-size: 26rpx"/></View>
<View className={styles.unit}>cm</View>
</View>
</View>
<View className={styles.popup_filter_item}>
<View className={styles.title}>克重</View>
<View className={styles.btn_list_input}>
<View className={styles.btn_width}><Input type="digit" value={filterObj.minWeight} onBlur={(e) => setNumber(e,'minWeight')} placeholder="自定义最低值" placeholderStyle="font-size: 26rpx"/></View>
<Text>—</Text>
<View className={styles.btn_width}><Input type="digit" value={filterObj.maxWeight} onBlur={(e) => setNumber(e,'maxWeight')} placeholder="自定义最高值" placeholderStyle="font-size: 26rpx"/></View>
<View className={styles.unit}>g</View>
</View>
</View>
<View className={styles.popup_filter_item}>
<View className={styles.title}>成分</View>
<View className={styles.btn_list_element}>
<Textarea placeholder="请输入" cursorSpacing={60} value={filterObj.element} onInput={(e) => setElement(e)}/>
</View>
</View>
<View className="common_safe_area_y"></View>
</View>
</ScrollView>
<View className={styles.btns_con}>
<View className={styles.btns_two}>
<View className={styles.rest_btn} onClick={() => onRest()}>重置</View>
<View className={styles.verify_btn } onClick={() => onVerify()}>确认</View>
</View>
const setElement = (e) => {
let res = e.detail.value
setFilterObj({ ...filterObj, element: res })
}
return (
<Popup position='right' show={show} showTitle={false} onClose={() => onCloseEven()} showIconButton={true}>
<View className={styles.popup_main}>
<View className={styles.popup_title}>全部筛选</View>
<ScrollView scrollY className={styles.scroll}>
<View className={styles.popup_filter}>
<View className={styles.popup_filter_item}>
<View className={styles.title}>系列</View>
<View className={styles.btn_list}>
<View className={classnames(styles.btn_item, styles.select_btn_item)}>不限</View>
<View className={styles.btn_item}>不限</View>
<View className={styles.btn_item}>不限</View>
<View className={styles.btn_item}>不限</View>
<View className={styles.btn_item}>不限</View>
<View className={styles.btn_item}>不限</View>
</View>
</View>
<View className={styles.popup_filter_item}>
<View className={styles.title}>幅宽</View>
<View className={styles.btn_list_input}>
<View className={styles.btn_width}>
<Input
alwaysEmbed={true}
cursorSpacing={150}
value={filterObj.minWidth}
type='digit'
onBlur={(e) => setNumber(e, 'minWidth')}
placeholder='自定义最低值'
placeholderStyle='font-size: 26rpx'
/>
</View>
<Text>—</Text>
<View className={styles.btn_width}>
<Input
alwaysEmbed={true}
cursorSpacing={150}
value={filterObj.maxWidth}
type='digit'
onBlur={(e) => setNumber(e, 'maxWidth')}
placeholder='自定义最高值'
placeholderStyle='font-size: 26rpx'
/>
</View>
<View className={styles.unit}>cm</View>
</View>
</View>
<View className={styles.popup_filter_item}>
<View className={styles.title}>克重</View>
<View className={styles.btn_list_input}>
<View className={styles.btn_width}>
<Input
alwaysEmbed={true}
cursorSpacing={150}
type='digit'
value={filterObj.minWeight}
onBlur={(e) => setNumber(e, 'minWeight')}
placeholder='自定义最低值'
placeholderStyle='font-size: 26rpx'
/>
</View>
<Text>—</Text>
<View className={styles.btn_width}>
<Input
alwaysEmbed={true}
cursorSpacing={150}
type='digit'
value={filterObj.maxWeight}
onBlur={(e) => setNumber(e, 'maxWeight')}
placeholder='自定义最高值'
placeholderStyle='font-size: 26rpx'
/>
</View>
<View className={styles.unit}>g</View>
</View>
</View>
<View className={styles.popup_filter_item}>
<View className={styles.title}>成分</View>
<View className={styles.btn_list_element}>
<Textarea placeholder='请输入' cursorSpacing={60} value={filterObj.element} onInput={(e) => setElement(e)} />
</View>
</View>
</Popup>
)
}
<View className='common_safe_area_y'></View>
</View>
</ScrollView>
<View className={styles.btns_con}>
<View className={styles.btns_two}>
<View className={styles.rest_btn} onClick={() => onRest()}>
重置
</View>
<View className={styles.verify_btn} onClick={() => onVerify()}>
确认
</View>
</View>
</View>
</View>
</Popup>
)
}
+110 -77
View File
@@ -1,28 +1,27 @@
import FromList from '@/components/FromList'
import { Button, Input, Text, Textarea, View } from '@tarojs/components'
import Taro, { setNavigationBarTitle, useRouter } from '@tarojs/taro'
import { weightAddApi, weightDetailApi, weightEditApi } from '@/api/weightList'
import { useEffect, useState } from 'react'
import { alert, retrieval } from '@/common/common'
import './index.scss'
import useLogin from '@/use/useLogin'
import FromList from "@/components/FromList"
import { Button, Input, Text, Textarea, View } from "@tarojs/components"
import Taro, { setNavigationBarTitle, useRouter } from "@tarojs/taro"
import {weightAddApi, weightDetailApi,weightEditApi} from "@/api/weightList"
import { useEffect, useState } from "react"
import { alert, retrieval } from "@/common/common"
import "./index.scss"
import useLogin from "@/use/useLogin"
export default ()=>{
export default () => {
useLogin()
const {type,id} = useRouter().params;
useEffect(()=>{
if(type=="add"){
setNavigationBarTitle({title:"添加码单信息"})
}else{
initalFormData();
setNavigationBarTitle({title:"修改码单信息"})
const { type, id } = useRouter().params
useEffect(() => {
if (type == 'add') {
setNavigationBarTitle({ title: '添加码单信息' })
} else {
initalFormData()
setNavigationBarTitle({ title: '修改码单信息' })
}
},[]);
}, [])
// 获取编辑码单信息
const {fetchData: getFromData} = weightDetailApi()
const initalFormData = async ()=>{
const detail = await getFromData({id});
const { fetchData: getFromData } = weightDetailApi()
const initalFormData = async () => {
const detail = await getFromData({ id })
setFormData({
title: detail.data.title,
purchaser_name: detail.data.purchaser_name,
@@ -33,74 +32,108 @@ export default ()=>{
}
// 保存
const [formData, setFormData] = useState({
title: "",
purchaser_name: "",
phone: "",
title: '',
purchaser_name: '',
phone: '',
is_default: false,
id: 0
id: 0,
})
const rules = {
title: [{
message: "请输入抬头"
}],
purchaser_name: [{
message: "请输入客户名称"
}],
phone: [{
message: "请输入正确的电话号码", regex: /^1[3|5|6|9|2|8|7]\d{9}$/
}]
title: [
{
message: '请输入抬头',
},
],
purchaser_name: [
{
message: '请输入客户名称',
},
],
phone: [
{
message: '请输入正确的电话号码',
regex: /^1[3|5|6|9|2|8|7]\d{9}$/,
},
],
}
const {fetchData} = weightAddApi()
const {fetchData: editFetch} = weightEditApi()
const handleSave = ()=>{
retrieval(formData, rules).then(async ()=>{
const result = type=="add"?await fetchData({
title: formData.title,
purchaser_name: formData.purchaser_name,
phone: formData.phone,
is_default: formData.is_default,
}):await editFetch({
title: formData.title,
purchaser_name: formData.purchaser_name,
phone: formData.phone,
is_default: formData.is_default,
id: formData.id
});
if(result.success){
Taro.eventCenter.trigger("weightList:refresh");
Taro.navigateBack();
alert.success("保存成功");
}else{
alert.error(result.msg);
}
}).catch((message)=>{
alert.none(message)
})
const { fetchData } = weightAddApi()
const { fetchData: editFetch } = weightEditApi()
const handleSave = () => {
retrieval(formData, rules)
.then(async () => {
const result =
type == 'add'
? await fetchData({
title: formData.title,
purchaser_name: formData.purchaser_name,
phone: formData.phone,
is_default: formData.is_default,
})
: await editFetch({
title: formData.title,
purchaser_name: formData.purchaser_name,
phone: formData.phone,
is_default: formData.is_default,
id: formData.id,
})
if (result.success) {
Taro.eventCenter.trigger('weightList:refresh')
Taro.navigateBack()
alert.success('保存成功')
} else {
alert.error(result.msg)
}
})
.catch((message) => {
alert.none(message)
})
}
// 监听表单完善
const [hozon, setHozon] = useState(false);
useEffect(()=>{
if(retrieval){
retrieval(formData).then(()=>setHozon(true)).catch(()=>setHozon(false))
const [hozon, setHozon] = useState(false)
useEffect(() => {
if (retrieval) {
retrieval(formData)
.then(() => setHozon(true))
.catch(() => setHozon(false))
}
},[formData])
}, [formData])
return (
<View className="add-address">
<FromList onInput={(ev:any)=>setFormData({...formData,title:ev.detail.value})} value={formData["title"]} label="抬头" placeholder="请输入码单显示抬头信息"/>
<FromList onInput={(ev:any)=>setFormData({...formData,purchaser_name:ev.detail.value})} value={formData["purchaser_name"]} label="客户" placeholder="请输入码单显示客户名称"/>
<FromList onInput={(ev:any)=>setFormData({...formData,phone:ev.detail.value})} value={formData["phone"]} label="联系方式" placeholder="请输入码单显示联系号码"/>
<View className="add-address-default">
<View className='add-address'>
<FromList
onInput={(ev: any) => setFormData({ ...formData, title: ev.detail.value })}
value={formData['title']}
label='抬头'
placeholder='请输入码单显示抬头信息'
/>
<FromList
onInput={(ev: any) => setFormData({ ...formData, purchaser_name: ev.detail.value })}
value={formData['purchaser_name']}
label='客户'
placeholder='请输入码单显示客户名称'
/>
<FromList
onInput={(ev: any) => setFormData({ ...formData, phone: ev.detail.value })}
value={formData['phone']}
label='联系方式'
placeholder='请输入码单显示联系号码'
/>
<View className='add-address-default'>
<Text>设为默认地址</Text>
<View onClick={()=>setFormData({...formData ,is_default: !formData.is_default})}>
{
formData.is_default?<View className="add-address-default-active"><Text className="iconfont icon-tick"/></View>
:<View className="add-address-default-noactive"></View>
}
<View onClick={() => setFormData({ ...formData, is_default: !formData.is_default })}>
{formData.is_default ? (
<View className='add-address-default-active'>
<Text className='iconfont icon-tick' />
</View>
) : (
<View className='add-address-default-noactive'></View>
)}
</View>
</View>
<Button style={{"background": hozon?'#007aff':''}} hoverClass="none" className="add-address-save" onClick={handleSave}>保存</Button>
<Button style={{ background: hozon ? '#007aff' : '' }} hoverClass='none' className='add-address-save' onClick={handleSave}>
保存
</Button>
</View>
)
}