2016-08-05 6 views
0

Я использую react.js для визуализации <script> на странице html. Внутри этого скрипта есть функция javascript, которую мне нужно вызвать из моего класса реагирования.Как вызвать функцию javascript, определенную извне, используя реакцию?

Это то, что у меня есть ...

class Example extends React.Component { 

    componentWillMount() { 

     //render a script 
     const script = document.createElement("script"); 
     script.src = "http//random_source.js"; 

    render(){ 

     //call method from the script rendered 
     window.someMethod(); 
     return(
      <div>{this.componentWillMount}</div> 

      ); 
     } 
    } 

Так componentWillMount() оказывает мой сценарий на странице HTML, и в render() я звоню window.someMethod() где someMethod находится внутри оказанной сценария.

Возможно ли это использовать реакцию? Если нет, то есть какая-нибудь работа?

+0

Похоже, вы спрашиваете, работает ли это. Почему бы не попробовать? –

+0

@CalebAnthony Я попытался посмотреть мой код ^^ – Bolboa

+2

@Bolboa Возможно это так: https://jsfiddle.net/_alexander_/69z2wepo/51817/, однако зачем вам загружать скрипт внутри реагировать на compoent? Вы используете webpack? Может быть, лучше добавить этот скрипт в общий комплект? –

ответ

0

Сценарии асинхронны, поэтому вам нужно дождаться загрузки и анализа скрипта. Когда это будет завершено, будет вызван ответ/событие

class Example extends React.Component { 

    getInitialState(){ 
     return {loaded:false} //initially not loaded 
    } 

    componentWillMount() { 

     //render a script 
     const script = document.createElement("script"); 
     script.src = "http//random_source.js"; 

     //when the script loads, we're ready to go, so change state 
     script.onload = (function(){ 
      this.setState({loaded: true}) 
     }).bind(this); 

     //append the script to the DOM 
     //you should take care not to include it twice 
     // and if include to setState to loaded just as script.onload does 
     document.getElementsByTagName('head')[0].appendChild(script); 
    } 

    render(){ 
     if(!this.state.loaded){ 
      return (<div>Loading...</div>); 
     } 

     //call method from the script rendered 
     window.someMethod(); 
     return(
      <div>{this.componentWillMount}</div> 

      ); 
     } 
    } 
0

Да, это действительно возможно с помощью реакцииJS. Используя это, я реализую несколько событий прокрутки. Единственное условие заключается в том, что ваш javascript должен загружаться до того, как ваш компонент reactjs отправит еще неопределенную ошибку.

Но если это требуется только для этого конкретного компонента, вы можете реализовать его только для класса компонентов.

+0

Итак, в моем примере выше, является ли javascript загружен до или после вызова метода? – Bolboa

+0

Почему это реализовано таким образом? Я имею в виду создание js-элемента из реакции? Почему бы не поместить файл js в html и не скомпилировать ваши файлы actionsjs с помощью webpack и не добавить в него файл в виде html-кода? –

Смежные вопросы