From 9691e021756996ddd096844057447f496d43a88d Mon Sep 17 00:00:00 2001 From: yuche Date: Mon, 3 Jun 2019 21:20:08 +0800 Subject: [PATCH] =?UTF-8?q?feat(tt):=20=E6=94=AF=E6=8C=81=20contextType,?= =?UTF-8?q?=20close=20#3301=20alipay,=20qq,=20swan=20=E4=B9=9F=E5=90=8C?= =?UTF-8?q?=E6=AD=A5=E6=94=AF=E6=8C=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/taro-alipay/src/lifecycle.js | 19 +++++++++++++++++++ packages/taro-qq/src/lifecycle.js | 19 +++++++++++++++++++ packages/taro-swan/src/lifecycle.js | 19 +++++++++++++++++++ packages/taro-tt/src/lifecycle.js | 19 +++++++++++++++++++ 4 files changed, 76 insertions(+) diff --git a/packages/taro-alipay/src/lifecycle.js b/packages/taro-alipay/src/lifecycle.js index 4af3cc3d2c31..c399bf57ead3 100644 --- a/packages/taro-alipay/src/lifecycle.js +++ b/packages/taro-alipay/src/lifecycle.js @@ -8,6 +8,7 @@ import { import { componentTrigger } from './create-component' import { shakeFnFromObject, isEmptyObject, diffObjToPath } from './util' import PropTypes from 'prop-types' +import { enqueueRender } from './render-queue' const isDEV = typeof process === 'undefined' || !process.env || @@ -57,6 +58,23 @@ export function updateComponent (component) { component.prevState = component.state } +function injectContextType (component) { + const ctxType = component.constructor.contextType + if (ctxType) { + const context = ctxType.context + const emiter = context.emiter + if (emiter === null) { + component.context = context._defaultValue + return + } + if (!component._hasContext) { + component._hasContext = true + emiter.on(_ => enqueueRender(component)) + } + component.context = emiter.value + } +} + function doUpdate (component, prevProps, prevState) { const { state, props = {} } = component let data = state || {} @@ -64,6 +82,7 @@ function doUpdate (component, prevProps, prevState) { // 返回null或undefined则保持不变 const isRunLoopRef = !component.__mounted if (component.__isReady) { + injectContextType(component) Current.current = component Current.index = 0 invokeEffects(component, true) diff --git a/packages/taro-qq/src/lifecycle.js b/packages/taro-qq/src/lifecycle.js index 1ac8874d2ee0..7019df5b664f 100644 --- a/packages/taro-qq/src/lifecycle.js +++ b/packages/taro-qq/src/lifecycle.js @@ -8,6 +8,7 @@ import { // import PropTypes from 'prop-types' import { componentTrigger } from './create-component' import { shakeFnFromObject, isEmptyObject, diffObjToPath } from './util' +import { enqueueRender } from './render-queue' // const isDEV = typeof process === 'undefined' || // !process.env || @@ -59,6 +60,23 @@ export function updateComponent (component) { component.prevState = component.state } +function injectContextType (component) { + const ctxType = component.constructor.contextType + if (ctxType) { + const context = ctxType.context + const emiter = context.emiter + if (emiter === null) { + component.context = context._defaultValue + return + } + if (!component._hasContext) { + component._hasContext = true + emiter.on(_ => enqueueRender(component)) + } + component.context = emiter.value + } +} + function doUpdate (component, prevProps, prevState) { const { state, props = {} } = component let data = state || {} @@ -66,6 +84,7 @@ function doUpdate (component, prevProps, prevState) { // 返回null或undefined则保持不变 const runLoopRef = !component.__mounted if (component.__isReady) { + injectContextType(component) Current.current = component Current.index = 0 invokeEffects(component, true) diff --git a/packages/taro-swan/src/lifecycle.js b/packages/taro-swan/src/lifecycle.js index bb177495a8dd..cc2630e59a4a 100644 --- a/packages/taro-swan/src/lifecycle.js +++ b/packages/taro-swan/src/lifecycle.js @@ -8,6 +8,7 @@ import { import { componentTrigger } from './create-component' import { shakeFnFromObject, isEmptyObject, diffObjToPath } from './util' import PropTypes from 'prop-types' +import { enqueueRender } from './render-queue' const isDEV = typeof process === 'undefined' || !process.env || @@ -57,6 +58,23 @@ export function updateComponent (component) { component.prevState = component.state } +function injectContextType (component) { + const ctxType = component.constructor.contextType + if (ctxType) { + const context = ctxType.context + const emiter = context.emiter + if (emiter === null) { + component.context = context._defaultValue + return + } + if (!component._hasContext) { + component._hasContext = true + emiter.on(_ => enqueueRender(component)) + } + component.context = emiter.value + } +} + function doUpdate (component, prevProps, prevState) { const { state, props = {} } = component let data = state || {} @@ -64,6 +82,7 @@ function doUpdate (component, prevProps, prevState) { // 返回null或undefined则保持不变 const isRunLoopRef = !component.__mounted if (component.__isReady) { + injectContextType(component) Current.current = component Current.index = 0 invokeEffects(component, true) diff --git a/packages/taro-tt/src/lifecycle.js b/packages/taro-tt/src/lifecycle.js index 7cf5c203f961..b94d5bc8fe99 100644 --- a/packages/taro-tt/src/lifecycle.js +++ b/packages/taro-tt/src/lifecycle.js @@ -8,6 +8,7 @@ import { import { componentTrigger } from './create-component' import { shakeFnFromObject, isEmptyObject, diffObjToPath } from './util' import PropTypes from 'prop-types' +import { enqueueRender } from './render-queue' const isDEV = typeof process === 'undefined' || !process.env || @@ -57,6 +58,23 @@ export function updateComponent (component) { component.prevState = component.state } +function injectContextType (component) { + const ctxType = component.constructor.contextType + if (ctxType) { + const context = ctxType.context + const emiter = context.emiter + if (emiter === null) { + component.context = context._defaultValue + return + } + if (!component._hasContext) { + component._hasContext = true + emiter.on(_ => enqueueRender(component)) + } + component.context = emiter.value + } +} + function doUpdate (component, prevProps, prevState) { const { state, props = {} } = component let data = state || {} @@ -64,6 +82,7 @@ function doUpdate (component, prevProps, prevState) { // 返回null或undefined则保持不变 const isRunLoopRef = !component.__mounted if (component.__isReady) { + injectContextType(component) Current.current = component Current.index = 0 invokeEffects(component, true)