#reactjs #next.js
#reactjs #next.js
Вопрос:
Я пытаюсь сделать свою навигацию адаптивной, поэтому нажатие на значок меню бургера добавит класс в навигацию. Простая концепция.
Все еще новичок в react и next js.
import Link from 'next/link'
import { useRouter } from 'next/router'
import { useRef, setState, useEffect } from 'react'
const Nav = (props) => {
const router = useRouter()
const isExpanded = () => {
this.state = {
isExpanded: false
}
}
function handleToggle(e) {
e.preventDefault();
this.setState({
isExpanded: !this.state.isExpanded
});
}
return (
<nav>
<div>
<Link href="/">
<a><img src="/img/logo.svg" /></a>
</Link>
<button onClick={e => this.handleToggle(e)} className="nav-icon">
<svg className="fill-current text-white" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20"><path d="M0 3h20v2H0V3zm0 6h20v2H0V9zm0 6h20v2H0v-2z"/></svg>
</button>
</div>
<div>
<ul className={`collapsed ${isExpanded ? "is-expanded" : ""}`}>
<li className={router.pathname == "/" ? "active" : ""}>
<Link href="./">
<a>Home</a>
</Link>
</li>
<li className={router.pathname == "/blog" ? "active" : ""}>
<Link href="/blog">
<a>Blog</a>
</Link>
</li>
</ul>
</div>
</nav>
)
}
export default Nav
Когда я нажимаю на значок бургера в меню, я получаю
TypeError: Cannot read property 'handleToggle' of undefined
Любой совет в правильном направлении был бы высоко оценен. Спасибо
Комментарии:
1. Вы используете
functional component
. Она не существуетthis
. Просто использоватьhandleToggle(e)
было бы хорошо.2. Ах, хорошо, спасибо — итак, я внес это изменение — теперь я не могу прочитать свойство ‘setState’ неопределенного
Ответ №1:
Вы путаете классовые и функциональные компоненты и не используете преимущества ни того, ни другого. Вот рабочий фрагмент, иллюстрирующий минимальную реализацию.
Она используется React.useState()
для объявления и установки состояния. Кроме того, при вызове именованные функции event
будут передаваться неявно, поэтому вы можете просто объявить onClick={handleToggle}
.
p {
font-family: monospace;
}
<script src="https://unpkg.com/react@16/umd/react.production.min.js"></script>
<script src="https://unpkg.com/react-dom@16/umd/react-dom.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/babel-standalone/6.26.0/babel.min.js"></script>
<div id="App"></div>
<script type="text/babel">
const {useState} = React;
const Nav = () => {
const [isExpanded, setIsExpanded] = useState(false);
function handleToggle(e) {
setIsExpanded(prevState => !prevState);
}
return (
<nav>
<div>
<button type="button" onClick={handleToggle} className="nav-icon">
Burger
</button>
</div>
<p>{`isExpanded: ${isExpanded}`}</p>
</nav>
)
}
ReactDOM.render(<Nav />, document.getElementById('App'));
</script>