#javascript #reactjs
Вопрос:
Я совсем новичок в react и просто немного борюсь за то, чтобы он работал должным образом. Итак, вот фрагмент из файла JS, и мне нужно преобразовать его в react.
let squares = document.getElementsByClassName("square");
for (let i = 0; i < squares.length; i ) {
squares[i].addEventListener("mouseenter", () => {
squares[i].classList.add("light");
setTimeout(function () {
squares[i].classList.remove("light");
}, 800);
});
}
В этом компоненте react у меня есть только несколько дивов с именем класса=»квадрат».
export default function SomeComponent() {
return (
<div className="row ">
<div className="square"></div>
<div className="square"></div>
<div className="square"></div>
<div className="square"></div>
<div className="square"></div>
<div className="square"></div>
<div className="square"></div>
<div className="square"></div>
<div className="square"></div>
<div className="square"></div>
</div>
);
}
Комментарии:
1. С какой частью вы боретесь? Не могли бы вы быть немного более конкретными?
Ответ №1:
Создайте компонент для каждого квадрата.
Верните из него JSX div.
Создайте состояние в этом компоненте для light
(по умолчанию для false
).
Если light
верно, добавьте класс в список имен классов для div ( classnames
модуль полезен здесь).
Добавьте функцию onMouseOver, которая устанавливает состояние light
в значение true.
Добавьте useEffect
крючок, который зависит от значения light
. Внутри этого крючка используйте setTimeout
, чтобы изменить состояние обратно на false
после определенного периода времени.
Комментарии:
1. useEffect (() = > { задержка const = setTimeout (() = > > { setHovered(ложь); }, 800); возврат () =>>> clearTimeout(задержка); }, []);
2. Выглядит ли это так, как должно выглядеть?
3. Это выглядит разумно.
4. @Marty если это тот ответ, который вы ищете, пожалуйста, примите его (похоже, вы знаете, как это сделать😀), чтобы это помогло другим людям.
Ответ №2:
хоро, ты можешь это проверить? и это онлайн-демонстрация
constructor(props) {
super(props);
this.state = {
name: 'React',
currentIndx: undefined,
doms: Array.from({length: 10}).fill(1)
};
}
handleMouse = (index: number) => {
this.setState({
currentIndx: index
});
setTimeout(() => {
this.setState({
currentIndx: undefined
})
}, 1000)
}
render() {
const { doms, currentIndx } = this.state;
return (
<div>
<Hello name={this.state.name} />
<p>
Start editing to see some magic happen :)
</p>
<div>
{doms.map((item, index) => (<div onMouseEnter={() => this.handleMouse(index)} className={`square ${currentIndx === index ? 'light': ''}`} key={index}>{index}</div>))}
</div>
</div>
);
}
Ответ №3:
Самый простой способ сделать это было бы что-то вроде этого
import React, { useState } from "react";
const ListItem = () => {
const [hovered, setHovered] = useState(false);
return (
<div
onMouseEnter={() => setHovered(true)}
onMouseLeave={() => setHovered(false)}
className={`square ${hovered ? 'light' : ''}`}
/>
);
}
const List = () => {
return (
<div className="row">
<ListItem />
<ListItem />
<ListItem />
<ListItem />
<ListItem />
<ListItem />
<ListItem />
<ListItem />
<ListItem />
<ListItem />
</div>
);
}
Ответ №4:
Сначала создайте квадратный компонент;
import React, { useState } from "react";
import "./Square.css";
export const Square = () => {
const [light, setLight] = useState(false);
const mouseOver = () => {
setLight(!light);
};
return (
<div onMouseOver={mouseOver} className={light ? "light" : null}>
Square
</div>
);
};
export default Square;
Затем на вашей странице; импортируйте его и используйте
import React from 'react'
import './App.css'
import Square from './components/Square'
function App() {
return (
<div className="container">
{Array(3)
.fill(' ')
.map((item) => {
return (
<tr>
<td className="space">
<Square />
</td>
<td className="space">
<Square />
</td>
<td className="space">
<Square />
</td>
</tr>
)
})}
</div>
)
}
export default App
Когда вы наведете курсор мыши на квадратный компонент, он загорится красным, если вы сделаете это снова, имя класса будет равно нулю, поэтому оно вернется к обычному цвету. Простой урок для вас
CSS
.space{
padding: 5px;
}
.light{
color: red
}