从React组件中的外部加载的HTML访问内部函数

我有以下用例。

我的React组件中加载了一些第三方来源的HTML:

class MyComponent extends Component {

render() {

return (

<div

dangerouslySetInnerHTML={{ __html: this.props.externalHTML }}

/>

);

}

}

在外部加载的HTML内,存在一个针对特定范围的click事件,该事件应调用存在于我的应用程序中的回调函数。

<span onclick="myCallback(param1='asd', param2=123, param3='asdas')">

Click me!

</span>

我该把 myCallback 函数放在哪里?

如果将其放在组件类中,则单击跨度时会收到以下错误,因为据我了解,该函数对外部加载的HTML不可见:

我的另一个想法是将函数添加到window.myCallback =

...主index.js文件内的window对象中,以便在每次应用加载时加载。这样工作,但我有两个问题。

  • 我的理解是,这不是正确的React方法。
  • 每当我单击span元素时,都会两次触发回调函数,但我不明白为什么。

有什么建议?

回答:

使用“ dangerouslySetInnerHTML”作为名称^^是…“ dangerous”,实际上也不是纯React方法。

但是,如果必须这样做,则可以执行以下操作(默认情况下,可以利用React内置的jQuery)

=====

从此处编辑的版本:(仅使用1个组件)

export default class MyComponent extends Component {

componentDidMount() {

// using jQuery to manipulate DOM element form third-party source

// NB. you may think of using setTimeout here, to wait for the external source to be fully loaded here, of course it's not so safe

// but anyway, we are using "dangerouslySetInnerHTML" anyway => quite dangerous, though ^^

// setTimeout(function(){

$(document.findElementsByTagName("span")[0]).click(function(e){

// or perhaps $("#spanID").click if you can, just be careful between DOM element and react component

e.preventDefault();

// DO SOMETHING HERE, just like you do in the window.onload function

// or maybe you also need to get param values by getting $(this).data("...") or $(this).attr("ATTRIBUTE-NAME")

return false;

});

// });

}

render() {

return (

<div

dangerouslySetInnerHTML={{ __html: this.props.externalHTML }}

/>

);

}

}

=====

此处的旧答案:(使用2个组件)

export default class MyComponent extends Component {

constructor(props) {

super(props);

this.callbackOnThisComponent = this.callbackOnThisComponent.bind(this);

}

callbackOnThisComponent(param1, param2, param3) {

// do whatever you like with the above params

}

render() {

return (

<ChildComponent triggerCallbackOnParent={this.callbackOnThisComponent} />

);

}

}

export default class ChildComponent extends Component {

componentDidMount() {

// using jQuery to manipulate DOM element form third-party source

let that = this;

// NB. you may think of using setTimeout here, to wait for the external source to be fully loaded here, of course it's not so safe

// but anyway, we are using "dangerouslySetInnerHTML" anyway => quite dangerous, though ^^

$(document.findElementsByTagName("span")[0]).click(function(e){

// or perhaps $("#spanID").click if you can, just be careful between DOM element and react component

e.preventDefault();

that.props.triggerCallbackOnParent(param1, param2, param3);

// or maybe you need to get param values by getting $(this).data("...") or $(this).attr("ATTRIBUTE-NAME")

return false;

}, that);

}

render() {

return (

<div

dangerouslySetInnerHTML={{ __html: this.props.externalHTML }}

/>

);

}

}

我只是使用React的主要思想,即将props向下传递给子组件,并且当您想从子组件向上触发函数时,请在parent上创建一个回调函数。

如果仍然无法解决问题,请随时向我显示一些错误日志,谢谢

以上是 从React组件中的外部加载的HTML访问内部函数 的全部内容, 来源链接: utcz.com/qa/420140.html

回到顶部