【发布时间】:2020-07-28 20:02:20
【问题描述】:
我正在尝试使用here 中的masonry-layout 在我的组件中创建一个砌体网格。但是,我遇到了单击组件呈现的元素返回错误TypeError: matchesSelector is not a function 的问题。我将砌体功能移至组件并将其包装在 useEffect 中,这似乎解决了其他渲染问题,但现在它说它无法在点击时触发该功能。
我在想我可能需要在网格上使用useRef,但不确定这里的实现。
我可以在fiddle 中使用纯 JS 来获得我想要的大部分功能,但尝试将其转换为 React 组件。
import React, { useEffect } from 'react';
import Masonry from 'masonry-layout';
const Grid = items => {
useEffect(() => {
const grid = document.querySelector('.grid');
const masonry = new Masonry(grid);
let previouslyEnlarged;
let matchesSelector = () => {};
grid.addEventListener('click', function(event) {
if (!matchesSelector(event.target, '.grid-item')) {
return;
}
if (previouslyEnlarged === event.target) {
return;
} else if (previouslyEnlarged) {
previouslyEnlarged.classList.remove('grid-item--gigante');
}
previouslyEnlarged = event.target;
event.target.classList.toggle('grid-item--gigante');
masonry.layout();
});
});
return (
<div>
<div class="grid">
<div class="grid-holder">{items.map((item, i) => <div class="grid-item">{item.name}</div>)}</div>
</div>
</div>
);
};
export default Grid;
【问题讨论】:
-
你用 let matchesSelector 声明了matchesSelector;但不会将其初始化为任何内容,因此它是未定义的。然后,当您尝试调用它时,它会给出错误,因为它是未定义的。在您的小提琴中,它看起来像是一个全局对象,因为它没有在您的代码中声明,因此请尝试删除您声明 matchSelector 的行。
标签: javascript reactjs masonry