在与Redux,flux和其他pub / sub方法挣扎太多之后,我最终得到了以下技术。我不知道这是否会造成一些重大损失或瑕疵,所以在这里张贴以获得有经验的程序员关于其利弊的一些启示。
var thisManager = function(){
var _Manager = [];
return{
getThis : function(key){
return _Manager[key];
},
setThis : function(obj){
_Manager[obj.key] = obj.value;
}
}
};
var _thisManager = new thisManager();
// React Component
class Header extends Component{
constructor(){
super();
_thisManager.setThis({ key: "Header", value:this}
}
someFunction(data){
// call this.setState here with new data.
}
render(){
return <div />
}
}
// Then from any other component living far somewhere you can pass the data to the render function and it works out of the box.
i.e.
class Footer extends Component{
_click(e){
let Header = _thisManager.getThis('Header');
Header.somefunction(" Wow some new data from footer event ");
}
render(){
return(
<div>
<button onClick={this._click.bind(this)}> send data to header and call its render </button>
</div>
);
}
}
我在我的应用程序中发送json作为数据,它完美呈现所需的组件,我可以调用渲染而不需要任何pub / sub或深度传递道具来调用父方法,并更改this.setState以导致重新渲染。
到目前为止,该应用程序运行良好,我也很喜欢它的简单性。请注意这项技术的利弊
此致
编辑:
调用渲染是不好的,所以我将其更改为另一种方法以获得此设置的更多优缺点。
答案 0 :(得分:1)
此设置的两个主要问题:
的 1。您不应该直接调用反应生命周期方法
的 2。后门组件是一个坏主意,它会破坏反应的可维护性
广告1:
如果直接调用render()
(或任何其他反应方法),则可能不会在组件树中调用componentDidMount()
,componentDidUpdate()和其他生命周期方法。
危险是:
getInitialState()
,componentWillReceiveProps()
,shouldComponentUpdate()
,componentDidMount()
等等。如果您致电{{1直接地,许多组件可能会破坏或显示出奇怪的行为。更好(但仍违反我的第二点):
render()
。广告2。 直接引用已安装的组件(如您的thisManager所做的那样)还有一些额外的风险。 React的设计和限制有一个原因:使用props和state来维护单向流和组件层次结构,以便于维护。
如果你打破这种模式 - 通过在组件中构建一个允许操纵状态的后门 - 你可以打破这种反应的设计原则。这是一个快速的快捷方式,但是当您的应用程序增长时,肯定会带来巨大的痛苦和挫败感。
据我所知,此规则唯一可接受的例外是:
因此,如果您想将其用于此目的,那么您应该没问题。 警告:标准反应方法保护对组件的随机访问,因为调用组件或方法需要具有对组件的引用。在这两个例子中都有这样的参考资料 在您的设置中,任何外部代码都可以在参考号中查找&#34;标题&#34;在您的表中,并调用更新状态的方法。 有了这样的间接引用,并且无法确定哪个源实际上调用了您的组件,您的代码可能会变得更难以调试/维护。