Снова запускать внешний файл JavaScript при изменении условий реакции?

#javascript #reactjs #conditional-statements

#javascript #reactjs #условные операторы

Вопрос:

Пожалуйста, прочтите весь вопрос целиком, прежде чем отвечать.

Итак, у меня есть ванильный файл javascript, который я использую, чтобы попытаться активировать запрос на выборку при каждом нажатии кнопки в отдельном файле react. Этот ванильный файл javascript НЕ находится в папке src, в которой находится файл react. Он находится в общей папке, где index.html есть. Для этого он должен оставаться там.

Background.js:

 function clickTest() {
  fetch('https://connect.smartpathed.com/chrometest');
}

try {
  document.getElementById("test-button").addEventListener('click', clickTest);
}
catch(e) {
  function errorCatch() {
    return;
  }
}
 

Компонент React не будет указан здесь, потому что он содержит более 2000 строк кода, и 95% из них не имеют отношения к этому вопросу. Просто знайте, что в рендеринге есть два условных оператора и кнопка с идентификатором в операторе return, к которой я пытаюсь получить доступ.

Компонент react, который я использую, разделяется на два условных оператора при рендеринге. При первой загрузке приведенный выше код работает нормально, ориентируясь на определенный идентификатор, но в тот момент, когда он переключается на другой условный оператор (тот, который не отображается при загрузке), и у меня есть аналогичная кнопка с тем же идентификатором (обратите внимание, что это отдельные тесты, и кнопка существует только один раз в обоих случаях, так что нет столкновения идентификаторов), нет ввода из document.getElementById() и код прерывается. Если бы я хотел сохранить этот поток в своем файле react, я знаю, что просто использовал бы ссылки, но этот ванильный файл JavaScript, приведенный выше, должен оставаться отдельным файлом.

Мой index.html в корневом каталоге это выглядит так:

 <!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="utf-8" />
    <link rel="icon" href="%PUBLIC_URL%/favicon.png" />
    <meta name="viewport" content="width=device-width, initial-scale=1" />
    <meta name="theme-color" content="#000000" />
    <meta
      name="description"
      content="Web site created using create-react-app"
    />
    <link rel="apple-touch-icon" href="%PUBLIC_URL%/logo192.png" />
    <link href="https://fonts.googleapis.com/css2?family=Robotoamp;display=swap" rel="stylesheet">
    <!--
      manifest.json provides metadata used when your web app is installed on a
      user's mobile device or desktop. See https://developers.google.com/web/fundamentals/web-app-manifest/
    -->
    <link rel="manifest" href="%PUBLIC_URL%/manifest.json" />
    <!--
      Notice the use of %PUBLIC_URL% in the tags above.
      It will be replaced with the URL of the `public` folder during the build.
      Only files inside the `public` folder can be referenced from the HTML.

      Unlike "/favicon.ico" or "favicon.ico", "%PUBLIC_URL%/favicon.ico" will
      work correctly both with client-side routing and a non-root public URL.
      Learn how to configure a non-root public URL by running `npm run build`.
    -->
    <title>Think. Future. Workforce. Connect.</title>
  </head>
  <body>
    <noscript>You need to enable JavaScript to run this app.</noscript>
    <div id="root"></div>
    <!--
      This HTML file is a template.
      If you open it directly in the browser, you will see an empty page.

      You can add webfonts, meta tags, or analytics to this file.
      The build step will place the bundled scripts into the <body> tag.

      To begin the development, run `npm start` or `yarn start`.
      To create a production bundle, use `npm run build` or `yarn build`.
    -->
  <script src = "background.js"></script>
  <script src="https://apis.google.com/js/client.js"></script>
  </body>
</html>
 

Div с идентификатором root представляет код react, а затем файл JavaScript является фоном.js добавлен в нижней части тела. Итак, как мне получить идентификатор элемента, который находится в условном операторе, который не активируется при загрузке страницы?Я попытался поместить background.js внутри компонента в конце, но он все равно не работает. Есть ли какой-либо способ активировать background.js опять же, когда условие изменяется внутри компонента JavaScript?

Комментарии:

1. Это все background.js ? Кажется, вы ищете способ восстановить правильный «подключенный» обработчик обратного вызова onClick? Что, если вы сделаете clickTest его доступным по всему миру?

Ответ №1:

На самом деле не существует такой вещи, как «запустить файл», когда вы находитесь в браузере. <script> Тег, по сути, гласит: «загрузите javascript с этого URL-адреса и немедленно оцените его». Поскольку ваш код выполняется в корне скрипта, это одноразовая операция. Все это происходит еще до того, как React инициализирует ваше приложение.

Если вы хотите иметь возможность подождать и вызвать его позже, создайте функцию, которая присоединяет обработчик событий.

 function clickTest() {
  fetch('https://connect.smartpathed.com/chrometest');
}

// would probably make more sense to pass the element or at
// least the selector in here
function addTestHandler() {
  try {
    document.getElementById("test-button").addEventListener('click', clickTest);
  }
  catch(e) {
    function errorCatch() {
      return;
    }
  }
}
  
 

Тогда ваш компонент react может вызвать его после рендеринга, например:

 useEffect(() => addTestHandler(), [])
 

Однако я должен сказать, что наличие javascript в public папке приложения react вызывает подозрение, тем более что вы жестко кодируете идентификатор элемента, отображаемого React.

Комментарии:

1. Я понимаю подозрение. Я не хотел включать здесь КАЖДУЮ деталь, но по сути это для расширения Chrome, которое должно использовать gapi и должно оставаться в общедоступной папке, чтобы к нему можно было получить доступ при сборке. Поскольку платформа для API, которую я использую, уже создана на стороне веб-приложения с использованием React, мне нужен способ навигации по нему. Спасибо за ваш ответ!