Nextjs:删除cookie时组件不更新DOM,但添加cookie时更新

Posted

技术标签:

【中文标题】Nextjs:删除cookie时组件不更新DOM,但添加cookie时更新【英文标题】:Nextjs: Component is not updating the DOM when cookie is removed but updating when cookie is added 【发布时间】:2021-08-05 11:35:54 【问题描述】:

我在_app.js 中的<Component ...pageProps /> 上添加了一个<Navbar /> 组件。登录成功后,我添加了一个 cookie Cookies.set('isLoggedIn', true,..) 并将 DOM 从显示 LoginSignup 更新为在导航栏上显示 Logout 按钮。但是当我单击Logout 时,这个isLoggedin cookie 被删除,因此,DOM 现在应该在导航栏上再次显示LoginSignup。相反,它一直显示Logout

那么,如何刷新 DOM,以便在删除 cookie 时显示 LoginSignup

登录代码,成功设置cookie:

axios
  .post(url, data,  withCredentials: true , (Headers = config))
  .then(Cookies.set('isLoggedIn', true,  secure: true ,  sameSite: 'lax' ));

登出代码和 DOM 更改代码:

const isLoggedIn = Cookies.get('isLoggedIn') ? true : false;

const handleLogout = () => 
  axios
    .post(devURL, (Headers = config),  withCredentials: true )
    .then(Cookies.remove('isLoggedIn'));
  ...
;


return (
  isLoggedIn === false ? (
    <div className=styles.authOpt>
      <Link href="/login">
        <button className=styles.authButton>Login</button>
      </Link>
      <Link href="/signup">
        <button className=styles.authButton>SignUp</button>
      </Link>
    </div>
  ) : (
    <div className=styles.authOpt>
      <button className=styles.authButton onClick=handleLogout>
        Log out
      </button>
    </div>
  );
);

这很可能是一个水合问题,因为改变的状态是通过 console.log() 输出来的,但它并没有改变 DOM。

【问题讨论】:

为了在 UI 上反映 isLoggedIn 值的变化,将其移动到状态(使用 React 的 useState hook)并在需要时相应地更新状态。 useState 试过,但结果是一样的! 【参考方案1】:

如果不更改 props / state,则无法重新渲染 React 组件。

因此,您的 isLoggedIn 变量必须是该组件状态的一部分。

const [isLoggedIn, setIsLoggedIn] = useState(Cookies.get('isLoggedIn') ? true : false);
// --------------------------------------------^ initial value of the state retrieved from the cookies

const handleLogout = () => 
  axios.post(devURL, (Headers = config),  withCredentials: true ).then(() => 
    Cookies.remove('isLoggedIn');
    setIsLoggedIn(false);
    // -----^
  );
  ...
;


return (
  isLoggedIn === false ? (
    <div className=styles.authOpt>
      <Link href="/login">
        <button className=styles.authButton>Login</button>
      </Link>
      <Link href="/signup">
        <button className=styles.authButton>SignUp</button>
      </Link>
    </div>
  ) : (
    <div className=styles.authOpt>
      <button className=styles.authButton onClick=handleLogout>
        Log out
      </button>
    </div>
  );
);

【讨论】:

我以前使用过这种方法,它有一些自己的问题。页面刷新后反映的 DOM 变化等。所以我现在使用Context

以上是关于Nextjs:删除cookie时组件不更新DOM,但添加cookie时更新的主要内容,如果未能解决你的问题,请参考以下文章

无法使用 NextJS 9 的 API 路由设置 cookie

在NextJS中使用动态导入时如何访问ReactQuill Ref?

组件重新渲染时状态不更新?

Nextjs:如何使用具有多个值的 ContextAPI,所有这些值都需要从子组件中更新

如何使用 nextjs 更新状态? [复制]

如何在 NextJS 中更新 <Image /> 标签的 src 而无需重新渲染整个组件