Добавление тега сценария JS в React

У меня есть файл script.js на сервере, который написан на чистом javascript (ванильном) и возвращает HTML-форму с некоторыми функциями. Я загружаю его по первому тегу <script> и использую функции из script.js во втором теге <script> в файле .html, и он работает. Но я не знаю, как заставить его работать в React. Я пытался сделать так, но не работает.

script.js

var lib = lib || (function() {
  var _args = {};

  return {
    init: function(Args) {
      _args = Args;
    },
    func: function() {
      ...some logic and use document.write
      for render
    }
  }
}())

В HTML это работает

<script src='http://someurl.com/checkout'></script>
<script>
  lib.init(...some args);
  lib.func();
</script>

В React это не работает

import React, {
  Component
} from 'react';
import axios from "axios";

class Checkout extends Component {

  state = {}

  componentDidMount = async() => {
    axios.get("http://someurl.com/checkout")
      .then(res => {
        const scriptInit = document.createElement("script");
        scriptInit.src = "http://someurl.com/checkout";
        // or scriptInit.text = res.data;
        scriptInit.type = "text/javascript";
        scriptInit.async = true;
        const scriptFunc = document.createElement("script");
        scriptFunc.text = "lib.init(...); lib.func();";
        scriptFunc.async = true;
        const script = scriptInit.outerHTML + scriptFunc.outerHTML;
        this.setState({
          script
        });
      })

  }

  render() {
    const __html = this.state.script || "";
    return <div id = "checkout"
    dangerouslySetInnerHTML = {
      {
        __html
      }
    }
    />
  }
}

export default Checkout;

Рендеринг тега div со всеми тегами скрипта, но с разрешением 1110 x 0

Что вы подразумеваете под but with 1110 x 0 resolution тем, как решение относится к проблеме со сценарием?

Mosh Feu 11.07.2019 06:27

Я пробовал script*.innerHTML, но он возвращает код js из script.js.

Dmitriy Kostenko 11.07.2019 06:30

@MoshFeu Это пишется, когда я открываю вкладку «Элементы» Chrome devtools (F12)

Dmitriy Kostenko 11.07.2019 06:33

Имеет смысл. Но я все же пытаюсь понять, в чем дело. Неужели скрипт не работает?

Mosh Feu 11.07.2019 06:33

Написано, что вы имеете в виду, что это размер скрипта или тег div, содержащий его? Если это так, это не имеет значения, потому что сценарий не должен иметь размерности.

Mosh Feu 11.07.2019 06:35

Он не отображает (или не может использовать функции из script.js) или загружает данные script.js

Dmitriy Kostenko 11.07.2019 06:35

Я хочу добавить тег <script> в React DOM в файле .js или .jsx, потому что проект React состоит только из одного корневого файла /public/index.html.

Dmitriy Kostenko 11.07.2019 06:37

Возможно, это мог бы это объяснить.

Mosh Feu 11.07.2019 06:38

@MoshFeu Я меняю document.write на document.createElement и document.body.appendChild и т. д. В script.js - он работает в html, но не в React.

Dmitriy Kostenko 11.07.2019 07:17

вы используете какую-то библиотеку в своих вещах javascript? потому что это должно работать, так как реакция является базой javascript. Возможно, вам нужно перевести ваш чистый js в реагирующий код

ronydavid 11.07.2019 08:04
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
10
2 027
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вам нужно вызвать функции после загрузки вашего скрипта. Для этого вам не понадобятся аксиомы, вы можете добиться этого, используя обратный вызов onload для загрузки скрипта.

componentDidMount(){
 const script = document.createElement("script");
 document.head.appendChild(script);
 script.src = "http://someurl.com/checkout";
 script.async = true;
 script.onload = () => this.runScriptMethods();
}

runScriptMethods(){
  lib.init(...);
  lib.func()
}

Но если мой скрипт отображает некоторые элементы с помощью document.write и должен быть в теле, а функции lib реализованы в script.js?

Dmitriy Kostenko 11.07.2019 09:24

Спасибо, работает, но только с помощью eval("lib.init()...") в runScriptMethods() - не очень

Dmitriy Kostenko 11.07.2019 09:39

Нет, это нехорошо, и я не уверен, зачем вам нужен eval. Если вы пытаетесь запустить его без (например, lib.init()), что происходит?

Mosh Feu 11.07.2019 10:52

@MoshFeu 'lib' не определен. Поскольку объект lib определен в script.js на другом URL-адресе/сервере

Dmitriy Kostenko 11.07.2019 11:14

Это не имеет значения, пока скрипт выполняется в контексте веб-сайта. И, конечно же, это не будет отличаться от запуска с eval.

Mosh Feu 11.07.2019 14:15

Другие вопросы по теме