Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/396.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 仅在主页上加载的脚本将显示在其他路由上_Javascript_Reactjs_React Router - Fatal编程技术网

Javascript 仅在主页上加载的脚本将显示在其他路由上

Javascript 仅在主页上加载的脚本将显示在其他路由上,javascript,reactjs,react-router,Javascript,Reactjs,React Router,我使用的是Zendesk Webwidget,如果我先在浏览器上加载这些页面,那么我添加并显示在主页上的脚本似乎也会加载到其他页面上 预期行为:直接转到帮助路由/组件不应加载Zendesk WebWidget脚本,直到路由到主页 获取行为:直接转到帮助路径/组件加载Zendesk WebWidget 下面是一些示例代码: 路线: const AppRoutes = () => ( <AppContainer> <Switch> <Route

我使用的是Zendesk Webwidget,如果我先在浏览器上加载这些页面,那么我添加并显示在主页上的脚本似乎也会加载到其他页面上

预期行为:直接转到帮助路由/组件不应加载Zendesk WebWidget脚本,直到路由到主页

获取行为:直接转到帮助路径/组件加载Zendesk WebWidget

下面是一些示例代码:

路线:

const AppRoutes = () => (
  <AppContainer>
   <Switch>
    <Route exact path="/help" component={Help} />
    <Route exact path="/" component={Home} />
   </Switch>
  </AppContainer>
);
const AppRoutes=()=>(
);
主页:

const zendeskWidget=新承诺((解决、拒绝)=>{
const script=document.createElement('script');
script.src=https://myzendeskscript.com';
setAttribute('id','ze snippet');
script.async=true;
script.addEventListener('load',function(){
解决();
});
script.addEventListener('error',函数(e){
拒绝(e);
});
document.body.appendChild(脚本);
});
类Home扩展了React.Component{
componentDidMount(){
zendeskWidget。然后(()=>{
//返回主页时显示小部件的代码
if(zE&&zE.show){
zE.show();
}
});
}
组件将卸载(){
zendeskWidget。然后(()=>{
//离开主页时隐藏小部件的代码
if(zE&&zE.hide){
zE.hide();
}
});
}
render(){
返回(
);
}
};
帮助:

const Help=()=>(
一些文本
);

既然这对你有帮助,我想我会把它作为一个答案


它将在加载react应用程序时加载组件,这是单页应用程序的特性。由于zendeskWidget常量是在生命周期挂钩之外定义的,因此它将在加载组件时加载脚本。如果不希望出现这种行为,则必须将脚本加载移到某个生命周期挂钩中。

加载react应用程序时,它将加载组件,这是单页应用程序的性质。由于zendeskWidget常量是在生命周期挂钩之外定义的,因此它将在加载组件时加载脚本。如果您不希望出现这种行为,您将不得不将脚本加载移动到某个生命周期挂钩中。工作非常好,非常感谢!我正要请你把它作为答案发布,再次感谢!
const zendeskWidget = new Promise((resolve, reject) => {
  const script = document.createElement('script');
  script.src = 'https://myzendeskscript.com';
  script.setAttribute('id', 'ze-snippet');
  script.async = true;
  script.addEventListener('load', function () {
    resolve();
  });
  script.addEventListener('error', function (e) {
    reject(e);
  });
  document.body.appendChild(script);
});

class Home extends React.Component {
  componentDidMount() {
    zendeskWidget.then(() => {
      // code to show the widget when coming back to the home page
      if(zE && zE.show) {
        zE.show();
      }
    });
  }

  componentWillUnmount() {
    zendeskWidget.then(() => {
      // code to hide the widget when leaving home page
      if(zE && zE.hide) {
        zE.hide();
      }
    });
  }
  render() {
    return (
      <HomeContainer />
    );
  }
};
const Help = () => (
  <HelpContainer>
    Some Text
  </HelpContainer>
);