diff --git a/docs/apis/about/tarocomponent.md b/docs/apis/about/tarocomponent.md index 799e617bdf6..7f54fe038a4 100644 --- a/docs/apis/about/tarocomponent.md +++ b/docs/apis/about/tarocomponent.md @@ -80,7 +80,7 @@ class Welcome extends Component { constructor(props) ``` -React 组件的构造函数将会在装配之前被调用。当为一个 `Taro.Component` 子类定义构造函数时,你应该在任何其他的表达式之前调用 `super(props)`。否则,this.props 在构造函数中将是未定义,并可能引发异常。 +Taro 组件的构造函数将会在装配之前被调用。当为一个 `Taro.Component` 子类定义构造函数时,你应该在任何其他的表达式之前调用 `super(props)`。否则,this.props 在构造函数中将是未定义,并可能引发异常。 构造函数是初始化状态的合适位置。若你不初始化状态且不绑定方法,那你也不需要为你的 Taro 组件定义一个构造函数。 @@ -88,6 +88,8 @@ React 组件的构造函数将会在装配之前被调用。当为一个 `Taro.C 可以基于属性来初始化状态。这样有效地“分离(forks)”属性并根据初始属性设置状态。 +### + ### componentWillMount() ```jsx diff --git a/packages/taro-weapp/src/lifecycle.js b/packages/taro-weapp/src/lifecycle.js index 4fbf1f4cbca..b4a8e9fec6d 100644 --- a/packages/taro-weapp/src/lifecycle.js +++ b/packages/taro-weapp/src/lifecycle.js @@ -15,7 +15,8 @@ import { enqueueRender } from './render-queue' // process.env.NODE_ENV !== 'production' function hasNewLifecycle (component) { - return isFunction(component.constructor.getDerivedStateFromProps) + const { getDerivedStateFromProps, getSnapshotBeforeUpdate } = component.constructor + return isFunction(getDerivedStateFromProps) || isFunction(getSnapshotBeforeUpdate) } function callGetDerivedStateFromProps (component, props, state) { @@ -145,7 +146,6 @@ function doUpdate (component, prevProps, prevState) { Current.current = null } } - const snapshot = callGetSnapshotBeforeUpdate(component, prevProps, prevState) data = Object.assign({}, props, data) if (component.$usedState && component.$usedState.length) { @@ -171,6 +171,10 @@ function doUpdate (component, prevProps, prevState) { const dataDiff = diffObjToPath(data, component.$scope.data) const __mounted = component.__mounted + let snapshot + if (__mounted) { + snapshot = callGetSnapshotBeforeUpdate(component, prevProps, prevState) + } // 每次 setData 都独立生成一个 callback 数组 let cbs = []