🌈 style(eslint): 修复eslint的报错❌

This commit is contained in:
xuan
2022-12-05 16:30:09 +08:00
parent d93b66e7d5
commit 639112c038
114 changed files with 2209 additions and 2161 deletions
+11 -10
View File
@@ -1,10 +1,10 @@
import { Button, Navigator, ScrollView, Text, View } from '@tarojs/components'
import Taro, { showModal } from '@tarojs/taro'
import { memo, useEffect, useState } from 'react'
import './index.scss'
import { addressDeleteApi, addressListApi } from '@/api/addressManager'
import { alert } from '@/common/common'
import Taro, { showModal } from '@tarojs/taro'
interface Params{
refresherEnabled?: boolean// 是否开启刷新
@@ -15,15 +15,18 @@ interface Params{
}
// 地址列表
const AddressList = memo((props: Params) => {
const AddressList = (props: Params) => {
const { addButtonEnabled = true, focusBorderEnabled = false } = props
const { fetchData, state } = addressListApi()
// 焦点
const [focusId, setFocusId] = useState()
// 获取数据
const getData = async() => {
const result = await fetchData()
if (props.id) {
setFocusId(props.id as any)
}
}
else {
result.data.list?.every((item) => {
if (item.is_default) {
@@ -50,8 +53,6 @@ const AddressList = memo((props: Params) => {
setRefreshState(false)
}
const data = Array.from({ length: 15 })
// 焦点
const [focusId, setFocusId] = useState()
// 列表选择
const handleSelect = (item: any, index: number) => {
props.onSelect && props.onSelect(item, index)
@@ -71,7 +72,7 @@ const AddressList = memo((props: Params) => {
if (result.success) {
alert.success('删除成功')
getData()
}
}
else {
alert.success(result.msg)
}
@@ -90,11 +91,11 @@ const AddressList = memo((props: Params) => {
// data.length>0?
// data.map((item,index)=>{
return (
<View onLongPress={() => handleDelete(item)} onClick={() => handleSelect(item, index)} className={`address-list ${focusId == item.id && 'address-active'}`}>
<View key={item.id} onLongPress={() => handleDelete(item)} onClick={() => handleSelect(item, index)} className={`address-list ${focusId == item.id && 'address-active'}`}>
<View className="address-user">
{item.name}
{
item.is_default
item.is_default
? <Text className="address-list-default">默认</Text>
: <Text className="address-list-phone">{item.phone.replace(item.phone.substring(3, 7), '****')}</Text>
}
@@ -122,6 +123,6 @@ const AddressList = memo((props: Params) => {
{addButtonEnabled && <Navigator url="/pages/addressAdd/index?type=add" hoverClass="none" className="add-address">添加收货地址</Navigator>}
</View>
)
})
}
export default AddressList
export default memo(AddressList)
+7 -10
View File
@@ -16,9 +16,7 @@ interface ListParams {
contentStyle?: object
required?: boolean
}
// 表单列表
const FromList = memo((props: ListParams) => {
const FromList = (props: ListParams) => {
const { type = 'input', value = '', style = {}, labelStyle = {}, contentStyle = {}, required = false } = props
return (
@@ -29,7 +27,7 @@ const FromList = memo((props: ListParams) => {
<View onClick={props?.onClick} className="form-list-right">
{props.children ?? (
<View style={contentStyle} onClick={props?.onClick} className="form-list-right-meet">
{type == 'input'
{type == 'input'
? (
<View className="form-list-input">
<Input
@@ -47,11 +45,11 @@ const FromList = memo((props: ListParams) => {
</View>
)}
</View>
)
: type == 'textarea'
)
: type == 'textarea'
? (
<Textarea value={value} placeholder-class="phcolor" onInput={props?.onInput} placeholder={props.placeholder} />
)
)
: (
<>
{props.value ? <View>{value}</View> : <View className="form-list-right-placeholder">{props.placeholder}</View>}
@@ -65,7 +63,6 @@ const FromList = memo((props: ListParams) => {
</View>
</View>
)
})
}
const A = () => {}
export default FromList
export default memo(FromList)
+7 -10
View File
@@ -16,9 +16,7 @@ interface ListParams {
required?: boolean
showIcon?: boolean // 是否显示右边的箭头,type=select
}
// 表单列表
const FromList = memo((props: ListParams) => {
const FromListCertification = (props: ListParams) => {
const { type = 'input', value = '', style = {}, labelStyle = {}, contentStyle = {}, required = false, showIcon = true } = props
return (
@@ -29,7 +27,7 @@ const FromList = memo((props: ListParams) => {
<View onClick={props?.onClick} className="From-list-certification-right">
{props.children ?? (
<View style={contentStyle} onClick={props?.onClick} className="From-list-certification-right-meet">
{type == 'input'
{type == 'input'
? (
<View className="From-list-certification-input">
<Input
@@ -46,11 +44,11 @@ const FromList = memo((props: ListParams) => {
</View>
)}
</View>
)
: type == 'textarea'
)
: type == 'textarea'
? (
<Textarea value={value} placeholder-class="phcolor" onInput={props?.onInput} placeholder={props.placeholder} />
)
)
: (
<>
{props.value ? <View>{value}</View> : <View className="From-list-certification-right-placeholder">{props.placeholder}</View>}
@@ -62,7 +60,6 @@ const FromList = memo((props: ListParams) => {
</View>
</View>
)
})
}
const A = () => {}
export default FromList
export default memo(FromListCertification)
+33 -32
View File
@@ -1,4 +1,4 @@
import type { ReactNode } from 'react'
import type { ReactNode } from 'react'
import { useEffect, useMemo, useRef, useState } from 'react'
import InfiniteScroll from '@/components/infiniteScroll'
import { dataLoadingStatus, getFilterData } from '@/common/util'
@@ -10,20 +10,22 @@ interface Params {
fetchData: (data: object) => any
change?: (data: any) => void
}
export default (props: Params) => {
const InfiniteScrollPaging = (props: Params) => {
const { query = {} } = props
useEffect(() => {
refreshDataRef.current = refreshData
dataRef.current = data
getData({ moreStatus: true }, { moreStatus: true })
}, [])
useEffect(() => {
if (!isEmptyObject(query)) {
setData({ list: [], total: 0 })
getData({ moreStatus: true }, { moreStatus: true })
}
}, [query])
const refreshDataRef = useRef({})
// 渲染(数据)
const [data, setData] = useState({
list: [],
total: 0,
})
// 加载刷新数据
const [refreshData, setRefreshData] = useState({
refreshStatus: false,
moreStatus: false,
page: 1,
size: 10,
loading: false,
})
const getData = async(startStatus, endStatus) => {
const tRefreshDataRef = refreshDataRef.current as any
setRefreshData({
@@ -45,7 +47,7 @@ export default (props: Params) => {
...endStatus,
loading: false,
})
}
}
else {
setData({
list: result.data.list,
@@ -59,7 +61,7 @@ export default (props: Params) => {
loading: false,
})
}
}
}
else {
alert.none(result.msg)
setRefreshData({
@@ -70,20 +72,7 @@ export default (props: Params) => {
})
}
}
// 加载刷新数据
const [refreshData, setRefreshData] = useState({
refreshStatus: false,
moreStatus: false,
page: 1,
size: 10,
loading: false,
})
const refreshDataRef = useRef({})
// 渲染(数据)
const [data, setData] = useState({
list: [],
total: 0,
})
const dataRef = useRef({})
// 下拉刷新
const handleRefresh = async() => {
@@ -119,7 +108,17 @@ export default (props: Params) => {
const statusMore = useMemo(() => {
return dataLoadingStatus({ list: data.list, total: data.total, status: refreshData.loading })
}, [refreshData.loading])
useEffect(() => {
refreshDataRef.current = refreshData
dataRef.current = data
getData({ moreStatus: true }, { moreStatus: true })
}, [])
useEffect(() => {
if (!isEmptyObject(query)) {
setData({ list: [], total: 0 })
getData({ moreStatus: true }, { moreStatus: true })
}
}, [query])
return (
<InfiniteScroll
refresherEnabled
@@ -127,9 +126,11 @@ export default (props: Params) => {
moreStatus={refreshData.moreStatus}
selfOnRefresherRefresh={handleRefresh}
selfonScrollToLower={handleMoreLoad}
statusMore={statusMore}
statusMore={statusMore}
>
{props.children}
</InfiniteScroll>
)
}
export default InfiniteScrollPaging
+5 -4
View File
@@ -18,14 +18,14 @@ interface Param {
round?: boolean
name?: string
}
export default memo(({ value, onClick, showStatus = false, round = false, name = '' }: Param) => {
const LabAndImg = ({ value, onClick, showStatus = false, round = false, name = '' }: Param) => {
const [imgs, setImgs] = useState<string>('')
// lab是否都是0
const rgbStyle = useMemo(() => {
if (value?.lab && (value?.lab.l || value?.lab.a || value?.lab.b)) {
return { backgroundColor: `rgb(${value.rgb?.r} ${value.rgb?.g} ${value.rgb?.b})` }
}
}
else {
return null
}
@@ -64,7 +64,7 @@ export default memo(({ value, onClick, showStatus = false, round = false, name =
src={imgs}
onError={e => checkLoad(e)}
className={styles.labAndImg_image}
style={{ borderRadius: round ? '50%' : '' }}
style={{ borderRadius: round ? '50%' : '' }}
></Image>
)}
{!value.texture_url && rgbStyle && <View className={styles.boxColor} style={{ ...rgbStyle, borderRadius: round ? '50%' : '' }}></View>}
@@ -76,4 +76,5 @@ export default memo(({ value, onClick, showStatus = false, round = false, name =
<LabAndImgShow value={value} show={labAndImgShow} onClose={closeLabAndImgShow} />
</>
)
})
}
export default memo(LabAndImg)
+9 -9
View File
@@ -15,20 +15,14 @@ export interface colorParams {
onClose?: () => void
showNumber?: number // 图片显示张数,0不限制
}
export default ({ value, show = false, onClose, showNumber = 1 }: colorParams) => {
useEffect(() => {
if (show && rgbStyle) { setLabShow(() => true) }
if (show && value?.texture_url) { onShowImage() }
if (!show) { setLabShow(() => false) }
}, [show])
const LabAndImgShow = ({ value, show = false, onClose, showNumber = 1 }: colorParams) => {
// 显示颜色
const [labShow, setLabShow] = useState(false)
// lab是否都是0
const rgbStyle = useMemo(() => {
if (value?.lab && (value.lab.l || value.lab.a || value.lab.b)) {
return { backgroundColor: `rgb(${value.rgb?.r} ${value.rgb?.g} ${value.rgb?.b})` }
}
}
else {
return null
}
@@ -49,7 +43,11 @@ export default ({ value, show = false, onClose, showNumber = 1 }: colorParams) =
urls: n_res,
})
}
useEffect(() => {
if (show && rgbStyle) { setLabShow(() => true) }
if (show && value?.texture_url) { onShowImage() }
if (!show) { setLabShow(() => false) }
}, [show])
return (
<>
{labShow && (
@@ -63,3 +61,5 @@ export default ({ value, show = false, onClose, showNumber = 1 }: colorParams) =
</>
)
}
export default LabAndImgShow
+3 -3
View File
@@ -8,12 +8,12 @@ interface Params{
}
// 消息提示
const Message = memo((props: Params) => {
const Message = (props: Params) => {
return (
<View className="message-custom-tips">
<Text className="iconfont icon-zhuyi"></Text> {props.text}
</View>
)
})
}
export default Message
export default memo(Message)
+5 -4
View File
@@ -14,7 +14,7 @@ interface ReasonInfoParam {
onClose?: () => void // 关闭
onAdd?: (val: any) => void
}
export default memo(({ show = false, onClose, onAdd }: ReasonInfoParam) => {
const AddCollection = ({ show = false, onClose, onAdd }: ReasonInfoParam) => {
// 获取列表
const [list, setList] = useState([])
const { fetchData: fetchDataList } = FavoriteListApi()
@@ -42,8 +42,8 @@ export default memo(({ show = false, onClose, onAdd }: ReasonInfoParam) => {
</View>
</View>
<ScrollView scrollY className={styles.scrollView}>
{list?.map((item: any) => (
<View onClick={() => onAdd?.(item)} className={styles.collection_item}>
{list?.map((item: any, index) => (
<View key={index} onClick={() => onAdd?.(item)} className={styles.collection_item}>
<View className={styles.name}>
{item.name}
<Text>({item.product_color_list?.length || 0})</Text>
@@ -55,4 +55,5 @@ export default memo(({ show = false, onClose, onAdd }: ReasonInfoParam) => {
</View>
</Popup>
)
})
}
export default memo(AddCollection)
+61 -65
View File
@@ -27,8 +27,7 @@ interface AddresParam {
parent_id?: number
}
export default memo(({
const Address = ({
addressOnSelect,
addressOnChange,
addressOnClose,
@@ -64,52 +63,22 @@ export default memo(({
// 获取地址
const { fetchData } = GetAddressListApi()
useEffect(() => {
getProvince()
}, [])
// 选中内容
const selectItem = (item) => {
setSelectId(item.id)
if (selectIndex == 0) {
setSelectArr([{ name: item.name, id: item.id, level: item.level }])
getCity(item.id)
setAreaStatus(false)
setCityStatus(false)
}
else if (selectIndex == 1) {
setSelectArr([selectArr[0], { name: item.name, id: item.id, level: item.level }])
area(item.id)
}
else {
setSelectArr([selectArr[0], selectArr[1], { name: item.name, id: item.id, level: item.level }])
getDomDes('#address_tab_2')
}
// 获取省市区宽度
const getDomDes = (id) => {
setTimeout(() => {
const query = Taro.createSelectorQuery()
query.select(id).boundingClientRect((rect) => {
const left = rect.left
const clientWidth = rect.width
console.log(clientWidth)
setBottomStyle({
width: `${clientWidth}px`,
left: `${left}px`,
})
}).exec()
}, 100)
}
// 地址数据
useEffect(() => {
if (selectArr && selectArr.length > 0) { addressOnChange?.(selectArr) }
}, [selectArr])
// 选中标题
const onSelectIndex = (index) => {
setSelectIndex(index)
const selectid = selectArr[index] ? selectArr[index].id : 0
setSelectId(selectid as number)
if (index == 0) {
getProvince()
}
else if (index == 1) {
const id = selectArr[0]?.id
getCity(id)
}
else {
const id = selectArr[1]?.id
area(id)
}
}
// 获取省
const getProvince = async() => {
const res = await fetchData({ parent_id: 1 })
@@ -160,28 +129,54 @@ export default memo(({
addressOnClose?.()
addressOnSelect?.(selectArr)
}
// 获取省市区宽度
const getDomDes = (id) => {
setTimeout(() => {
const query = Taro.createSelectorQuery()
query.select(id).boundingClientRect((rect) => {
const left = rect.left
const clientWidth = rect.width
console.log(clientWidth)
setBottomStyle({
width: `${clientWidth}px`,
left: `${left}px`,
})
}).exec()
}, 100)
// 选中标题
const onSelectIndex = (index) => {
setSelectIndex(index)
const selectid = selectArr[index] ? selectArr[index].id : 0
setSelectId(selectid as number)
if (index == 0) {
getProvince()
}
else if (index == 1) {
const id = selectArr[0]?.id
getCity(id)
}
else {
const id = selectArr[1]?.id
area(id)
}
}
// 点击标题栏
const selectTab = (index) => {
onSelectIndex(index)
getDomDes(`#address_tab_${index}`)
}
useEffect(() => {
getProvince()
}, [])
// 选中内容
const selectItem = (item) => {
setSelectId(item.id)
if (selectIndex == 0) {
setSelectArr([{ name: item.name, id: item.id, level: item.level }])
getCity(item.id)
setAreaStatus(false)
setCityStatus(false)
}
else if (selectIndex == 1) {
setSelectArr([selectArr[0], { name: item.name, id: item.id, level: item.level }])
area(item.id)
}
else {
setSelectArr([selectArr[0], selectArr[1], { name: item.name, id: item.id, level: item.level }])
getDomDes('#address_tab_2')
}
}
// 地址数据
useEffect(() => {
if (selectArr && selectArr.length > 0) { addressOnChange?.(selectArr) }
}, [selectArr])
return (
<>
@@ -200,9 +195,9 @@ export default memo(({
<View className={styles.address_list}>
<ScrollView scrollY className={styles.address_scroll}>
<View className={styles.address_scroll_list}>
{list.map((item) => {
{list.map((item, index) => {
return (
<View onClick={() => selectItem(item)} className={classnames(styles.address_list_item, { [styles.addresst_select]: (selectId == item.id) })}>
<View key={index} onClick={() => selectItem(item)} className={classnames(styles.address_list_item, { [styles.addresst_select]: (selectId == item.id) })}>
<View className={styles.address_list_item_name}>{item.name}</View>
{(selectArr[selectIndex]?.id == item.id) && <View className={`iconfont icon-tick ${styles.address_iconfont}`}></View>}
</View>
@@ -215,4 +210,5 @@ export default memo(({
</Drawer>
</>
)
})
}
export default memo(Address)
+17 -19
View File
@@ -19,8 +19,7 @@ interface Param {
onClick?: (val: number) => void // 点击后触发的事件,返回订单状态
fixedBottom?: true | false // 是否固定在底部
}
export default memo(({ orderInfo, onClick, fixedBottom = true }: Param) => {
const AfterOrderBtns = ({ orderInfo, onClick, fixedBottom = true }: Param) => {
// 售后订单状态
const { ReturnStageApplying, ReturnStageWaitCheck, ReturnStageReturned, ReturnStageQualityCheckPendingRefund, ReturnStageServiceOrderPendingRefund }
= AFTER_ORDER_STATUS
@@ -90,19 +89,6 @@ export default memo(({ orderInfo, onClick, fixedBottom = true }: Param) => {
})
}, [orderInfo])
// 点击按钮操作
const submitBtns = throttle((val, index) => {
if (val == 1) {
cancelOrder({ title: '要取消退货吗?', val })
}
else if (val == 6) {
cancelOrder({ title: '要取消退款吗?', val })
}
else {
onClick?.(val)
}
}, 600)
// 取消退货/退款
const { fetchData: returnApplyOrderCancelFetchData } = ReturnApplyOrderCancelApi()
const cancelOrder = ({ title = '', val }) => {
@@ -114,18 +100,29 @@ export default memo(({ orderInfo, onClick, fixedBottom = true }: Param) => {
if (res.success) {
alert.success('取消成功')
onClick?.(val)
}
}
else {
alert.none(res.msg)
}
}
}
else if (res.cancel) {
console.log('用户点击取消')
}
},
})
}
// 点击按钮操作
const submitBtns = throttle((val, index) => {
if (val == 1) {
cancelOrder({ title: '要取消退货吗?', val })
}
else if (val == 6) {
cancelOrder({ title: '要取消退款吗?', val })
}
else {
onClick?.(val)
}
}, 600)
// 显示更多按钮
const [showMore, setShowMore] = useState(false)
const styleTop = useMemo(() => {
@@ -174,4 +171,5 @@ export default memo(({ orderInfo, onClick, fixedBottom = true }: Param) => {
)}
</>
)
})
}
export default memo(AfterOrderBtns)
+3 -2
View File
@@ -8,7 +8,7 @@ interface Param {
number: number // 数字
status: 0|1|2 // 0 小型,1中型,2大
}
export default memo(({ number = 0, status = 1 }: Param) => {
const AmountShow = ({ number = 0, status = 1 }: Param) => {
const priceDom = useCallback(() => {
const res = number.toFixed(2).split('.')
const int_num = `${parseInt(res[0])}`
@@ -26,4 +26,5 @@ export default memo(({ number = 0, status = 1 }: Param) => {
{priceDom()}
</View>
)
})
}
export default memo(AmountShow)
+7 -7
View File
@@ -12,16 +12,12 @@ interface params {
swiperOnClick?: (val: item) => void
style?: Object
}
export default (props: params) => {
const Banner = (props: params) => {
const { swiperOnClick, style = {} } = props
const [list, setList] = useState<any[]>([])
const { fetchData, state } = GetBannerList()
useEffect(() => {
getData()
}, [])
const getData = async() => {
const res = await fetchData()
setList(res.data?.list)
@@ -30,7 +26,7 @@ export default (props: params) => {
const skipTo = (item) => {
if (item.jump_type == 2 || item.jump_type == 0) {
goLink(`${item.link}&title=${item.title}`)
}
}
else {
goLink(item.link)
}
@@ -39,7 +35,9 @@ export default (props: params) => {
const showDot = useMemo(() => {
return list.length > 1
}, [list])
useEffect(() => {
getData()
}, [])
return (
<View className={styles.swiper_con} style={style}>
<Swiper className={styles.xswiper} indicatorColor="#ccc" indicatorActiveColor="#fff" circular indicatorDots={showDot} autoplay>
@@ -56,3 +54,5 @@ export default (props: params) => {
</View>
)
}
export default Banner
+5 -3
View File
@@ -8,7 +8,7 @@ interface params {
show?: true|false
onClose?: () => void
}
export default ({ show, onClose }: params) => {
const BindSalesmanPopup = ({ show, onClose }: params) => {
const onCustomer = async() => {
const res = await Taro.showModal({
title: '是否拨打服务热线',
@@ -46,5 +46,7 @@ export default ({ show, onClose }: params) => {
<View className={styles.bindSalesman_mask} onClick={onClose}></View>
</View>}
</>
)
}
)
}
export default BindSalesmanPopup
+15 -12
View File
@@ -8,7 +8,7 @@ import SearchInput from '@/components/searchInput'
import Popup from '@/components/bluetooth/Popup'
import useCheckAuthorize from '@/use/useCheckAuthorize'
export default memo(() => {
const LinkBlueTooth = () => {
const { state, init, startScan, connect, disconnect } = useBluetooth()
const { check } = useCheckAuthorize({ scope: 'scope.bluetooth', msg: '请开启小程序蓝牙权限' })
@@ -21,10 +21,10 @@ export default memo(() => {
useEffect(() => {
if (!state.available) {
setLinkStatus(1)
}
}
else if (state.available && state.connected?.name) {
setLinkStatus(3)
}
}
else {
setLinkStatus(2)
}
@@ -40,6 +40,9 @@ export default memo(() => {
}
const [popupShow, setPopupShow] = useState(false)
const onFindEven = () => {
if (!state.discovering && !state.connected && !state.connecting) { startScan() }
}
// 显示设备列表
const onFindDevice = () => {
check().then((res) => {
@@ -48,16 +51,13 @@ export default memo(() => {
title: '请打开手机蓝牙',
icon: 'none',
})
}
}
else {
setPopupShow(true)
onFindEven()
}
})
}
const onFindEven = () => {
if (!state.discovering && !state.connected && !state.connecting) { startScan() }
}
// 断开链接
const onDisconnect = () => {
@@ -72,9 +72,11 @@ export default memo(() => {
<View className={styles.bluetooth_link} onClick={onFindDevice}>
<View className={classnames(styles.link_status, linkStatus == 3 && styles.link_statused, linkStatus == 2 && styles.link_statused_no)}></View>
{
linkStatus == 1 && <View className={classnames(styles.link_name, styles.link_name_no)}>请开启蓝牙</View>
|| linkStatus == 2 && <View className={classnames(styles.link_name, styles.link_name_no_link)}>未连接设备</View>
|| linkStatus == 3 && <View className={classnames(styles.link_name)}>{linkName}</View>
linkStatus == 1
? <View className={classnames(styles.link_name, styles.link_name_no)}>请开启蓝牙</View>
: linkStatus == 2
? <View className={classnames(styles.link_name, styles.link_name_no_link)}>未连接设备</View>
: linkStatus == 3 ? <View className={classnames(styles.link_name)}>{linkName}</View> : null
}
</View>
</SearchInput>
@@ -89,5 +91,6 @@ export default memo(() => {
</View>
</>
)
})
)
}
export default memo(LinkBlueTooth)
+37 -29
View File
@@ -12,8 +12,7 @@ interface params {
onOff: () => void
onFind: () => void
}
export default memo(({ state, show = false, onClose, onLink, onOff, onFind }: params) => {
const Bluetooth = ({ state, show = false, onClose, onLink, onOff, onFind }: params) => {
const [popupShow, setPopupShow] = useState(show)
useEffect(() => {
setPopupShow(show)
@@ -31,38 +30,46 @@ export default memo(({ state, show = false, onClose, onLink, onOff, onFind }: pa
<View className={style.list}>
<ScrollView scrollY className={style.scroll}>
{
(state.devices && state.devices.length > 0) && state?.devices.map((item) => {
return (
<View className={style.item} onClick={() => onLink(item)}>
<View>{item.name}</View>
{
(!state.connecting && !state.connected) && <View >链接</View>
|| (state.connecting && item.deviceId == state.connecting.deviceId) && <View className={style.link_ing}>正在链接...</View>
|| (state.connected && item.deviceId == state.connected.deviceId) && <View className={style.link_success}>链接成功</View>
}
</View>
)
})
|| <View className={style.noDevice}>
{
(!state.discovering) && <>
<View>暂无设备,请按以下条件检查</View>
<View className={style.n_item}>1.请确保取色仪处于激活状态</View>
<View className={style.n_item}>2.请确保取色仪没有链接其他设备</View>
<View className={style.n_item}>3.请打开手机定位</View>
</>
|| <View>设备搜索中</View>
}
(state.devices && state.devices.length > 0)
? state?.devices.map((item, key) => {
return (
<View key={key} className={style.item} onClick={() => onLink(item)}>
<View>{item.name}</View>
{
(!state.connecting && !state.connected)
? <View >链接</View>
: (state.connecting && item.deviceId == state.connecting.deviceId)
? <View className={style.link_ing}>正在链接...</View>
: (state.connected && item.deviceId == state.connected.deviceId)
? <View className={style.link_success}>链接成功</View>
: null
}
</View>
)
})
: <View className={style.noDevice}>
{
(!state.discovering)
? <>
<View>暂无设备,请按以下条件检查</View>
<View className={style.n_item}>1.请确保取色仪处于激活状态</View>
<View className={style.n_item}>2.请确保取色仪没有链接其他设备</View>
<View className={style.n_item}>3.请打开手机定位</View>
</>
: <View>设备搜索中</View>
}
</View>
</View>
}
</ScrollView>
</View>
{
state.connected && <View className={`${style.footer} ${style.footer_off}`} onClick={onOff}>断开链接</View>
|| (!state.connected && state.discovering) && <View className={`${style.footer} ${style.finding}`}>搜索中<Loading width={30} color="orange" /></View>
|| <View className={style.footer} onClick={onFind}>重新搜索</View>
state.connected
? <View className={`${style.footer} ${style.footer_off}`} onClick={onOff}>断开链接</View>
: (!state.connected && state.discovering)
? <View className={`${style.footer} ${style.finding}`}>搜索中<Loading width={30} color="orange" /></View>
: <View className={style.footer} onClick={onFind}>重新搜索</View>
}
</View>
<View className={style.mask} onClick={onCloseListener}></View>
@@ -70,4 +77,5 @@ export default memo(({ state, show = false, onClose, onLink, onOff, onFind }: pa
}
</>
)
})
}
export default memo(Bluetooth)
+4 -3
View File
@@ -9,14 +9,14 @@ interface params {
status?: false | true // 是否选中
disabled?: false | true // 是否禁用
}
export default forwardRef(({ onSelect, onClose, status = false, disabled = false }: params, ref) => {
const Checkbox = ({ onSelect, onClose, status = false, disabled = false }: params, ref) => {
const [selected, SetSelected] = useState(false)
const onSelectEven = () => {
if (disabled) { return false }
const res = !selected
if (res) {
onSelect?.()
}
}
else {
onClose?.()
}
@@ -37,4 +37,5 @@ export default forwardRef(({ onSelect, onClose, status = false, disabled = false
</View>
</>
)
})
}
export default forwardRef(Checkbox)
+3 -3
View File
@@ -6,8 +6,7 @@ interface Params {
onClose?: () => void
styleObj?: Object
}
export default memo(({ onClose, styleObj = {} }: Params) => {
const CloseBtn = ({ onClose, styleObj = {} }: Params) => {
return (
<View
style={styleObj}
@@ -17,4 +16,5 @@ export default memo(({ onClose, styleObj = {} }: Params) => {
<Text className={`iconfont icon-qingkong ${style.icon_a_btn}`}></Text>
</View>
)
})
}
export default memo(CloseBtn)
+33 -32
View File
@@ -1,7 +1,7 @@
import { CustomWrapper, Input, View } from '@tarojs/components'
import { memo, useEffect, useMemo, useRef, useState } from 'react'
import Big from 'big.js'
import styles from './index.module.scss'
import styles from './index.module.scss'
interface params {
minNum?: number // 最小值
@@ -16,11 +16,8 @@ interface params {
disabled?: true | false // 是否禁用
returnZero?: true | false // 少于最小值时是否归0
}
export default memo((props: params) => {
return <Counter {...props}></Counter>
})
const Counter = memo((props: params) => {
const CounterDisplayName = (props: params) => {
const {
minNum = 0,
maxNum = 10000,
@@ -35,6 +32,22 @@ const Counter = memo((props: params) => {
disabled = false,
} = props
const [value, setValue] = useState<any>({ count: defaultNum })
// 保留小数
const formatDigits = (num) => {
num = `${num}`
if (num.includes('.')) {
const res = num.split('.')
if (digits > 0) {
const last_num = res[1].substr(0, digits)
return `${res[0]}.${last_num}`
}
else {
return res[0]
}
}
return parseFloat(num)
}
useEffect(() => {
setValue({ count: defaultNum })
}, [defaultNum])
@@ -54,7 +67,7 @@ const Counter = memo((props: params) => {
let num_res = Big(count).minus(step).toNumber()
if (returnZero) {
num_res = num_res < minNum ? 0 : num_res
}
}
else {
num_res = num_res < minNum ? minNum : num_res
}
@@ -63,23 +76,6 @@ const Counter = memo((props: params) => {
onClickBtn?.(parseFloat(num_res))
}
// 保留小数
const formatDigits = (num) => {
num = `${num}`
if (num.includes('.')) {
const res = num.split('.')
if (digits > 0) {
const last_num = res[1].substr(0, digits)
return `${res[0]}.${last_num}`
}
else {
return res[0]
}
}
return parseFloat(num)
}
// 检查数据
const checkData = (val) => {
const num = parseFloat(val)
@@ -92,19 +88,19 @@ const Counter = memo((props: params) => {
const res = e.detail.value
if (res === '') {
onChange?.(minNum)
}
else if (!isNaN(Number(res))) {
}
else if (!Number.isNaN(Number(res))) {
let count = formatDigits(res)
count = checkData(count)
onChange?.(parseFloat(count as string))
}
}
else {
const num = parseFloat(res)
if (!isNaN(num)) {
if (!Number.isNaN(num)) {
let count = formatDigits(num)
count = checkData(count)
onChange?.(count as number)
}
}
else {
onChange?.(defaultNum)
}
@@ -116,13 +112,13 @@ const Counter = memo((props: params) => {
if (e.detail.value == '') {
onBlue?.(minNum)
setValue({ count: minNum })
}
else if (!isNaN(num)) {
}
else if (!Number.isNaN(num)) {
let count = formatDigits(num)
count = checkData(count)
setValue({ count })
onBlue?.(count as number)
}
}
else {
setValue({ count: minNum })
onBlue?.(minNum)
@@ -142,4 +138,9 @@ const Counter = memo((props: params) => {
</View>
</View>
)
})
}
const Counter = memo(CounterDisplayName)
const CounterWithMemo = (props: params) => {
return <Counter {...props}></Counter>
}
export default memo(CounterWithMemo)
+3 -2
View File
@@ -2,7 +2,7 @@ import { View } from '@tarojs/components'
import { memo } from 'react'
import styles from './index.module.scss'
export default memo(() => {
const DotLoading = () => {
return (
<>
<View className={styles.load_box}>
@@ -14,4 +14,5 @@ export default memo(() => {
</View>
</>
)
})
}
export default memo(DotLoading)
+11 -10
View File
@@ -17,7 +17,7 @@ interface Param {
messageShow?: true|false
numberFormat?: 'number'|'text' // 数字还是字符串
}
export default memo(({ number = 0, titleStatus = true, title = '', messageTitle = '', numberStatus = 1, messageWidth = 430, messageShow = false, numberFormat = 'number' }: Param) => {
const EstimeatedAmount = ({ number = 0, titleStatus = true, title = '', messageTitle = '', numberStatus = 1, messageWidth = 430, messageShow = false, numberFormat = 'number' }: Param) => {
const [show, setShow] = useState(messageShow)
const onClose = () => {
setShow(false)
@@ -28,14 +28,6 @@ export default memo(({ number = 0, titleStatus = true, title = '', messageTitle
const [style, setStyle] = useState<{ top: string }>()
useEffect(() => {
if (show) {
getDomDes('#message')
}
else {
setStyle(() => ({ top: '0' }))
}
}, [show])
// 设置弹出层高度
const getDomDes = (id) => {
setTimeout(() => {
@@ -46,6 +38,14 @@ export default memo(({ number = 0, titleStatus = true, title = '', messageTitle
}).exec()
}, 0)
}
useEffect(() => {
if (show) {
getDomDes('#message')
}
else {
setStyle(() => ({ top: '0' }))
}
}, [show])
return (
<>
<View className={styles.order_price}>
@@ -62,4 +62,5 @@ export default memo(({ number = 0, titleStatus = true, title = '', messageTitle
</View>
</>
)
})
}
export default memo(EstimeatedAmount)
+3 -2
View File
@@ -11,7 +11,7 @@ type params = {
onFiltr?: (val: object) => void // 确定搜索
onRest?: (val: Object) => void // 重置
} & PopuParams
export default memo(({ onClose, onFiltr, show = false, onRest }: params) => {
const Filter = ({ onClose, onFiltr, show = false, onRest }: params) => {
// 搜索条件
const [filterObj, setFilterObj] = useState({
seriesName: '',
@@ -145,4 +145,5 @@ export default memo(({ onClose, onFiltr, show = false, onRest }: params) => {
</View>
</Popup>
)
})
}
export default memo(Filter)
+7 -5
View File
@@ -4,13 +4,13 @@ import classnames from 'classnames'
import { useEffect, useState } from 'react'
import styles from './index.module.scss'
import Popup from '@/components/popup'
import type { Params as PopuParams } from '@/components/popup'
import type { Params as PopuParams } from '@/components/popup'
import { GetProductKindListApi } from '@/api/material'
type params = {
onFiltr?: (val: object) => void
} & PopuParams
export default ({ onClose, onFiltr, show = false }: params) => {
const FilterV2 = ({ onClose, onFiltr, show = false }: params) => {
// 搜索条件
const [filterObj, setFilterObj] = useState({
seriesId: '',
@@ -64,9 +64,9 @@ export default ({ onClose, onFiltr, show = false }: params) => {
const setNumber = (e, field) => {
console.log(e)
const num = parseFloat(e.detail.value)
if (isNaN(num)) {
if (Number.isNaN(num)) {
filterObj[field] = null
}
}
else {
filterObj[field] = parseFloat(num.toFixed(2))
}
@@ -90,7 +90,7 @@ export default ({ onClose, onFiltr, show = false }: params) => {
<View
key={item.id}
onClick={() => changeKind(item)}
className={classnames(styles.btn_item, filterObj.seriesId == item.id && styles.select_btn_item)}
className={classnames(styles.btn_item, filterObj.seriesId == item.id && styles.select_btn_item)}
>
{item.name}
</View>
@@ -167,3 +167,5 @@ export default ({ onClose, onFiltr, show = false }: params) => {
</Popup>
)
}
export default FilterV2
+25 -22
View File
@@ -1,5 +1,5 @@
import { ScrollView, View } from '@tarojs/components'
import type { ReactNode } from 'react'
import type { ReactNode } from 'react'
import { memo, useMemo, useState } from 'react'
import LoadingCard from '../loadingCard'
import style from './index.module.scss'
@@ -25,7 +25,7 @@ interface Params {
refresherTriggered?: true|false
refresherEnabled?: true|false
}
export default memo(({
const InfiniteScroll = ({
styleObj,
selfonScrollToLower,
selfOnScrollToUpper,
@@ -91,28 +91,31 @@ export default memo(({
refresherBackground="#F8F8F8"
scrollTop={scrollTop}
>
{!moreStatus && <>
<View style={{ paddingBottom: `${paddingBottom}rpx` }} className={style.scrollViewCon}>
{children}
</View>
</>
|| <>
{(statusMore == 2 || statusMore == 3) && <View style={{ paddingBottom: `${paddingBottom}rpx` }} className={style.scrollViewCon}>
{children}
<View className={style.infinite_scroll}>
{
(statusMore == 2) && <View className={style.loading_more}>加载中<DotLoading /></View>
|| <View className={style.noMore}>没有更多数据了</View>
}
</View>
</View>
}
{(statusMore == 0) && <LoadingCard />}
{(statusMore == 1) && <LoadingCard loadingIcon={false} title="暂无数据" />}
</>}
{!moreStatus
? <>
<View style={{ paddingBottom: `${paddingBottom}rpx` }} className={style.scrollViewCon}>
{children}
</View>
</>
: <>
{(statusMore == 2 || statusMore == 3) && <View style={{ paddingBottom: `${paddingBottom}rpx` }} className={style.scrollViewCon}>
{children}
<View className={style.infinite_scroll}>
{
(statusMore == 2)
? <View className={style.loading_more}>加载中<DotLoading /></View>
: <View className={style.noMore}>没有更多数据了</View>
}
</View>
</View>
}
{(statusMore == 0) && <LoadingCard />}
{(statusMore == 1) && <LoadingCard loadingIcon={false} title="暂无数据" />}
</>}
<View className="common_safe_area_y"></View>
</ScrollView>
</>
)
})
}
export default memo(InfiniteScroll)
+6 -5
View File
@@ -1,13 +1,13 @@
import { View } from '@tarojs/components'
import { memo, useMemo } from 'react'
import style from './index.module.scss'
import style from './index.module.scss'
export default memo(({ width = 60, color = '#6190e8' }: { width?: number; color?: string }) => {
const Loading = ({ width = 60, color = '#6190e8' }: { width?: number; color?: string }) => {
const styleObj = useMemo(() => {
let obj = {}
if (width > 0) { obj = { width: `${width}rpx`, height: `${width}rpx` } }
if (color) { obj = { ...obj, borderColor: `${color} transparent transparent` } }
return obj
return obj
}, [width, color])
console.log('loading:::')
return (
@@ -18,5 +18,6 @@ export default memo(({ width = 60, color = '#6190e8' }: { width?: number; color?
<View style={styleObj} className={style.loading__ring}></View>
<View style={styleObj} className={style.loading__ring}></View>
</View>
)
})
)
}
export default memo(Loading)
+3 -2
View File
@@ -8,7 +8,7 @@ interface Params {
title?: string
loadingIcon?: false|true
}
export default memo(({
const LoadingCard = ({
styleLoading = {},
title = '加载中...', // 显示的文字
loadingIcon = true, // 是否显示加载图标
@@ -22,4 +22,5 @@ export default memo(({
</View>
</>
)
})
}
export default memo(LoadingCard)
+5 -3
View File
@@ -1,6 +1,6 @@
import { MovableArea, MovableView, View } from '@tarojs/components'
import Taro, { useDidShow, useReady, useRouter } from '@tarojs/taro'
import type { ReactElement } from 'react'
import type { ReactElement } from 'react'
import { useEffect, useLayoutEffect, useRef, useState } from 'react'
import classnames from 'classnames'
import styles from './index.module.scss'
@@ -12,7 +12,7 @@ interface param {
children?: ReactElement | null
onClick?: () => void
}
export default ({ children = null, onClick }: param) => {
const MoveBtn = ({ children = null, onClick }: param) => {
// 获取购物车数据数量
const { getShopCount, commonData } = useCommonData()
@@ -45,7 +45,7 @@ export default ({ children = null, onClick }: param) => {
inertia
x="630rpx"
y={`${screenHeight}rpx`}
onTouchEnd={e => dragEnd(e)}
onTouchEnd={e => dragEnd(e)}
>
<View className={classnames('iconfont', 'icon-gouwuche', styles.shop_icon)}></View>
{commonData.shopCount > 0 && <View className={styles.product_num}>{commonData.shopCount > 99 ? '99+' : commonData.shopCount}</View>}
@@ -53,3 +53,5 @@ export default ({ children = null, onClick }: param) => {
</MovableArea>
)
}
export default MoveBtn
+31 -33
View File
@@ -25,8 +25,7 @@ interface Param {
showStatus?: 'detail' | 'list' // 订单详情,订单列表
onClick?: (val: number) => void // 点击后触发的事件,返回订单状态
}
export default memo(({ orderInfo, showStatus = 'detail', onClick }: Param) => {
const OrderBtns = ({ orderInfo, showStatus = 'detail', onClick }: Param) => {
// 订单状态枚举
const {
SaleOrderStatusBooking,
@@ -161,28 +160,6 @@ export default memo(({ orderInfo, showStatus = 'detail', onClick }: Param) => {
const { ApplyGoods } = SUBSCRIPTION_MESSAGE_SCENE
const { openSubscriptionMessage } = UseSubscriptionMessage()
// 点击按钮操作
const submitBtns = throttle(async(val, index) => {
if (val == 1) {
cancelOrder()
}
else if (val == 6) {
receiveOrder()
}
else if (val == 5) {
applyProduct()
}
else if (val == 3) {
bigApplyRefurn()
}
else if (val == 8) {
applyRefund()
}
else {
onClick?.(val)
}
}, 800)
// 大货申请退款
const bigApplyRefurn = () => {
Taro.showModal({
@@ -191,7 +168,7 @@ export default memo(({ orderInfo, showStatus = 'detail', onClick }: Param) => {
if (res.confirm) {
await openSubscriptionMessage({ orderId: orderInfo?.orderId, scenes: ApplyGoods.value })
onClick?.(3)
}
}
else {
console.log('用户点击取消')
}
@@ -210,11 +187,11 @@ export default memo(({ orderInfo, showStatus = 'detail', onClick }: Param) => {
if (res.success) {
alert.success('取消成功')
onClick?.(1)
}
}
else {
alert.none(res.msg)
}
}
}
else if (res.cancel) {
console.log('用户点击取消')
}
@@ -234,12 +211,12 @@ export default memo(({ orderInfo, showStatus = 'detail', onClick }: Param) => {
if (res.success) {
onClick?.(6)
alert.success('收货成功')
}
}
else {
alert.error('收货失败')
}
alert.hideLoading()
}
}
else if (res.cancel) {
console.log('用户点击取消')
}
@@ -259,13 +236,13 @@ export default memo(({ orderInfo, showStatus = 'detail', onClick }: Param) => {
const res = await fetchDataApplyRefund({ sale_order_id: orderInfo?.orderId })
if (res.success) {
alert.success('申请成功')
}
}
else {
alert.error('申请失败')
}
alert.hideLoading()
onClick?.(8)
}
}
else if (res.cancel) {
console.log('用户点击取消')
}
@@ -285,7 +262,27 @@ export default memo(({ orderInfo, showStatus = 'detail', onClick }: Param) => {
const styleTop = useMemo(() => {
return { top: `-${(orderBtnsShowList.length - 3) * 70 + 10}rpx`, left: `-${10}rpx` }
}, [orderBtnsShowList])
// 点击按钮操作
const submitBtns = throttle(async(val, index) => {
if (val == 1) {
cancelOrder()
}
else if (val == 6) {
receiveOrder()
}
else if (val == 5) {
applyProduct()
}
else if (val == 3) {
bigApplyRefurn()
}
else if (val == 8) {
applyRefund()
}
else {
onClick?.(val)
}
}, 800)
return (
<View className={styles.btns_list}>
{orderBtnsShowList.length > 3 && (
@@ -321,4 +318,5 @@ export default memo(({ orderInfo, showStatus = 'detail', onClick }: Param) => {
</View>
</View>
)
})
}
export default memo(OrderBtns)
+6 -5
View File
@@ -1,6 +1,6 @@
import { View } from '@tarojs/components'
import classnames from 'classnames'
import type { ReactNode } from 'react'
import type { ReactNode } from 'react'
import { memo, useEffect, useMemo, useRef } from 'react'
import style from './index.module.scss'
import CloseBtnIcon from '@/components/closeBtn'
@@ -16,7 +16,7 @@ export interface Params {
position?: 'bottom'|'top'|'right' // 弹出位置
animationEnd?: () => void // 弹出动画结束
}
export default memo((
const Popup = (
{
title = '标题',
show = false,
@@ -26,14 +26,14 @@ export default memo((
children,
position = 'bottom',
animationEnd,
}: Params) => {
}: Params) => {
const animationTime = useRef<any>(null)
useEffect(() => {
if (show) {
animationTime.current = setTimeout(() => {
animationEnd?.()
}, 260)
}
}
else {
clearTimeout(animationTime.current)
}
@@ -72,4 +72,5 @@ export default memo((
</View>
</>
)
})
}
export default memo(Popup)
+4 -2
View File
@@ -10,7 +10,7 @@ interface Params {
desStatus?: true | false
productList?: any[]
}
export default ({ desStatus = true, productList = [] }: Params) => {
const Product = ({ desStatus = true, productList = [] }: Params) => {
const labAndImgObj = useCallback(
(item) => {
return { lab: item.lab, rgb: item.rgb, texture_url: item.texture_url }
@@ -21,7 +21,7 @@ export default ({ desStatus = true, productList = [] }: Params) => {
<View className={styles.products_list}>
{productList?.map((item) => {
return (
<View className={styles.products_item} onClick={() => goLink(`/pages/details/index?id=${item.id}`)}>
<View key={item.id} className={styles.products_item} onClick={() => goLink(`/pages/details/index?id=${item.id}`)}>
<View className={styles.item_img}>
<LabAndImg value={labAndImgObj(item)} />
<View className={styles.num}>{item.product_color_count}色</View>
@@ -44,3 +44,5 @@ export default ({ desStatus = true, productList = [] }: Params) => {
</View>
)
}
export default Product
+87 -91
View File
@@ -20,99 +20,95 @@ interface Params {
defaultValue?: string
borderRadius?: string
}
const Search = (
{
clickOnSearch, // 点击筛选按钮触发
changeOnSearch, // 输入文字触发
disabled = false, // 是否禁用
placeholder = '输入搜索内容',
showIcon = true, // 是否显示关闭图标
showBtn = false, // 是否显示搜索按钮
btnStyle = {},
placeIcon = 'inner', // 搜索图标位置:inner在里面,out在外面
btnTitle = '搜索', // 搜索文字
debounceTime = 0, // 防抖时间,不设默认为零
defaultValue = '', // 默认值
borderRadius = '50rpx',
}: Params,
ref,
) => {
const [inputCon, setInputCon] = useState('')
const debounceTimeRef = useRef(0)
useEffect(() => {
setInputCon(defaultValue)
}, [defaultValue])
useEffect(() => {
debounceTimeRef.current = debounceTime
}, [debounceTime])
const clearInput = () => {
setInputCon('')
changeOnSearch?.('')
}
const changeData = debounce((value) => {
setInputCon(value)
changeOnSearch?.(value)
}, debounceTimeRef.current)
const onInputEven = (e) => {
const value = e.detail.value
changeData(value)
}
const onSearch = () => {
clickOnSearch?.(inputCon)
}
useImperativeHandle(ref, () => ({
clearInput,
}))
return (
<>
<View className={styles.search_main}>
<View className={styles.search_con}>
{showIcon && (
<View
className={classnames(
'iconfont',
'icon-sousuo',
styles.icon_a_sousuo1_self,
placeIcon == 'inner' ? styles.icon_inner : styles.icon_out,
)}
></View>
)}
<Input
style={{ borderRadius }}
alwaysEmbed
cursorSpacing={150}
placeholderStyle="color:#ABABAB; font-size:26rpx"
onConfirm={onSearch}
className={classnames(placeIcon == 'out' && styles.input_out)}
disabled={disabled}
value={inputCon}
placeholder={placeholder}
onInput={e => onInputEven(e)}
></Input>
{!!inputCon && (
<View className={styles.search_closeBtn}>
<CloseBtn onClose={() => clearInput()} styleObj={{ width: '20rpx', height: '20rpx', backgroundColor: '#fff', border: '0' }} />
</View>
)}
</View>
{showBtn && (
<View style={btnStyle} className={styles.btn} onClick={onSearch}>
{btnTitle}
</View>
)}
</View>
</>
)
}
export default memo(
forwardRef(
(
{
clickOnSearch, // 点击筛选按钮触发
changeOnSearch, // 输入文字触发
disabled = false, // 是否禁用
placeholder = '输入搜索内容',
showIcon = true, // 是否显示关闭图标
showBtn = false, // 是否显示搜索按钮
btnStyle = {},
placeIcon = 'inner', // 搜索图标位置:inner在里面,out在外面
btnTitle = '搜索', // 搜索文字
debounceTime = 0, // 防抖时间,不设默认为零
defaultValue = '', // 默认值
borderRadius = '50rpx',
}: Params,
ref,
) => {
const [inputCon, setInputCon] = useState('')
const debounceTimeRef = useRef(0)
useEffect(() => {
setInputCon(defaultValue)
}, [defaultValue])
useEffect(() => {
debounceTimeRef.current = debounceTime
}, [debounceTime])
const onInputEven = (e) => {
const value = e.detail.value
changeData(value)
}
useImperativeHandle(ref, () => ({
clearInput,
}))
const clearInput = () => {
setInputCon('')
changeOnSearch?.('')
}
const changeData = debounce((value) => {
setInputCon(value)
changeOnSearch?.(value)
}, debounceTimeRef.current)
const onSearch = () => {
clickOnSearch?.(inputCon)
}
return (
<>
<View className={styles.search_main}>
<View className={styles.search_con}>
{showIcon && (
<View
className={classnames(
'iconfont',
'icon-sousuo',
styles.icon_a_sousuo1_self,
placeIcon == 'inner' ? styles.icon_inner : styles.icon_out,
)}
></View>
)}
<Input
style={{ borderRadius }}
alwaysEmbed
cursorSpacing={150}
placeholderStyle="color:#ABABAB; font-size:26rpx"
onConfirm={onSearch}
className={classnames(placeIcon == 'out' && styles.input_out)}
disabled={disabled}
value={inputCon}
placeholder={placeholder}
onInput={e => onInputEven(e)}
></Input>
{!!inputCon && (
<View className={styles.search_closeBtn}>
<CloseBtn onClose={() => clearInput()} styleObj={{ width: '20rpx', height: '20rpx', backgroundColor: '#fff', border: '0' }} />
</View>
)}
</View>
{showBtn && (
<View style={btnStyle} className={styles.btn} onClick={onSearch}>
{btnTitle}
</View>
)}
</View>
</>
)
},
Search,
),
)
+4 -4
View File
@@ -1,5 +1,5 @@
import { Input, View } from '@tarojs/components'
import type { ReactNode } from 'react'
import type { ReactNode } from 'react'
import { ReactHTMLElement, memo, useDebugValue, useMemo } from 'react'
import styles from './index.module.scss'
@@ -17,8 +17,7 @@ interface Params {
titleStyle?: Object
styleObj?: Object
}
export default memo((props: Params) => {
const SearchInput = (props: Params) => {
const {
showTitle = true,
title = '标题',
@@ -60,4 +59,5 @@ export default memo((props: Params) => {
{showIcon && <View className={`iconfont icon-jiantou ${styles.icon_more_self}`}></View>}
</View>
)
})
}
export default memo(SearchInput)
@@ -7,7 +7,7 @@ import MCheckbox from '@/components/checkbox'
import Counter from '@/components/counter'
import LabAndImg from '@/components/LabAndImg'
import { formatHashTag, formatImgUrl, formatPriceDiv } from '@/common/fotmat'
import type { saleModeType } from '@/common/enum'
import type { saleModeType } from '@/common/enum'
interface param {
sale_model: saleModeType
@@ -15,8 +15,7 @@ interface param {
onChangeCount: (val: any) => any
item: any
}
export default memo((props: param) => {
const ProductItem = (props: param) => {
const { onChangeCount, onChangeSelect, item, sale_model } = props
const selectCallBack = useCallback(() => {
@@ -99,4 +98,5 @@ export default memo((props: param) => {
</View>
</View>
)
})
}
export default memo(ProductItem)
+11 -9
View File
@@ -25,7 +25,7 @@ interface param {
intoStatus?: 'again' | 'shop'
default_sale_mode?: number // 面料类型(0:大货, 1:剪版,2:散剪
}
export default ({ show = false, onClose, intoStatus = 'shop', default_sale_mode }: param) => {
const ShowCartCopy = ({ show = false, onClose, intoStatus = 'shop', default_sale_mode }: param) => {
const selectList = [
{ value: 0, title: '大货', unit: '条', eunit: 'kg', step: 1, digits: 0, minNum: 1, maxNum: 100000, defaultNum: 1 },
{ value: 1, title: '剪板', unit: '米', eunit: 'm', step: 1, digits: 2, minNum: 0.5, maxNum: 9.99, defaultNum: 1 },
@@ -56,7 +56,7 @@ export default ({ show = false, onClose, intoStatus = 'shop', default_sale_mode
list?.map((item) => {
if (selectIndex == item.sale_mode || selectIndex == -1) {
checkboxData[item.id] = true
}
}
else {
checkboxData[item.id] = false
}
@@ -95,7 +95,7 @@ export default ({ show = false, onClose, intoStatus = 'shop', default_sale_mode
if (!show) {
setList([])
setSelectIndex(default_sale_mode || 0)
}
}
else {
setLoading(true)
initStatus.current = true
@@ -174,14 +174,14 @@ export default ({ show = false, onClose, intoStatus = 'shop', default_sale_mode
title: '成功',
icon: 'success',
})
}
}
else {
Taro.showToast({
title: res.msg,
icon: 'none',
})
}
}
}
else if (res.cancel) {
console.log('用户点击取消')
}
@@ -251,14 +251,14 @@ export default ({ show = false, onClose, intoStatus = 'shop', default_sale_mode
getSelectId()
if (selectIds.current.length == 0) {
alert.error('请选择面料')
}
}
else {
const ids = selectIds.current.join('-')
setParam({ ids, sale_mode: selectIndex }) // 临时存储
closePopup()
if (intoStatus == 'again') {
goLink('/pages/order/comfirm', {}, 'redirectTo')
}
}
else {
goLink('/pages/order/comfirm')
}
@@ -311,7 +311,7 @@ export default ({ show = false, onClose, intoStatus = 'shop', default_sale_mode
<View
key={item.value}
onClick={() => selectProduct(item.value)}
className={classnames(styles.search_item, selectIndex == item.value && styles.search_item_select)}
className={classnames(styles.search_item, selectIndex == item.value && styles.search_item_select)}
>
{item.title}
</View>
@@ -327,7 +327,7 @@ export default ({ show = false, onClose, intoStatus = 'shop', default_sale_mode
return (
<View
key={item}
className={classnames(styles.product_item, selectIndex != -1 && selectIndex != item.sale_mode && styles.no_product_item_select)}
className={classnames(styles.product_item, selectIndex != -1 && selectIndex != item.sale_mode && styles.no_product_item_select)}
>
<View className={styles.checkbox}>
<MCheckbox
@@ -416,3 +416,5 @@ export default ({ show = false, onClose, intoStatus = 'shop', default_sale_mode
</View>
)
}
export default ShowCartCopy
+53 -60
View File
@@ -38,7 +38,7 @@ interface modelClassType {
defaultNum: number
eunit: string
}
export default ({ show = false, onClose, intoStatus = 'shop', default_sale_mode }: param) => {
const ShopCart = ({ show = false, onClose, intoStatus = 'shop', default_sale_mode }: param) => {
const selectList: modelClassType[] = [
{ value: 0, title: '大货', unit: '条', eunit: 'kg', step: 1, digits: 0, minNum: 1, maxNum: 100000, defaultNum: 1 },
{ value: 1, title: '剪板', unit: '米', eunit: 'm', step: 1, digits: 2, minNum: 0.5, maxNum: 9.99, defaultNum: 1 },
@@ -58,13 +58,6 @@ export default ({ show = false, onClose, intoStatus = 'shop', default_sale_mode
}
}, [default_sale_mode])
useEffect(() => {
startTransition(() => {
resetList()
setSelectStatus(true)
})
}, [selectIndex])
// 获取购物车数据数量
const { getShopCount } = useCommonData()
@@ -72,12 +65,6 @@ export default ({ show = false, onClose, intoStatus = 'shop', default_sale_mode
const [list, setList] = useState<Record<number, any>>({})
const [loading, setLoading] = useState(false)
const { fetchData: getShoppingFetchData } = GetShoppingCartApi()
const getShoppingCart = async() => {
const { data } = await getShoppingFetchData()
const color_list = data.color_list || []
initList(color_list)
setLoading(false)
}
// 更新单条数据
const getShoppingCartInfo = async(item) => {
@@ -106,7 +93,7 @@ export default ({ show = false, onClose, intoStatus = 'shop', default_sale_mode
// 初始化全部数据默认勾选
const initList = (color_list) => {
const obj = {}
color_list?.map((item) => {
color_list?.forEach((item) => {
item.selected = selectIndex == item.sale_mode
const { unit, eunit, step, digits, minNum, maxNum } = selectList[item.sale_mode]
item = { ...item, unit, eunit, step, digits, minNum, maxNum }
@@ -114,13 +101,18 @@ export default ({ show = false, onClose, intoStatus = 'shop', default_sale_mode
})
setList(() => ({ ...obj }))
}
const getShoppingCart = async() => {
const { data } = await getShoppingFetchData()
const color_list = data.color_list || []
initList(color_list)
setLoading(false)
}
// 重置勾选数据
const resetList = () => {
Object.values(list)?.map((item) => {
Object.values(list)?.forEach((item) => {
if (selectIndex == item.sale_mode) {
item.selected = true
}
}
else {
item.selected = false
}
@@ -129,12 +121,14 @@ export default ({ show = false, onClose, intoStatus = 'shop', default_sale_mode
setList(() => ({ ...list }))
}
// 绑定业务员和电话号码
const [showBindSalesman, setShowBindSalesman] = useState(false)
// 显示时展示数据
useEffect(() => {
if (!show) {
setList({})
setSelectIndex(default_sale_mode || 0)
}
}
else {
setLoading(true)
getShoppingCart()
@@ -150,7 +144,7 @@ export default ({ show = false, onClose, intoStatus = 'shop', default_sale_mode
// 全选反选
const [selectStatus, setSelectStatus] = useState(false)
const selectAll = () => {
Object.values(list)?.map((item) => {
Object.values(list)?.forEach((item) => {
if (selectIndex == item.sale_mode) {
item.selected = !selectStatus
list[item.id] = { ...item }
@@ -164,7 +158,7 @@ export default ({ show = false, onClose, intoStatus = 'shop', default_sale_mode
useEffect(() => {
let list_count = 0
let select_count = 0
Object.values(list)?.map((item) => {
Object.values(list)?.forEach((item) => {
if (selectIndex == item.sale_mode) {
list_count++
if (item.selected) { select_count++ }
@@ -172,7 +166,18 @@ export default ({ show = false, onClose, intoStatus = 'shop', default_sale_mode
})
setSelectStatus(select_count == list_count)
}, [list])
// 计数组件-当后端修改完成才修改前端显示
const { fetchData: fetchDataUpdateShoppingCart } = UpdateShoppingCartApi()
const getInputValue = debounce(async(item) => {
const res = await fetchDataUpdateShoppingCart({ id: item.id, roll: item.roll, length: item.length })
if (res.success) {
console.log('item修改::', item)
getShoppingCartInfo(item)
}
else {
setList(e => ({ ...e }))
}
}, 300)
// 修改数量
const onChangeCount = useCallback((item) => {
getInputValue(item)
@@ -188,7 +193,16 @@ export default ({ show = false, onClose, intoStatus = 'shop', default_sale_mode
onClose?.()
setShowPopup(false)
}
// 获取面料选中的id
const selectIds = useRef<number[]>([])
const getSelectId = () => {
selectIds.current = []
Object.values(list)?.forEach((item) => {
if (selectIndex == item.sale_mode) {
item.selected && selectIds.current.push(item.id)
}
})
}
// 删除购物车内容
const { fetchData: delShopFetchData } = DelShoppingCartApi()
const delSelect = () => {
@@ -206,14 +220,14 @@ export default ({ show = false, onClose, intoStatus = 'shop', default_sale_mode
title: '成功',
icon: 'success',
})
}
}
else {
Taro.showToast({
title: res.msg,
icon: 'none',
})
}
}
}
else if (res.cancel) {
console.log('用户点击取消')
}
@@ -221,24 +235,13 @@ export default ({ show = false, onClose, intoStatus = 'shop', default_sale_mode
})
}
// 获取面料选中的id
const selectIds = useRef<number[]>([])
const getSelectId = () => {
selectIds.current = []
Object.values(list)?.map((item) => {
if (selectIndex == item.sale_mode) {
item.selected && selectIds.current.push(item.id)
}
})
}
// 预估金额和总条数
const estimatePrice = useMemo(() => {
let estimate_amount = 0
const product_list = new Set() // 面料
let color_count = 0 // 颜色数量
let all_count = 0 // 总数量
Object.values(list)?.map((item) => {
Object.values(list)?.forEach((item) => {
if (item.selected) {
estimate_amount += item.estimate_amount
product_list.add(item.product_id)
@@ -256,10 +259,10 @@ export default ({ show = false, onClose, intoStatus = 'shop', default_sale_mode
}, [list])
// 去结算
const { fetchData: useFetchData } = GetAdminUserInfoApi()
const { fetchData: FetchData } = GetAdminUserInfoApi()
const { fetchData: applyOrderAccessFetchData } = ApplyOrderAccessApi()
const orderDetail = throttle(async() => {
const res = await useFetchData()
const res = await FetchData()
if (res.data.order_access_status !== 3) {
if (res.data.order_access_status == 1) { applyOrderAccessFetchData() }
setShowBindSalesman(() => true)
@@ -269,36 +272,20 @@ export default ({ show = false, onClose, intoStatus = 'shop', default_sale_mode
getSelectId()
if (selectIds.current.length == 0) {
alert.error('请选择面料')
}
}
else {
const ids = selectIds.current.join('-')
setParam({ ids, sale_mode: selectIndex }) // 临时存储
closePopup()
if (intoStatus == 'again') {
goLink('/pages/order/comfirm', null, 'redirectTo')
}
}
else {
goLink('/pages/order/comfirm')
}
}
}, 500)
// 计数组件-当后端修改完成才修改前端显示
const { fetchData: fetchDataUpdateShoppingCart } = UpdateShoppingCartApi()
const getInputValue = debounce(async(item) => {
const res = await fetchDataUpdateShoppingCart({ id: item.id, roll: item.roll, length: item.length })
if (res.success) {
console.log('item修改::', item)
getShoppingCartInfo(item)
}
else {
setList(e => ({ ...e }))
}
}, 300)
// 绑定业务员和电话号码
const [showBindSalesman, setShowBindSalesman] = useState(false)
// 显示图片弹窗
const [showLabImage, setShowLabImage] = useState(false)
const [labImageValue, setLabImageValue] = useState()
@@ -314,7 +301,12 @@ export default ({ show = false, onClose, intoStatus = 'shop', default_sale_mode
onClose?.()
goLink('/pages/index/index', null, 'switchTab')
}, [])
useEffect(() => {
startTransition(() => {
resetList()
setSelectStatus(true)
})
}, [selectIndex])
return (
<View className={styles.shop_cart_main}>
<Popup showTitle={false} show={showPopup} onClose={() => closePopup()}>
@@ -333,7 +325,7 @@ export default ({ show = false, onClose, intoStatus = 'shop', default_sale_mode
<View
key={item.value}
onClick={() => selectProduct(item.value)}
className={classnames(styles.search_item, selectIndex == item.value && styles.search_item_select)}
className={classnames(styles.search_item, selectIndex == item.value && styles.search_item_select)}
>
{item.title}
</View>
@@ -346,7 +338,7 @@ export default ({ show = false, onClose, intoStatus = 'shop', default_sale_mode
<InfiniteScroll moreStatus={false}>
<View className={styles.product_list}>
{listData?.map((item) => {
return <ProductItem sale_model={selectIndex} onChangeCount={onChangeCount} onChangeSelect={onChangeSelect} item={item} />
return <ProductItem key={item.id} sale_model={selectIndex} onChangeCount={onChangeCount} onChangeSelect={onChangeSelect} item={item} />
})}
</View>
</InfiniteScroll>
@@ -388,3 +380,4 @@ export default ({ show = false, onClose, intoStatus = 'shop', default_sale_mode
</View>
)
}
export default ShopCart
+121 -124
View File
@@ -1,9 +1,9 @@
import { ScrollView, View } from '@tarojs/components'
import Taro, { getCurrentInstance, useReady, useRouter } from '@tarojs/taro'
import type { ReactNode } from 'react'
import type { ReactNode } from 'react'
import React, { memo, useEffect, useLayoutEffect, useRef, useState } from 'react'
import classnames from 'classnames'
import type { StatusParam } from '../infiniteScroll'
import type { StatusParam } from '../infiniteScroll'
import InfiniteScroll from '../infiniteScroll'
import LoadingCard from '../loadingCard'
import styles from './index.module.scss'
@@ -24,136 +24,133 @@ interface Params {
statusMore?: StatusParam
selectClass?: (val: number) => void
}
const SideBar = ({
list = [],
defaultValue = 0,
height = '100vh',
sideBarOnClick,
children,
heightItem = 108,
refresherTriggered = false,
selfOnRefresherRefresh,
selfOnScrolltolower,
hasMore = true,
statusMore = 0,
selectClass,
}: Params) => {
const num_half = useRef(0)
export default memo(
({
list = [],
defaultValue = 0,
height = '100vh',
sideBarOnClick,
children,
heightItem = 108,
refresherTriggered = false,
selfOnRefresherRefresh,
selfOnScrolltolower,
hasMore = true,
statusMore = 0,
selectClass,
}: Params) => {
const num_half = useRef(0)
const [selected, setSelected] = useState(defaultValue)
const [tabId, setTabId] = useState('')
const [selected, setSelected] = useState(defaultValue)
const [tabId, setTabId] = useState('')
useEffect(() => {
setSelected(defaultValue)
}, [defaultValue])
const init = () => {
const index = list?.findIndex((item) => {
return item.id == defaultValue
})
if (index !== -1) {
computeSelectTab(index)
}
const computeSelectTab = (index) => {
if (index + 1 > num_half.current) {
const num = index + 1 - num_half.current
setTabId(list[num].id.toString())
}
else {
setTabId(list[0].id.toString())
}
}
const clickEvent = ({ item, index }: { item; index: number }) => {
setSelected(item.id)
sideBarOnClick?.(item)
// 二级面料系列分类
const [openClass, setOpenClass] = useState(false)
const [classList, setClassList] = useState([])
const [classId, setClassId] = useState(-1)
const { fetchData } = GetClassList()
const getClassData = async(id) => {
const res = await fetchData({ id })
if (res.success) {
if (res.data?.list.length > 0) {
res.data.list = [{ id: -1, name: '全部' }, ...res.data.list]
}
setClassList(() => res.data?.list)
}
}
useEffect(() => {
if (selected) { getClassData(selected) }
}, [selected])
const getSelectClass = (id) => {
selectClass?.(id)
setClassId(() => id)
}
const init = () => {
const index = list?.findIndex((item) => {
return item.id == defaultValue
})
if (index !== -1) {
computeSelectTab(index)
setClassId(-1)
selectClass?.(-1)
}
}
const computeSelectTab = (index) => {
if (index + 1 > num_half.current) {
const num = index + 1 - num_half.current
setTabId(list[num].id.toString())
}
else {
setTabId(list[0].id.toString())
}
}
useEffect(() => {
Taro.nextTick(() => {
const query = Taro.createSelectorQuery()
query
.select('.side_bar_select')
.boundingClientRect((rect) => {
console.log('rect::', rect)
const clientHeight = rect.height
const clientWidth = rect.width
const ratio = 750 / clientWidth
const height = clientHeight * ratio
num_half.current = Math.ceil(height / 2 / heightItem)
console.log('num_half::', num_half)
init()
})
.exec()
})
}, [])
// 二级面料系列分类
const [openClass, setOpenClass] = useState(false)
const [classList, setClassList] = useState([])
const [classId, setClassId] = useState(-1)
const { fetchData } = GetClassList()
const getClassData = async(id) => {
const res = await fetchData({ id })
if (res.success) {
if (res.data?.list.length > 0) {
res.data.list = [{ id: -1, name: '全部' }, ...res.data.list]
}
setClassList(() => res.data?.list)
}
}
useEffect(() => {
if (selected) { getClassData(selected) }
}, [selected])
const getSelectClass = (id) => {
selectClass?.(id)
setClassId(() => id)
}
return (
<>
<View className={classnames(styles.sideBar_main, 'side_bar_select')}>
<ScrollView scrollWithAnimation style={{ height }} className={styles.sideBar_select} scrollY scrollIntoView={`tab_${tabId}`}>
{list?.map((item, index) => {
return (
<View className={styles.sideBar_select_title} id={`tab_${item.id}`} key={item.id} style={{ height: `${heightItem}rpx` }}>
<View
className={classnames(styles.sideBar_select_title_item, { [styles.sideBar_select_title_select]: selected == item.id })}
onClick={() => clickEvent({ item, index })}
>
<View className={styles.title_con}>{item.name}</View>
</View>
const clickEvent = ({ item, index }: { item; index: number }) => {
setSelected(item.id)
sideBarOnClick?.(item)
computeSelectTab(index)
setClassId(-1)
selectClass?.(-1)
}
useEffect(() => {
setSelected(defaultValue)
}, [defaultValue])
useEffect(() => {
Taro.nextTick(() => {
const query = Taro.createSelectorQuery()
query
.select('.side_bar_select')
.boundingClientRect((rect) => {
console.log('rect::', rect)
const clientHeight = rect.height
const clientWidth = rect.width
const ratio = 750 / clientWidth
const height = clientHeight * ratio
num_half.current = Math.ceil(height / 2 / heightItem)
console.log('num_half::', num_half)
init()
})
.exec()
})
}, [])
return (
<>
<View className={classnames(styles.sideBar_main, 'side_bar_select')}>
<ScrollView scrollWithAnimation style={{ height }} className={styles.sideBar_select} scrollY scrollIntoView={`tab_${tabId}`}>
{list?.map((item, index) => {
return (
<View className={styles.sideBar_select_title} id={`tab_${item.id}`} key={item.id} style={{ height: `${heightItem}rpx` }}>
<View
className={classnames(styles.sideBar_select_title_item, { [styles.sideBar_select_title_select]: selected == item.id })}
onClick={() => clickEvent({ item, index })}
>
<View className={styles.title_con}>{item.name}</View>
</View>
)
})}
</ScrollView>
<View className={styles.sideBar_con} style={{ paddingTop: classList.length > 0 ? '90rpx' : '20rpx' }}>
{classList.length > 0 && (
<View className={styles.product_class} style={{ height: openClass ? '100%' : '' }}>
<ProductClass list={classList} open={openClass} onOpenClick={val => setOpenClass(val)} onSelect={getSelectClass} defaultSelectId={classId} />
</View>
)}
<InfiniteScroll
statusMore={statusMore}
hasMore={hasMore}
selfonScrollToLower={() => selfOnScrolltolower?.()}
refresherTriggered={refresherTriggered}
refresherEnabled
selfOnRefresherRefresh={() => selfOnRefresherRefresh?.()}
>
{children}
</InfiniteScroll>
</View>
)
})}
</ScrollView>
<View className={styles.sideBar_con} style={{ paddingTop: classList.length > 0 ? '90rpx' : '20rpx' }}>
{classList.length > 0 && (
<View className={styles.product_class} style={{ height: openClass ? '100%' : '' }}>
<ProductClass list={classList} open={openClass} onOpenClick={val => setOpenClass(val)} onSelect={getSelectClass} defaultSelectId={classId} />
</View>
)}
<InfiniteScroll
statusMore={statusMore}
hasMore={hasMore}
selfonScrollToLower={() => selfOnScrolltolower?.()}
refresherTriggered={refresherTriggered}
refresherEnabled
selfOnRefresherRefresh={() => selfOnRefresherRefresh?.()}
>
{children}
</InfiniteScroll>
</View>
</>
)
},
</View>
</>
)
}
export default memo(
SideBar,
)
+5 -4
View File
@@ -9,7 +9,7 @@ interface params {
sortValue?: { desc: string; asc: string } // 排序规则,后端制定
}
type sortParam = 'none'|'top'|'bottom'
export default forwardRef(({ status = 'none', onChange, sortValue }: params, ref) => {
const SortBtn = ({ status = 'none', onChange, sortValue }: params, ref) => {
const [sortStatus, setSortStatus] = useState<sortParam>()
useEffect(() => {
setSortStatus(() => status)
@@ -19,11 +19,11 @@ export default forwardRef(({ status = 'none', onChange, sortValue }: params, ref
let value = ''
if (sortStatus == 'none') {
status = 'top'
value = sortValue?.asc!
value = sortValue?.asc as string
}
if (sortStatus == 'top') {
status = 'bottom'
value = sortValue?.desc!
value = sortValue?.desc as string
}
if (sortStatus == 'bottom') { status = 'none' }
setSortStatus(() => status)
@@ -42,4 +42,5 @@ export default forwardRef(({ status = 'none', onChange, sortValue }: params, ref
</View>
</>
)
})
}
export default forwardRef(SortBtn)
+4 -4
View File
@@ -1,5 +1,5 @@
import { ScrollView, View } from '@tarojs/components'
import type { ReactNode } from 'react'
import type { ReactNode } from 'react'
import { memo, useEffect, useState } from 'react'
import classnames from 'classnames'
import styles from './index.module.scss'
@@ -17,8 +17,7 @@ interface Params {
style?: Object
}
export default memo(({ list = [], defaultValue = 0, tabsOnClick, style = {} }: Params) => {
const Tabs = ({ list = [], defaultValue = 0, tabsOnClick, style = {} }: Params) => {
const [selected, setSelected] = useState(defaultValue)
const [tabId, setTabId] = useState('')
@@ -57,4 +56,5 @@ export default memo(({ list = [], defaultValue = 0, tabsOnClick, style = {} }: P
</View>
</>
)
})
}
export default memo(Tabs)
+6 -4
View File
@@ -11,7 +11,7 @@ interface Param {
defaultValue?: string
onlyRead?: false|true
}
export default memo(({ onChange, title = '', placeholder = '请输入', defaultValue, onlyRead = false }: Param) => {
const TextareaEnhance = ({ onChange, title = '', placeholder = '请输入', defaultValue, onlyRead = false }: Param) => {
const [descData, setDescData] = useState({
number: 0,
value: '',
@@ -38,11 +38,13 @@ export default memo(({ onChange, title = '', placeholder = '请输入', defaultV
<View className={styles.other_desc}>
<View className={styles.title}>{title}</View>
<View className={styles.textarea}>
{(descData.show && !onlyRead) && <Textarea autoFocus value={descData.value} onBlur={() => toggleShowRealTextarea(false)} className={styles.textarea_con} cursorSpacing={100} maxlength={descData.count} onInput={e => getDesc(e.detail.value)}></Textarea>
|| <View className={classnames(styles.textarea_con_pretend, descData.value && styles.textarea_con_pretend_ed)} onClick={() => toggleShowRealTextarea(true)}>{descData.value || placeholder}</View>
{(descData.show && !onlyRead)
? <Textarea autoFocus value={descData.value} onBlur={() => toggleShowRealTextarea(false)} className={styles.textarea_con} cursorSpacing={100} maxlength={descData.count} onInput={e => getDesc(e.detail.value)}></Textarea>
: <View className={classnames(styles.textarea_con_pretend, descData.value && styles.textarea_con_pretend_ed)} onClick={() => toggleShowRealTextarea(true)}>{descData.value || placeholder}</View>
}
<View className={styles.descDataNum}>{`${descData.number}/${descData.count}`}</View>
</View>
</View>
)
})
}
export default memo(TextareaEnhance)