You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
exportdefaultfunctioncatchErrors({ filename, components, imports }){const[React,ErrorReporter,reporterOptions]=imports;if(!React||!React.Component){thrownewError('imports[0] for react-transform-catch-errors does not look like React.');}// if (typeof ErrorReporter !== 'function') {// throw new Error('imports[1] for react-transform-catch-errors does not look like a React component.');// }returnfunctionwrapToCatchErrors(ReactClass,componentId){constoriginalRender=ReactClass.prototype.render;Object.defineProperty(ReactClass.prototype,'render',{configurable: true,value: functiontryRender(){try{returnoriginalRender.apply(this,arguments);}catch(err){setTimeout(()=>{if(typeofconsole.reportErrorsAsExceptions!=='undefined'){letprevReportErrorAsExceptions=console.reportErrorsAsExceptions;// We're in React Native. Don't throw.// Stop react-native from triggering its own error handlerconsole.reportErrorsAsExceptions=false;// Log an errorconsole.error(err);// Reactivate it so other errors are still handledconsole.reportErrorsAsExceptions=prevReportErrorAsExceptions;}else{throwerr;}});returnReact.createElement(ErrorReporter,{error: err,
filename,
...reporterOptions});}}});returnReactClass;};}
错误处理,我们首先想到的就是try catch 。
通常原理就是 try catch 捕获组件 render 中的的报错,之后渲染返回新的报错组件。
在当前类定义之后,借助于js这种动态修改类定义的特性,可以这样子:
当然,这种传统方式在使用ES6的组件上是无效的,所以针对另一种写法可以这样子:
遗留代码那么多,难道我要一个个去添加这种wrapper?
由react-transform-catch-errors得到的启发,顺着这一点,最后是找到了babel-plugin-react-transform这个插件,刚好就能满足这个需求。
下面详细配置一下babel
.babelrc
其中 catchErrors 和 errorFallback 可以在webpack 中配置 alias
下面贴一下 CatchErrors.js 的详细实现
ErrorFallback.js
这样的效果就是,当某个组件render 中报错时,组件内容会替换成 ErrorFallback.js 渲染,统一了生产和开发环境。方便业务处理,当然还有 decorator 方式一个一个加到组件上,如果你愿意的话。
The text was updated successfully, but these errors were encountered: