From 896ae850781d340208ceada632d62b2e3226bc3d Mon Sep 17 00:00:00 2001 From: yuche Date: Mon, 3 Jun 2019 20:16:38 +0800 Subject: [PATCH] =?UTF-8?q?refactor(weapp):=20=E4=B8=A4=E6=96=B0=E7=94=9F?= =?UTF-8?q?=E5=91=BD=E5=91=A8=E6=9C=9F=E6=9C=89=E4=BB=BB=E4=B8=80=E5=AD=98?= =?UTF-8?q?=E5=9C=A8=EF=BC=8C=E5=B0=B1=E4=B8=8D=E4=BC=9A=E8=B0=83=E7=94=A8?= =?UTF-8?q?=E6=97=A7=E7=94=9F=E5=91=BD=E5=91=A8=E6=9C=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/apis/about/tarocomponent.md | 4 +++- packages/taro-weapp/src/lifecycle.js | 8 ++++++-- 2 files changed, 9 insertions(+), 3 deletions(-) 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 = []