-
Notifications
You must be signed in to change notification settings - Fork 4.8k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
fix(runtime): 修复 react 框架用户自定义 componentDidCatch 无效的问题 #8191
fix(runtime): 修复 react 框架用户自定义 componentDidCatch 无效的问题 #8191
Conversation
@digiaries React 中规定 包裹组件默认添加了 总结来说, 默认情况下 Taro 会自动设置错误边界,令页面错误不至于令程序崩溃。 要手动捕获页面子组件树的错误,把页面组件设置为错误边界即可。 要手动捕获包括页面组件自身的错误,书写一个错误边界组件,然后包裹页面组件即可,这样也符合 React 的使用规范: class Index extends Component {
componentDidMount () {
throw Error('xxx')
}
render () {
return (
<View>index</View>
)
}
}
export default class ErrorBoundary extends Component {
static getDerivedStateFromError () {
return {
hasError: true
}
}
state = {
hasError: false
}
componentDidCatch (err) {
console.log('error: ', err)
}
render () {
return this.state.hasError ? <View>something error</View> : <Index />
}
} |
这里的问题是如果用这个包裹,会导致一些像小程序的分享等方面的功能异常,所以希望是直接在页面上启用而不是额外再包裹一层。 |
@digiaries 使用了 HOC 后,小程序页面生命周期不触发的确是一个问题。 但感觉还是应该遵循 React 的规范,页面组件的错误能在页面组件中捕获的做法有点 hack。 建议页面组件,写成函数式组件,小程序页面生命周期的 hook 是能生效的。 // index.js
function Index () {
useShareAppMessage(() => {
return {
title: 'xxx'
}
})
return (
<View>
index
</View>
)
}
export default class ErrorBoundary extends Component {
static getDerivedStateFromError (error) {
return {
hasError: true
}
}
state = {
hasError: false
}
componentDidCatch (err) {
console.log('error: ', err)
}
render () {
return this.state.hasError ? <View>something error</View> : <Index />
}
} 页面配置要记得配一下开启分享: // index.config.js
export default {
navigationBarTitleText: '首页',
enableShareAppMessage: true
} |
@Chen-jj 每个页面都要单独写 error boundary 吗?能否在全局添加? |
可以封装为一个 HOC 吧 |
` ... render() { } |
@tomnattle 把页面组件使用错误边界包裹一层,像上述回答一样 |
有属性可以关闭Taro 自身自动设置错误边界,我不想要它 |
这个 PR 做了什么? (简要描述所做更改)
增加了 React 框架中对应用开发者自定义的 componentDidCatch 的处理逻辑。
这个 PR 是什么类型? (至少选择一个)
这个 PR 满足以下需求:
这个 PR 涉及以下平台:
其它需要 Reviewer 或社区知晓的内容: