import React, { useState, useImperativeHandle, useRef, useCallback, useEffect, useMemo, } from "react"; import InfoCard from "./InfoCard"; import Row from "../Row"; const gutter = 20; const cardBottom = 20; const InfoCardList = React.forwardRef((props, ref) => { const { mainKey, speed = 50, span = 4, withClassify = false, autoNext = true, classifyKey = { name: "name", children: "children" }, pageFinished, type = "move", extraColumnsOpt, ...otherProps } = props; const sizeRef = useRef(); const infoCardListRef = useRef(); const pageBoxRef = useRef(); const pageRef = useRef(1); const [data, setData] = useState([]); const [energy, setEnergy] = useState([]); const [autoScroll, setAutoScroll] = useState([0, 0]); const classifyRef = useRef([]); const classifyBoxRef = useRef(); const pageSize = useMemo(() => Math.floor(24 / span), [span]); const totalPage = useMemo(() => { if (withClassify) { let { children } = classifyKey; let size = 0; classifyRef.current = []; data.forEach((item) => { let itemPageSize = Math.ceil((item[children].length || 0) / pageSize); size += itemPageSize; classifyRef.current.push(size); }); return size; } else return Math.ceil(data.length / pageSize); }, [data, pageSize, withClassify, classifyKey]); const [pageHeight, setPageHeight] = useState(0); const setActiveClassify = useCallback( (page) => { if (!classifyBoxRef.current) return; let classifyIndex = classifyRef.current.findIndex((maxPageSize) => page <= maxPageSize) || 0; let { name } = classifyKey; let oprationname = data?.[classifyIndex]?.[name].split("】")[1]; let text = oprationname === undefined ? "" : "- " + oprationname; if (text) { classifyBoxRef.current.style.display = "block"; classifyBoxRef.current.innerText = text; } else classifyBoxRef.current.style.display = "none"; }, [data] ); const setPageBoxCss = useCallback( (page) => { pageRef.current = page; setActiveClassify(page); pageBoxRef.current.style.transition = page === 1 ? "none" : "transform 0.3s"; pageBoxRef.current.style.transform = `translateY(${ -(page - 1) * (pageHeight + cardBottom) }px)`; }, [pageHeight, setActiveClassify] ); const nextPage = useCallback(() => { // console.log(); let page = pageRef.current; if (page + 1 > totalPage) { if (autoNext) { setPageBoxCss(1); } else { pageFinished && pageFinished(); } } else { setPageBoxCss(page + 1); } }, [totalPage]); const moveChecking = useCallback(() => { let { offsetWidth, scrollWidth } = infoCardListRef.current; setAutoScroll([offsetWidth, scrollWidth]); }, [data]); const pageChecking = useCallback(() => { let { scrollHeight, offsetHeight } = sizeRef.current; setPageHeight(scrollHeight); }, []); useEffect(() => { if (type === "move") { let innerWindow = sizeRef.current.contentDocument.defaultView; innerWindow.addEventListener("resize", moveChecking); moveChecking(); return () => { innerWindow.removeEventListener("resize", moveChecking); }; } }, [moveChecking]); useEffect(() => { if (type === "page") { let innerWindow = sizeRef.current.contentDocument.defaultView; innerWindow.addEventListener("resize", pageChecking); pageChecking(); return () => { innerWindow.removeEventListener("resize", pageChecking); }; } }, [pageChecking]); useEffect(() => { setPageBoxCss(1); }, [data, setPageBoxCss]); useImperativeHandle( ref, () => ({ setData: (data) => { setData(data); setPageBoxCss(1); }, setEnergy:(data)=>{ setEnergy(data); }, nextPage, }), [nextPage] ); return (
{type === "move" && (
{data.map((item) => { return (
); })}
)} {type === "page" && (
{withClassify === true && (
)}
{console.log("ernergy",energy)} {/* {props.energy ?? `日期:${props.energy[0]} 水: ${props.energy[0].water} 电: ${1} 气: ${1}`} */} { energy.map(x=>{ return ( 日期:{x.time}  水: {x.water}  电: {x.electricity}  气: {x.gas} ) })}
{withClassify === false && ( {data.map((item) => { let extraColumns = []; if (extraColumnsOpt) { let { key, name, val, max } = extraColumnsOpt; let extraData = item[key]; extraData.forEach((i, index) => { if (index < max) extraColumns.push({ title: i[name], text: i[val] }); }); } return (
); })}
)} {withClassify === true && data.map((item) => { let { name, children } = classifyKey; return ( {item[children].map((item) => { let extraColumns = []; if (extraColumnsOpt) { let { key, name, val, max } = extraColumnsOpt; let extraData = item[key]; extraData.forEach((i, index) => { if (index < max) extraColumns.push({ title: i[name], text: i[val], }); }); } return (
); })}
); })}
)}
); }); export default InfoCardList;