这是我在实现在React应用中添加AddThis时找到的唯一信息。最终帮助我解决了问题。我将我的解决方案发布给任何遇到此问题的人。
使用React Router和AddThis存在一些挑战。关键是将addThis javascript方法附加到window
事件上,而不是React生命周期事件上。
我使用了react-load-script
来异步加载主页面上的脚本,并实现了回调函数来初始化addThis小部件,然后设置状态以指示是否已加载addThis。然后该状态传递给组件。
部分代码:
import * as LoadScript from 'react-load-script';
class App extends React.Component {
constructor(props) {
this.state = { addThisLoaded: false }
}
handleScriptLoad() {
this.setState({ addthisLoaded: true });
window.addthis.init();
}
render() {
return (
<LoadScript
url="http://s7.addthis.com/js/300/addthis_widget.js#pubid=ra-xxxxxxxxxxxxxxxx"
onLoad={this.handleScriptLoad.bind(this)}
/>
<Switch>
<Route exact path="/" component={Home} />
<Route path="/page/:id"
render={routeProps => (<Page {...routeProps} addThisLoaded={this.state.addThisLoaded} />)}
/>
</Switch>
);
}
}
然后在实现addThis小部件的组件中,我将window
事件监听器附加到了React生命周期钩子上。可以使用addThisLoaded属性来有条件地渲染小部件。
export default class Page extends React.Component<Props> {
componentDidMount() {
window.addEventListener('load', window.addthis.layers.refresh());
}
componentWillUnmount() {
window.removeEventListener('load', window.addthis.layers.refresh);
}
render() {
const page_url = `YOUR URL GOES HERE`;
const page_title = `YOUR TITLE GOES HERE`;
return (
<div>
{this.props.addThisLoaded === true && (
<div className="addthis_inline_share_toolbox" data-url={page_url} data-title={page_title} />
)}
</div>
);
}
}
如果有更好的处理方法,我很乐意听。AddThis API文档不够详细。而且它操作DOM以实现所需行为,这使得它难以与React Router结合使用。