【问题标题】:Custom JS breaks after page change in NextJS?NextJS中页面更改后自定义JS中断?
【发布时间】:2018-05-06 09:43:17
【问题描述】:

我一直在开发我的个人网站,并使用 NextJS 将其制作成 PWA。每当我从我的应用程序更改页面时,我已导入顶级组件 (_document.js) 的自定义 JS 将停止在其他页面上工作,除非我重新加载页面。有人对此有解决方案或遇到类似情况吗?

这是我录制的视频的链接,展示了我在说什么。如果需要,我也可以提供代码。我觉得这是一个相对容易解决的问题,但这是我的第一次尝试和 Next 并且仍然习惯了环境。

https://drive.google.com/file/d/16doKPpJPDHhFcYLiX8lZEWGoTf8b19MM/view

//navbar.js (imported js file)
const menu = document.querySelector('#hamburger');
const wrapper = document.querySelector('.wrapper');
const drawer = document.querySelector('.navbar');

menu.addEventListener('click', function(event) {
  drawer.classList.toggle('open');
  event.stopPropagation();
});
wrapper.addEventListener('click', function() {
  drawer.classList.remove('open');
});

【问题讨论】:

  • 提供一个最小工作代码sn-p,重现你描述的问题,最好是Stack snippet
  • 你为什么要在 React 之外操作 DOM?

标签: javascript reactjs nextjs


【解决方案1】:

我认为您将 React 应用程序视为传统(静态)Web 应用程序 - 用 PHP 编写或通过模板呈现为 HTML。

使用 React,它是一种独立于 React 操作 DOM 的反模式。

在这种特殊情况下,更好的方法是使用全局状态(例如,您可以使用 Redux)来维护菜单抽屉的状态。单击汉堡图标会切换此全局状态值,并且抽屉本身会自行处理其类(如果 state.open,则附加 open)。

您的组件如下所示:

const Header = ({ toggleMenu }) => {
  return (
    <div>
      ...
      <button onClick={ toggleMenu } />
    </div>
  )
}

export default connect(null, { toggleMenu })(Header)

const Menu = ({ isOpen }) => {
  return (
    <div className={ isOpen ? "open" : "" }>
      ...
    </div>
  )
}

export default connect(function (state) {
  return { isOpen: state.menu.open }
})(Menu)

你的动作创建者

function toggleMenu () {
  return { action: TOGGLE_MENU }
}

还有你的减速器

function menuReducer(previousState, action) {
  switch (action.action) {
    case TOGGLE_MENU:
      return { ...previousState: open: !previousState.open }
    default:
      return previousState
  }
}

【讨论】:

  • 感谢您的建设性回答。你是对的,我没有在 React-land 中思考。感谢您引起我的注意。实现 Redux 的非常好的理由,因为我认为我不一定需要它。再次感谢!
  • 嘿 Tyler,你能看看我的 repo 并告诉我我缺少什么吗?我似乎无法弄清楚如何在我的组件中调用操作。 github.com/nicer00ster/nicer00ster-blog
  • 你已经接近了。 toggleMenu 使用 action: "TOGGLE_MENU" 而你的减速器使用 actionTypes.TOGGLE_MENU 等于 TOGGLE。要么将其更改为TOGGLE_MENU,要么将toggleMenu 中创建的操作更改为TOGGLE
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-12
  • 1970-01-01
  • 2011-10-17
  • 2022-10-01
  • 1970-01-01
相关资源
最近更新 更多