|
@@ -0,0 +1,187 @@
|
|
|
|
+import React, { useCallback, useEffect, useRef, useState } from 'react'
|
|
|
|
+import styles from './index.module.scss'
|
|
|
|
+import { baseURL, myData } from '@/utils/history'
|
|
|
|
+import LeftTopLogo from '@/components/LeftTopLogo'
|
|
|
|
+import { SearchOutline } from 'antd-mobile-icons'
|
|
|
|
+import { Input } from 'antd-mobile'
|
|
|
|
+import classNames from 'classnames'
|
|
|
|
+import { ZhuanObj } from '@/types'
|
|
|
|
+import A4look from './A4look'
|
|
|
|
+
|
|
|
|
+function A4expert() {
|
|
|
|
+ const [txt, setTxt] = useState('')
|
|
|
|
+
|
|
|
|
+ const [topArr, setTopArr] = useState<string[]>([])
|
|
|
|
+
|
|
|
|
+ const [topAc, setTopAc] = useState('全部')
|
|
|
|
+
|
|
|
|
+ useEffect(() => {
|
|
|
|
+ const types = myData.expert.infoArr.map(v => v.type)
|
|
|
|
+ setTopArr(['全部', ...Array.from(new Set(types))])
|
|
|
|
+ }, [])
|
|
|
|
+
|
|
|
|
+ const [data, setData] = useState(myData.expert.infoArr)
|
|
|
|
+
|
|
|
|
+ const sroolRef = useRef<HTMLDivElement>(null)
|
|
|
|
+
|
|
|
|
+ const sroolRefFu = useCallback(() => {
|
|
|
|
+ if (sroolRef.current) {
|
|
|
|
+ sroolRef.current.scrollTo({ left: 0, behavior: 'smooth' })
|
|
|
|
+ }
|
|
|
|
+ }, [])
|
|
|
|
+
|
|
|
|
+ // 点击切换顶部
|
|
|
|
+ const cutTopFu = useCallback(
|
|
|
|
+ (val: string) => {
|
|
|
|
+ setTopAc(val)
|
|
|
|
+ setTxt('')
|
|
|
|
+ if (val === '全部') setData(myData.expert.infoArr)
|
|
|
|
+ else setData(myData.expert.infoArr.filter(v => v.type === val))
|
|
|
|
+ sroolRefFu()
|
|
|
|
+ },
|
|
|
|
+ [sroolRefFu]
|
|
|
|
+ )
|
|
|
|
+
|
|
|
|
+ // 点击搜索
|
|
|
|
+ const btnSearchFu = useCallback(() => {
|
|
|
|
+ const dataAll =
|
|
|
|
+ topAc === '全部' ? myData.expert.infoArr : myData.expert.infoArr.filter(v => v.type === topAc)
|
|
|
|
+
|
|
|
|
+ setData(
|
|
|
|
+ dataAll.filter(
|
|
|
|
+ v =>
|
|
|
|
+ v.name.includes(txt) ||
|
|
|
|
+ v.name2.includes(txt) ||
|
|
|
|
+ v.zhi.includes(txt) ||
|
|
|
|
+ v.zhuan.includes(txt)
|
|
|
|
+ )
|
|
|
|
+ )
|
|
|
|
+ sroolRefFu()
|
|
|
|
+ }, [sroolRefFu, topAc, txt])
|
|
|
|
+
|
|
|
|
+ // 滚轮
|
|
|
|
+ const mousemoveFu = useCallback((ev: any) => {
|
|
|
|
+ if (sroolRef.current) {
|
|
|
|
+ const nowMove = sroolRef.current.scrollLeft
|
|
|
|
+ // 滚轮
|
|
|
|
+ let num = 50
|
|
|
|
+ if (ev.deltaY < 0) num = -num
|
|
|
|
+ sroolRef.current.scrollLeft = nowMove + num
|
|
|
|
+ }
|
|
|
|
+ }, [])
|
|
|
|
+
|
|
|
|
+ // 点击左右箭头
|
|
|
|
+ const clickIncoFu = useCallback((flag: 1 | -1) => {
|
|
|
|
+ if (sroolRef.current) {
|
|
|
|
+ const numNow = sroolRef.current.scrollLeft
|
|
|
|
+ const moveNum = 500 * flag
|
|
|
|
+ let resNum = numNow + moveNum
|
|
|
|
+ sroolRef.current.scrollTo({ left: resNum, behavior: 'smooth' })
|
|
|
|
+ }
|
|
|
|
+ }, [])
|
|
|
|
+
|
|
|
|
+ // 平时展示 和 鼠标移入的相同dom
|
|
|
|
+ const rowTongDom = useCallback((info: ZhuanObj) => {
|
|
|
|
+ return (
|
|
|
|
+ <>
|
|
|
|
+ <div
|
|
|
|
+ className='A4mRtitle'
|
|
|
|
+ style={{ backgroundImage: `url(${baseURL + 'expert/mjfc.png'})` }}
|
|
|
|
+ >
|
|
|
|
+ {info.name}
|
|
|
|
+ </div>
|
|
|
|
+ <div className='A4mRtitle2'>{info.name2}</div>
|
|
|
|
+ <div className='A4mRtxt'>{info.zhi}</div>
|
|
|
|
+ </>
|
|
|
|
+ )
|
|
|
|
+ }, [])
|
|
|
|
+
|
|
|
|
+ const [opInfo, setOpInfo] = useState({} as ZhuanObj)
|
|
|
|
+
|
|
|
|
+ return (
|
|
|
|
+ <div
|
|
|
|
+ className={styles.A4expert}
|
|
|
|
+ style={{ backgroundImage: `url(${baseURL + myData.expert.bg})` }}
|
|
|
|
+ >
|
|
|
|
+ <LeftTopLogo />
|
|
|
|
+
|
|
|
|
+ <div className='A4top'>
|
|
|
|
+ <img className='A4topll' src={baseURL + 'expert/topBg.png'} alt='' />
|
|
|
|
+ <div className='A4toprr'>
|
|
|
|
+ 类型:
|
|
|
|
+ {topArr.map(v => (
|
|
|
|
+ <div
|
|
|
|
+ onClick={() => cutTopFu(v)}
|
|
|
|
+ className={classNames('A4trRow', topAc === v ? 'A4trRowAc' : '')}
|
|
|
|
+ key={v}
|
|
|
|
+ >
|
|
|
|
+ {v}
|
|
|
|
+ </div>
|
|
|
|
+ ))}
|
|
|
|
+ <div className='A4trInp'>
|
|
|
|
+ <Input
|
|
|
|
+ placeholder='请输入搜索内容'
|
|
|
|
+ value={txt}
|
|
|
|
+ onChange={val => setTxt(val.replace(/\s+/g, ''))}
|
|
|
|
+ onEnterPress={btnSearchFu}
|
|
|
|
+ />
|
|
|
|
+ <div className='A4trInpInco' onClick={btnSearchFu}>
|
|
|
|
+ <SearchOutline />
|
|
|
|
+ </div>
|
|
|
|
+ </div>
|
|
|
|
+ </div>
|
|
|
|
+ </div>
|
|
|
|
+
|
|
|
|
+ <div className='A4main mySorrlNo' ref={sroolRef} onWheel={e => mousemoveFu(e)}>
|
|
|
|
+ {data.length ? (
|
|
|
|
+ <div className='A4mBox' style={{ width: 310 * data.length + 'px' }}>
|
|
|
|
+ {data.map((v, i) => (
|
|
|
|
+ <div className={classNames('A4mRow', i % 2 === 0 ? 'A4mRowOu' : '')} key={v.name}>
|
|
|
|
+ <div>
|
|
|
|
+ <div className='A4mRowShow'>
|
|
|
|
+ <img src={baseURL + v.coveImg} alt='' />
|
|
|
|
+ {rowTongDom(v)}
|
|
|
|
+ </div>
|
|
|
|
+
|
|
|
|
+ <div
|
|
|
|
+ onClick={() => setOpInfo(v)}
|
|
|
|
+ className='A4mRowMoveShow'
|
|
|
|
+ style={{ backgroundImage: `url(${baseURL + 'expert/moveBg.png'})` }}
|
|
|
|
+ >
|
|
|
|
+ {rowTongDom(v)}
|
|
|
|
+
|
|
|
|
+ {/* 底部箭头 */}
|
|
|
|
+ <img
|
|
|
|
+ className='A4mRowMoveShowInco'
|
|
|
|
+ src={baseURL + 'expert/moveInco.png'}
|
|
|
|
+ alt=''
|
|
|
|
+ />
|
|
|
|
+ </div>
|
|
|
|
+ </div>
|
|
|
|
+ </div>
|
|
|
|
+ ))}
|
|
|
|
+ </div>
|
|
|
|
+ ) : (
|
|
|
|
+ <div className='A4mNull'>
|
|
|
|
+ <img src={baseURL + 'goods/null.png'} alt='' />
|
|
|
|
+ <p>暂时没有数据</p>
|
|
|
|
+ <p>请试一下其他关键字</p>
|
|
|
|
+ </div>
|
|
|
|
+ )}
|
|
|
|
+
|
|
|
|
+ {/* 左右箭头 */}
|
|
|
|
+ <div className='A4mIcon' hidden={data.length <= 4}>
|
|
|
|
+ <img onClick={() => clickIncoFu(-1)} src={baseURL + 'expert/left.png'} alt='' />
|
|
|
|
+ <img onClick={() => clickIncoFu(1)} src={baseURL + 'expert/right.png'} alt='' />
|
|
|
|
+ </div>
|
|
|
|
+ </div>
|
|
|
|
+
|
|
|
|
+ {/* 查看详情 */}
|
|
|
|
+ {opInfo.name ? <A4look info={opInfo} closeFu={() => setOpInfo({} as ZhuanObj)} /> : null}
|
|
|
|
+ </div>
|
|
|
|
+ )
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+const MemoA4expert = React.memo(A4expert)
|
|
|
|
+
|
|
|
|
+export default MemoA4expert
|