[在React的useEffect中使用Materialize CSS初始化不像在componentDidMount中那样工作

问题描述 投票:0回答:1

使用componentDidMount()初始化实例化js可以正常工作,如文档中所示

componentDidMount() {
document.addEventListener("DOMContentLoaded", function() {
  var elems = document.querySelectorAll(".sidenav");
  M.Sidenav.init(elems, {});
});

}

但是每当我将组件转换为功能组件并在useEffect中运行相同的初始化时,它将无法正常工作,并且我的sideNav也不会初始化

整个代码

import React, { Fragment, useEffect } from "react";
import M from "materialize-css/dist/js/materialize.min.js";

export const Navbar = () => {
  useEffect(() => {
    document.addEventListener("DOMContentLoaded", function() {
      var sidenav = document.querySelectorAll(".sidenav");
      M.Sidenav.init(sidenav, {});
    });
  }, []);

  return (
    <Fragment>
      <div className="navbar-fixed">
        <nav className="teal darken-3">
          <div className="nav-wrapper mx-4">
            <a href="#!" className="brand-logo">
              <i className="far fa-id-badge" />
              EMS
            </a>
            <a href="#!" className="sidenav-trigger" data-target="mobile-nav">
              <i className="material-icons">menu</i>
            </a>
            <ul className="right hide-on-med-and-down">
              <li>
                <a href="profiles.html">Settings</a>
              </li>
              <li>
                <a href="register.html">Register</a>
              </li>
              <li>
                <a href="login.html">Login</a>
              </li>
            </ul>
          </div>
        </nav>
      </div>

      <ul className="sidenav blue-grey darken-4" id="mobile-nav">
        <h3 className="teal-text ml-2">EMS</h3>
        <li>
          <div className="divider blue-grey darken-2"></div>
        </li>
        <li>
          <a href="profiles.html" className="white-text">
            Settings
          </a>
        </li>
        <li>
          <a href="register.html" className="white-text">
            Register
          </a>
        </li>
        <li>
          <a href="login.html" className="white-text">
            Login
          </a>
        </li>
      </ul>
    </Fragment>
  );
};

我认为问题出在document.addEventListner

reactjs react-hooks materialize use-effect
1个回答
0
投票
您应该知道何时只想使用Effect就像componentDidMount一样,应该将空数组作为第二个参数传递。如下所示

useEffect(() => { var sidenav = document.querySelectorAll(".sidenav"); M.Sidenav.init(sidenav, {}); }, []);

这样,useEffect仅运行一次。并注意:当componentDidMount触发时,这意味着所有HTML都已在DOM中。因此您不需要任何用于完全加载数据的侦听器
© www.soinside.com 2019 - 2024. All rights reserved.