所以我一直在试图找出一个反应大列表的解决方案。我几乎有了完美的解决方案——但我似乎无法弄清楚如何让这个细节发挥作用。
我有一个我想快速渲染的卡片列表 - 我正在使用 react-window 包
import{VariableSizeList as List} from 'react-window';
我有一个名为 MaterialCard 的组件,以及一个包含 MaterialCard 列表的组件:
在 MaterialCard 上,如果您单击检查按钮 - 它会打开卡片的内部结构,显示表单输入部分。
const [cardOpen, setCardOpen] = useState(false);
const cardInnards = //a bunch of jsx.
//in the return
<button className="btn-inspect" onClick={()=>setCardOpen(!cardOpen)}>inspect/edit</button>
{cardOpen?cardInnards:<div></div>}
在多列表组件容器中 - 我有这个代码。
const materialCardsNew = materialsNew.map((x,i)=><MaterialCard props={x} key ={`${i}matsnew`} />);
//react-window function to make a row:
const Row = array=> ({ index }) => array[index] //is MaterialCard
//in the return
<List
height={755}
itemCount={materialCardsNew.length-1}
itemSize={()=>130} // this is where I'm having trouble.
width={634}
>
{Row(materialCardsNew)}
</List>
目前 itemSize 是我正在尝试修复的...
当前发生的情况是该项目有一个固定大小的区域,它出现在 - 并且(感谢 z-index)内脏出现在列表中的其他项目之上。
我想要发生的是打开的 MaterialCard 的项目大小 - 尺寸更大:这样它不会覆盖其他卡片 - 我希望它扩展并且我不希望它覆盖其他卡片全部。
我的麻烦是我不知道如何从顶部读取组件的内部状态 - 如何在列表容器组件中确定打开了哪个卡。我知道我需要一个函数......但是:嗯......
我想出的伪代码是这样的:这当然是行不通的——但这或多或少是我想做的。
//resize function
const getHeight = (arr)=>(index)=>arr[index].state.cardOpen?500:100; //bigger size if the card is open
//jsx
itemSize={getHeight(materialCardsNew)}
//I've also tried arr[index].style.height,
//and searched through the arr[index] properties in the console to see
//if there was anything I could use... no luck.
我的第一个想法是愚蠢的......我不太确定如何解决这个问题......我很确定我不应该为每个材料卡阵列(有几个类别)需要一个巨大的额外阵列来跟踪哪些卡是打开的......但我似乎无法找到正确的方法来解决这个问题。
我该如何做到这一点?