#javascript #reactjs #next.js
#javascript #reactjs #next.js
Вопрос:
Использование Next.js / React.js Я создал простое приложение, используя настройки, как показано в официальном Next.js учебное пособие. Это означает, что я использую <Layout />
компонент, который отображается на разных страницах. Я показываю свой код ниже.
Теперь, используя реквизиты рендеринга, я пытаюсь установить некоторое состояние <Layout />
компонента из дочернего компонента. При выполнении этого я получаю следующую ошибку:
TypeError: setLoginToken is not a function
Может кто-нибудь объяснить, почему это происходит, и показать мне, как заставить это работать? Я получаю эту ошибку при нажатии одной из двух кнопок на
Мой код:
Компонент макета ( components/Layout.js
)
import React from "react";
class Layout extends React.Component {
state = {
loginToken: "abc123"
};
setLoginToken = newToken => {
this.setState({ loginToken: newToken });
};
render() {
const { render } = this.props;
const { loginToken, setLoginToken } = this.state;
return (
<React.Fragment>{render({ loginToken, setLoginToken })}</React.Fragment>
);
}
}
export default Layout;
индексная страница ( pages/index.js
)
import React from "react";
import Layout from "../components/Layout";
class Index extends React.Component {
render() {
return (
<Layout
render={({ loginToken, setLoginToken }) => (
<div>
<p>Login token: {loginToken}</p>
<button onClick={() => setLoginToken("asdfasdf")}>Log in</button>
<button onClick={() => setLoginToken("")}>Logout</button>
</div>
)}
/>
);
}
}
export default Index;
Я также попробовал следующее, с тем же результатом:
(setLoginToken) => setLoginToken("asdfasdf")
(setLoginToken) => setLoginToken("")
Ответ №1:
Проблема возникает из-за того, что вы разрушаете setLoginToken
из this.state
, вместо this
.
Вы можете одним выстрелом сделать это с
const { state: { loginToken }, setLoginToken } = this
Комментарии:
1. Спасибо, думаю, это случается с лучшими :’). Рад, что это работает, спасибо!