TL; DR: хочу использовать listRef.current.clientWidth для зависимости useEffect.
Я хотел создать список, в котором он автоматически изменяет ширину своего элемента в соответствии с шириной списка. Я так близко, но я не могу обнаружить изменение listRef.current.clientWidth
, которое является шириной <div className="dynamic-list">
. При первом запуске listRef имеет значение null, поэтому у меня не может быть listRef.current.clientWidth
для зависимости useEffect. listRef ? listRef.current.clientWidth : null
для зависимости также не работает с use simple dependency warning
.
const DynamicList = ({
dataSource, renderItem, itemMaxWidth, itemHeight,
margin, height = 500, width = 700 }) => {
const windowWidth = useWindowDimensions().width;
const [itemStyle, setItemStyle] = useState({ width: itemMaxWidth, height: itemHeight });
const [currentWidth, setCurrentWidth] = useState(null);
const listRef = useRef();
useEffect(() => {
if (listRef) {
const num = Math.floor(listRef.current.clientWidth / itemMaxWidth)
console.log(
num,
listRef.current.clientWidth,
listRef.current
)
setItemStyle((pre) => ({
...pre,
height: itemHeight,
margin: margin,
width: (listRef.current.clientWidth / num) - (margin ? margin * 2 : 0),
}))
}
}, [listRef, windowWidth, itemMaxWidth, margin, itemHeight, width])
return (
<div
className="dynamic-list"
ref={listRef}
style={{
width: width,
height: height
}}
>
{
dataSource.map((item, index) => {
return (
<div style={itemStyle} key={index}>
{renderItem(item, index)}
</div>
)
})
}
</div>
);
};
export default DynamicList;
- Буду признателен за любые советы по улучшению этой ситуации.