我的app结构如下(HighOrderComponent是Alt的AltContainer包装器):
<App>
<HighOrderComponent store={someStore...}>
<MyCanvasComponent ref="canvasRef" />
</HighOrderComponent>
</App>
Run Code Online (Sandbox Code Playgroud)
我需要公开一个collectData()方法,MyCanvasComponent因为一旦在App组件中单击按钮,画布需要将其内容转换为base64图像.
我想,在button的click处理程序,才能够使用this.refs.canvasRef.collectData().
不幸的是,似乎refs没有考虑嵌套组件.我知道一般refs应该被认为是私人的(即属于HighOrderComponent)但是 -
它们也不可用,这意味着如果我分配一个ref="highOrderComponentRef"然后this.refs.highOrderComponentRef会工作但this.refs.highOrderComponentRef.refs.canvasRef不会.
这HighOrderComponent是一个通用组件,因此不知道它的孩子会是什么.
该this.props.children上HighOrderComponent是ReactElement轻量且不会暴露自己的方法类型.
到目前为止唯一的解决方案是传递MyCanvasComponent一个回调函数,它将自己发送一个回调函数并保存一个引用,但是根据React 0.13发行说明,这很乏味且反对最佳实践
ref resolution命令稍有改动,以便在调用componentDidMount方法后立即获得组件的引用; 只有当组件在componentDidMount中调用父组件的回调时,才应该观察到这种变化,这是一种反模式,无论如何都应该避免
我有一个负责日志记录操作的包装器,名为OperationWrapper.它的结构简单,如下:
public void runOperation(Operation o) throws Exception{
logOperationStarted();
o.execute();
logOperationFinished();
}
Run Code Online (Sandbox Code Playgroud)
由于"o"操作可以抛出异常,因此logOperationFinished()不会始终调用该方法,因此日志记录无法正常运行.
此外,调用该runOperation()方法的各种组件处理这些异常.
我想确保logOperationFinished()始终运行,我实现了以下结构:
public void runOperation(Operation o) throws Exception{
logOperationStarted();
try{
o.execute();
}
catch(Exception e){
throw e;
}
finally{
logOperationFinished();
}
}
Run Code Online (Sandbox Code Playgroud)
现在logOperationFinished()总是运行,但我收到IntelliJ的警告:
立即重新捕获捕获的异常
报告任何捕获块,其中立即重新捕获捕获的异常,而不对其执行任何操作.这种 捕获块是不必要的或缺乏错误处理.
对我来说,似乎IntelliJ在发出此警告时没有考虑finally块.
我做错了什么还是有更好的方法来实现这个目标?
谢谢.
我有一个 UIImageView (它实际上是一个 FLAnimatedImageView)。我使用自动布局来设置其约束以占据整个屏幕。这在 iPhone 中效果很好,但在 iPad 中,自动创建的内容限制(如图所示)导致它只占用部分屏幕尺寸。
我不明白为什么要创建这些约束,如果确实需要它们,为什么不遵守尾随/前导约束?