gpt4 book ai didi

javascript - React 组件之间的通信

转载 作者:行者123 更新时间:2023-12-03 09:41:38 24 4
gpt4 key购买 nike

在尝试使用 React 时,我遇到了架构问题。我想使用 React JS 以最可重用的方式切换选项卡。

因此,理想情况下,我正在寻找一种方法,在单击 TabHeading 时,我停用 TabHeader 标题中的其他 TabHeading,并激活 TabContent 中相应的 TabPane(来自 this.props.target)。

$(".tab-pane").hide();
$(React.findDOMNode(this.props.target)).show();

我想避免上述解决方案。我不想在任何地方使用 classNames,或者将父组件作为 prop 传递。Angular 有 $parent 或某种变量来调用父组件上的函数吗?是否有类似的方法而不显式传递父级?有没有办法和 sibling 沟通?请帮忙。

<Tabs>
<TabHeader>
<TabHeading active="active" target={self.refs.pane1}>
Heading 1
</TabHeading>
<TabHeading target={self.refs.pane2}>
Heading 2
</TabHeading>
</TabHeader>
<TabContent>
<TabPane active="active" ref="pane1">
Pane 1
</TabPane>
<TabPane ref="pane2">
Pane 2
</TabPane>
</TabContent>
</Tabs>

JS 文件

var React = require("react");
var $ = require("jquery");

var TabHeader = React.createClass({
render: function(){
return(
<div className="tab-header">
{this.props.children}
</div>
);
}
});

var TabHeading = React.createClass({
componentDidMount : function(){

},
handleClick : function(e){
//something to set siblings to inactive
//this.props.active="active";
// this.props.target.props.active = "active";

},
render: function(){
return(
<div className="tab-heading" onClick={this.handleClick} >
{this.props.children}
</div>
);
}
});


var TabContent = React.createClass({
render: function(){
return(
<div className="tab-content">
{this.props.children}
</div>
);
}
});


var TabPane = React.createClass({
componentDidMount:function(){
console.log(this.props.children);
},
render: function(){
return(
<div className="tab-pane">
{this.props.children}
</div>
);
}
});


var Tabs = React.createClass({
componentDidMount:function(){

},
render: function(){
return(
<div className="tabs">
{this.props.children}
</div>
);
}
});
Tabs.TabHeader = TabHeader;
Tabs.TabHeading = TabHeading;
Tabs.TabContent = TabContent;
Tabs.TabPane = TabPane;

module.exports = Tabs;

JSfiddle

最佳答案

我找到了没有 Flux 的答案。请随时提出改进方法。

Tabs.js

var React = require("react");
var $ = require("jquery");


var TabHeading = React.createClass({

render : function(){
var view ;

return (
<div onClick={this.props.handleClick} className={this.props.active? "active tab-heading" : "tab-heading"}>
{this.props.children}
</div>
);
}
});



var TabPane = React.createClass({
render : function(){

return (
<div className={this.props.active? "active tab-pane" : "tab-pane"}>
{this.props.children}
</div>
);
}
});

var Tabs = React.createClass({

handleClick:function(){
this.props.active = arguments[0];
this.forceUpdate();
},
render : function(){
var self = this;
console.log("rendering");
var tabHeadings = this.props.tabHeadings.map(function(item,index){
active = (index==self.props.active);
return <TabHeading key={index} handleClick={self.handleClick.bind(self,index)} index={index} active={active}>{item}</TabHeading>
});
var tabPanes= self.props.tabPanes.map(function(item,index){
active = (index==self.props.active);
return <TabPane key={index} active={active}>{item}</TabPane>

});

return (
<div className="tab">
<div className="tab-header">
{tabHeadings}
</div>
<div className="tab-content">
{tabPanes}
</div>
</div>
);
}
});

module.exports = Tabs;

File.js

render:function(){

var self = this;

var tabHeading1 = (
<p> Heading 1 </p>
);
var tabHeading2 = (
<p> Heading 2 </p>
);
var tabPane1 = (
<p> Pane 1 </p>
);
var tabPane2 = (
<p> Pane 2 </p>
);
var tabHeadings = [tabHeading1,tabHeading2];
var tabPanes = [tabPane1,tabPane2];

return (<div>
<div className="container">
<Tabs tabHeadings={tabHeadings} tabPanes={tabPanes} active="0"/>
</div>
</div>
);
}

JSFIDDLE - link

关于javascript - React 组件之间的通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31165886/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com