ReactJS 中的这个引用

this reference in ReactJS

我正在尝试访问动态创建的 DOM 中的特定元素。 在悬停该元素时,我想访问相应的元素属性。喜欢,

// element creation inside render function
$.each(profiles, function(i,x){
  <span data-name={x.name} rel="tooltip">Name<span>
});

// tooltip initialization in componentDidMount function
var self = this;
$('body').tooltip({
        selector: '[rel=tooltip]',
        title: self.tooltipMsg
 });

函数就像,

tooltipMsg: function(element){
   return $(this).attr('data-name'); // this code is return undefined, since this refers to ReactClass
}

如何在不使用此方法的情况下获取 tootipMsg 函数中的特定元素,或者是否有替代 "this" 引用的方法,它应该引用特定元素。

如果是静态元素我可以用"ref" https://facebook.github.io/react/docs/more-about-refs.html#the-ref-string-attribute 但在我的例子中,ref 是动态的。

提前致谢。

如果我正确理解问题(和评论对话),你想

  • 创建多个工具提示元素
  • 有某种toolTipMsg()函数来读取显示的工具提示的内容

当前设置看起来像一个长往返:

  • 在 react 渲染函数中,使用 jQuery 创建多个工具提示元素,并向每个元素传递一个 HTML 数据名称属性
  • 在 react componentDidMount 中,使用 jQuery 从 DOM 获取工具提示并附加监听器
  • 侦听器触发函数,该函数再次从 DOM 读取以获取工具提示 HTML 数据名称属性。

混合 jQuery 和阅读 DOM 的反应(或者 - 更糟 - 操纵 DOM)通常不是一个好主意。

更新:所以有2条可能的路线可以解决:

一个。仅 React 解决方案(NO jQuery,NO Bootstrap) 在 React 中,如果不需要,最好避免使用 refs。而且看起来你不需要它们。

您可以将变量绑定到 toolTipMsg(),然后使用它。 并在工具提示的 parent 上设置 MouseOver 侦听器。

React 风格的代码看起来或多或少像:

// tooltip element creation inside render function 
// of individual tooltip parent element
return 
  <div className="alwaysVisibleToolTipParent" 
    onMouseOver={this.toolTipMsg}>
    <p>someOtherContent</p>
    <span className="my-awesome-tooltip">{this.props.tooltipname}</span>
  </div>
});

// no need for componentDidMount: listener covered in initial render

// the function is much simpler now
tooltipMsg: function(){
   console.log(this.tooltipname);
}

您需要为此设置带有样式的工具提示(很遗憾,jQuery 没有任何好处)

b.或者:仅使用 Bootstrap 和 jQuery(无反应) Bootstrap 工具提示会触发您可以收听的自己的事件。 (documentation here).

在你的代码中,你会在某处:

$('#myToolTipParent').on('shown.bs.tooltip', function () {
  // 'this' is now the element (parent of the tooltip)
  tooltipMsg(this);
})

而您的 tooltipMsg() 函数将显示为:

function tooltipMsg(element) {
  // the text of the tooltip == the title attribute of the parent element of the tooltip
  console.log(element.getAttribute("title"));
}

我找到了一个基于@wintvelt 解决方案的工作代码,但是这个解决方案中的问题是工具提示消息不会在第一次显示,因为标题只在 tooltipMsg 中设置

//custom function inside createClass
tooltipMsg: function(disabled_by, dest, event) {
    $(event.target).attr("data-original-title", disabled_by);
     ..
},

// tooltip initialization inside componentDidMount
$('body').tooltip({
        selector: '[rel=tooltip]',
        template: '<div class="tooltip custom_tooltip"><div class="tooltip-arrow custom_tooltip-arrow"></div><div class="tooltip-inner custom_tooltip-inner"></div></div>',
});

// span tag creation inside each in render function
$.each(profiles, fucntion(i, profile) {
    var disabled = (profile.disabled) ? <span className="label label-important" data-toggle="tooltip" data-placement="right" onMouseOver={react_obj.tooltipMsg.bind(null,profile.Disabled_by)} rel="tooltip">Disabled</span>)
            : null
    <tr> 
        <td> {profile.Name}
            <br/>
            {disabled}
        </td>
    </tr>
});