在 React.js 中的 jsx 中将 this.refs 作为 属性 传递
Pass this.refs as property in jsx in React.js
我正在尝试将 1 个节点作为另一个 React 组件的 属性 传递,如下所示:
render: function() {
return (
<div>
<div ref='statusCircle'></div>
<Popover trigger={ this.refs.statusCircle }></Popover>
</div>);
);
}
但是在 Popover 中,this.props.trigger 是 NULL。
我的代码有什么问题吗?
如何将节点引用作为 属性 传递给另一个 React 组件?
你误解了 React 中的组件生命周期。
看这里:Link
看到这个 fiddle。 https://jsfiddle.net/uzvoruf7/
打开控制台,检查 "Composite" 组件的代码,并查看生命周期挂钩。
var Popover = React.createClass({
render: function() {
return (<div>This is a pop-over</div>);
}
});
var Composite = React.createClass({
componentDidMount: function() {
console.log(this.refs.statusCircle); //ok, exists.
},
render: function() {
console.log(this.refs.statusCircle); //doesn't exist, sorry.
return (
<div>
<div ref='statusCircle'></div>
<Popover trigger={this.refs.statusCircle}></Popover>
</div>
);
}
});
ReactDOM.render(
<Composite />,
document.getElementById('container')
);
"refs" 在 DOM 被渲染后活跃起来。
因此,在 return 语句中,dom 尚未呈现 ,因此引用为空(或所有引用可以说是空的)。
但是,在 componentDidMount 中,您可以看到您的引用正如预期的那样可用。
这是一个常见错误:可能存在需要重构的代码异味。通常(并非总是),向下传递 dom-references 表示命令式思维过程,而不是 React 方式。我会建议改进,但我不知道你的 use-case。
输入此内容后,我意识到这实际上不是对原始问题的回答,而是对您在上述评论中提出的建议请求的跟进。如果你真的不相信它应该保留,我会删除它但它太大了无法评论,抱歉。
Reference material
您一定是在使用旧版本的 React,因此一开始您可能觉得这不合适,但您可以通过执行
在该父组件中使用状态来跟踪该信息
ref={ function ( element ) {
// at the top of render() put
// var self = this;
self.setState({
circleWidth: element.offsetWidth,
circleHeight: element.offsetHeight
})
}
假设这些值随时间变化,您需要为该变化添加一个事件侦听器(可以在 ref
设置中添加)并让它 运行 setState
当你需要它重新渲染时再次出现。
至于 <Popover trigger=
你需要做一些事情来达到以下效果:
<Popover trigger={this.state.circleWidth > 999} />
...其中 999 是您的触发值。如果它 returns 为真,那么您将呈现 Popover。如果没有,你摧毁它。这两种情况都将在 Popover 内部处理,但不需要触及 div
当然,React 中的良好做法是在 render()
的顶部进行比较,并将结果放入变量中,例如 isTriggered
.
我正在尝试将 1 个节点作为另一个 React 组件的 属性 传递,如下所示:
render: function() {
return (
<div>
<div ref='statusCircle'></div>
<Popover trigger={ this.refs.statusCircle }></Popover>
</div>);
);
}
但是在 Popover 中,this.props.trigger 是 NULL。
我的代码有什么问题吗?
如何将节点引用作为 属性 传递给另一个 React 组件?
你误解了 React 中的组件生命周期。 看这里:Link
看到这个 fiddle。 https://jsfiddle.net/uzvoruf7/
打开控制台,检查 "Composite" 组件的代码,并查看生命周期挂钩。
var Popover = React.createClass({
render: function() {
return (<div>This is a pop-over</div>);
}
});
var Composite = React.createClass({
componentDidMount: function() {
console.log(this.refs.statusCircle); //ok, exists.
},
render: function() {
console.log(this.refs.statusCircle); //doesn't exist, sorry.
return (
<div>
<div ref='statusCircle'></div>
<Popover trigger={this.refs.statusCircle}></Popover>
</div>
);
}
});
ReactDOM.render(
<Composite />,
document.getElementById('container')
);
"refs" 在 DOM 被渲染后活跃起来。
因此,在 return 语句中,dom 尚未呈现 ,因此引用为空(或所有引用可以说是空的)。
但是,在 componentDidMount 中,您可以看到您的引用正如预期的那样可用。
这是一个常见错误:可能存在需要重构的代码异味。通常(并非总是),向下传递 dom-references 表示命令式思维过程,而不是 React 方式。我会建议改进,但我不知道你的 use-case。
输入此内容后,我意识到这实际上不是对原始问题的回答,而是对您在上述评论中提出的建议请求的跟进。如果你真的不相信它应该保留,我会删除它但它太大了无法评论,抱歉。
Reference material
您一定是在使用旧版本的 React,因此一开始您可能觉得这不合适,但您可以通过执行
在该父组件中使用状态来跟踪该信息ref={ function ( element ) {
// at the top of render() put
// var self = this;
self.setState({
circleWidth: element.offsetWidth,
circleHeight: element.offsetHeight
})
}
假设这些值随时间变化,您需要为该变化添加一个事件侦听器(可以在 ref
设置中添加)并让它 运行 setState
当你需要它重新渲染时再次出现。
至于 <Popover trigger=
你需要做一些事情来达到以下效果:
<Popover trigger={this.state.circleWidth > 999} />
...其中 999 是您的触发值。如果它 returns 为真,那么您将呈现 Popover。如果没有,你摧毁它。这两种情况都将在 Popover 内部处理,但不需要触及 div
当然,React 中的良好做法是在 render()
的顶部进行比较,并将结果放入变量中,例如 isTriggered
.