首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >离子电容应用程序事件列表插件一次点击多次调用

离子电容应用程序事件列表插件一次点击多次调用
EN

Stack Overflow用户
提问于 2022-10-13 06:44:58
回答 1查看 129关注 0票数 0

我正在使用离子电容器来构建我的reactjs Web应用程序。我在我的App.js文件中添加了一个电容应用程序来获取回事件捕获,

代码语言:javascript
复制
APPS.addListener("backButton", () => {
    if (renderedScreenUIList.length === 0) {
      // APPS.exitApp();
      alert("exit app");
    } else {
      alert("previous screen");
    }
  });

但是当我按下后退按钮时,这个回事件会被调用3次而不是1次。我的App.js文件是。

代码语言:javascript
复制
// import "./StyleSeets/LightTheme.css";
import "./StyleSeets/theme.css";
import "./App.css";
import React, { useEffect, useState } from "react";
import Drawer from "@mui/material/Drawer";
import { App as APPS } from "@capacitor/app";
import Login from "./Components/Login";
import ERPUtils from "./Components/ERPUtils";
import Main from "./Components/Main";

// ************************** back fire event handling ****************
const renderedScreenUIList = [];

function App() {
  // const [ stylePath, setStylePath ] = useState("./StyleSeets/LightTheme.css");
  const [renderPageType, setRenderPageType] = useState("login");
  const [isMobileView, setIMobileView] = useState(window.innerWidth < 920);
  const isConsoleOpen = false;

  window.onresize = function () {
    console.log(window.outerHeight - window.innerHeight);
    if ((window.outerHeight - window.innerHeight) > 100) { console.log("open"); } else console.log("close");
  };
  const themeList = [
    { value: "#2776ed", label: "light" },
    { value: "#45b11c", label: "nature" },
    { value: "#2AB67B", label: "evening" },
    { value: "#add8e6", label: "sky" },
    { value: "#2b035b", label: "dark" }];
  const languageList = [
    { value: "ENG", label: "English" },
    { value: "MAL", label: "മലയാളം" },
    { value: "HIND", label: "हिन्दी" }];
  const [language, setLanguage] = useState("ENG");
  const onThemeChangeCall = () => {
    const themeName = sessionStorage.getItem("theme-name");
    const themeElement = document.getElementById("app-theme");
    themeElement.className = "App";
    document.documentElement.setAttribute("data-theme", themeName);
  };

  APPS.addListener("backButton", () => {
    if (renderedScreenUIList.length === 0) {
      // APPS.exitApp();
      alert("exit app");
    } else {
      alert("previous screen");
    }
  });

  const languageChanged = (type) => {
    setLanguage(type);
  };

  useEffect(() => {
    onThemeChangeCall();
  }, []);

  const changePage = (page) => {
    setRenderPageType(page);
  };

  const [isSettingsOpen, setIsSettingsOpen] = useState(false);
  const changeTheme = (type) => {
    sessionStorage.setItem("theme-name", type);
    document.documentElement.classList.add("color-theme-in-transition");
    window.setTimeout(() => {
      document.documentElement.classList.remove("color-theme-in-transition");
    }, 1000);
    onThemeChangeCall();
  };

  const toggleDrawer = (value) => {
    setIsSettingsOpen(value);
  };

  const changeLanguage = (type) => {
    sessionStorage.setItem("language-theme", type);
    languageChanged(type);
  };

  useEffect(() => {
    setIMobileView(window.innerWidth < 920);
  }, [window.innerWidth]);

  return (
    <div className="App" id="app-theme">

      {renderPageType === "login"
        ? (
          <Login
            onThemeChangeCall={onThemeChangeCall}
            changePage={changePage}
            languageChanged={languageChanged}
            toggleDrawer={toggleDrawer}
          />
        )
        : null}
      {renderPageType === "home"
        ? (
          <Main
            onThemeChangeCall={onThemeChangeCall}
            changePage={changePage}
            languageChanged={languageChanged}
            toggleDrawer={toggleDrawer}
            isMobileView={isMobileView}
          />
        )
        : null}
      <Drawer
        anchor="right"
        open={isSettingsOpen}
        onClose={() => toggleDrawer(false)}
      >
        <div className="p-2 " style={{ width: "250px", backgroundColor: "var(--primaryBackground)" }}>
          <h6 className="border-bottom p-2">Themes</h6>
          <div className="">
            {!ERPUtils.isNullorWhiteSpace(themeList) ? themeList.map((el, index) => (
              <div
                key={index}
                onKeyDown={(e) => {
                  if (ERPUtils.isKeyBoardEnterPressed(e)) {
                    changeTheme(el.label);
                  }
                }}
                role="button"
                tabIndex={0}
                className="p-2 d-flex align-items-center font-2 justify-content-start"
                onClick={() => changeTheme(el.label)}
              >
                <span className="theme-thumbnail" style={{ backgroundColor: el.value }} />
                <span>{(`${el.label}`).toLocaleUpperCase()}</span>
              </div>
            )) : null}
          </div>
        </div>
        <div className="p-2" style={{ width: "250px", backgroundColor: "var(--primaryBackground)" }}>
          <h6 className="border-bottom p-2">Language</h6>
          <div className="">
            {!ERPUtils.isNullorWhiteSpace(languageList) ? languageList.map((el, index) => (
              <div
                key={index}
                onKeyDown={(e) => {
                  if (ERPUtils.isKeyBoardEnterPressed(e)) {
                    changeLanguage(el.value);
                  }
                }}
                role="button"
                tabIndex={0}
                className="p-2 d-flex align-items-center font-2 justify-content-start"
                onClick={() => changeLanguage(el.value)}
              >
                <span className="language-thumbnail">{el?.label.split("")[0]}</span>
                <span>{(`${el.label}`).toLocaleUpperCase()}</span>
              </div>
            )) : null}
          </div>
        </div>
      </Drawer>
      {/* <ThemeSwitcherProvider defaultTheme="light" themeMap={themes}> */}
      {/* <link rel="stylesheet" type="text/css" href={stylePath} />      */}

      {/* </ThemeSwitcherProvider> */}
    </div>
  );
}

export default App;

请提出解决这个问题的办法?如果我在App.js文件之外调用此事件侦听器,它只调用一次。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-10-13 08:14:00

在每个页面重新加载时,将再次添加侦听器。要解决这个问题,应该在开始时调用removeAllListeners() => Promise<void>一次:

代码语言:javascript
复制
App.removeAllListeners().then(() => {
  App.addListener("backButton", () => {
    if (renderedScreenUIList.length === 0) {
      // APPS.exitApp();
      alert("exit app");
    } else {
      alert("previous screen");
    }
  });
});
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74051484

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档