【发布时间】:2017-04-22 11:52:36
【问题描述】:
我正在做出反应,我正在创建一个带有工具提示的按钮,但我无法放置它。我的意思是我无法读取按钮与顶部和左侧的距离。
我尝试了 offsetTop 和 offsetLeft,我得到了这个错误:“Uncaught TypeError: Cannot read property 'offsetWidth' of undefined” 所以我尝试了 getBoundingClientRect(),我得到的只是另一个错误:“未捕获的 TypeError:elem.getBoundingClientRect 不是函数”。
我通过将距离分配给全局变量来将信息从组件传递到第二个组件,并在我需要放置它时在第二个组件中读取它。
这是我的代码(在我尝试使用 getBoundingClientRect 做某事时在舞台上):
import React from 'react';
import ReactDOM from 'react-dom';
import Style from 'style-it';
var Ink = require('react-ink');
import FontIcon from '../FontIcon/FontIcon';
var options;
var Tooltip = React.createClass({
render(){
var _props = this.props,
style = {
top: options.y,
left: options.x,
};
return(
<div className="tooltip" style={style}>{_props.text}</div>
);
}
});
var IconButton = React.createClass({
getInitialState() {
return {
iconStyle: "",
style: "",
cursorPos: {},
};
},
extend(obj, src) {
Object.keys(src).forEach(function(key) { obj[key] = src[key]; });
return obj;
},
render() {
var _props = this.props,
opts = {},
disabled = false,
rippleOpacity,
outterStyleMy = {
border: "none",
outline: "none",
padding: "8px 10px",
"background-color": "red",
"border-radius": 100 + "%",
cursor: "pointer",
},
iconStyleMy = {
"font-size": 12 + "px",
"text-decoration": "none",
"text-align": "center",
display: 'flex',
'justify-content': 'center',
'align-items': 'center',
},
rippleStyle = {
color: "rgba(0,0,0,0.5)",
};
if (_props.disabled || _props.disableTouchRipple) {
rippleStyle.opacity = 0;
};
this.setState({
iconStyle: _props.iconStyle
});
this.setState({
style: _props.style
});
if (_props.disabled) {
disabled = true;
};
if (this.state.labelStyle) {
iconStyleMy = this.state.iconStyle;
};
if (this.state.style) {
outterStyleMy = this.state.style;
};
if (_props.href) {
opts.href = _props.href;
};
function showTooltip(elem){
// Here I tried to use offset methods, it's how it looked like:
// options = {
// w: this.refs.button.offsetWidth,
// x: this.refs.button.offsetLeft,
// y: this.refs.button.offsetTop
// };
var rect = elem.getBoundingClientRect();
options = {
x: rect.left,
y: rect.top
};
};
function removeTooltip(elem){
options = null;
};
var buttonStyle = this.extend(outterStyleMy, iconStyleMy);
return(
<Style>
{`
.IconButton{
position: relative;
}
.IconButton:disabled{
color: ${_props.disabledColor};
}
.btnhref{
text-decoration: none;
}
`}
<a {...opts} className="btnhref" >
<Tooltip text={_props.tooltip} position={this.options} />
<button ref="button" className={"IconButton" + _props.className} disabled={disabled} style={buttonStyle}
onMouseEnter={showTooltip(this)} onMouseLeave={removeTooltip(this)} >
<Ink background={true} style={rippleStyle} opacity={rippleOpacity} />
<FontIcon className={_props.iconClassName}/>
</button>
</a>
</Style>
);
}
});
ReactDOM.render(
<IconButton href="" className="" iconStyle="" style="" iconClassName="face" disabled="" disableTouchRipple="" tooltip="aaaaa" />,
document.getElementById('app')
);
我不知道出了什么问题 :/ 谢谢你的帮助 :)
【问题讨论】:
标签: javascript reactjs