Skip to content
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(react): 支付宝小程序插件配置字段缺失、Taro专有Hooks在小程序插件页面中无法使用 #11362

Merged
merged 12 commits into from
Mar 27, 2022
Merged
3 changes: 2 additions & 1 deletion packages/taro-loader/src/native-component.ts
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,8 @@ import { container, SERVICE_IDENTIFIER } from '@tarojs/runtime'
import { createNativeComponentConfig } from '${creatorLocation}'
${importFrameworkStatement}
var hooks = container.get(SERVICE_IDENTIFIER.Hooks)
hooks.initNativeApiImpls = [defaultReconciler.initNativeApi]

hooks.initNativeApiImpls = [...(hooks.initNativeApiImpls || []), defaultReconciler.initNativeApi]
Chen-jj marked this conversation as resolved.
Show resolved Hide resolved
var component = require(${stringify(componentPath)}).default
var config = ${configString};
var inst = Component(createNativeComponentConfig(component, ${frameworkArgs}))
Expand Down
32 changes: 24 additions & 8 deletions packages/taro-plugin-react/src/runtime/connect-native.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,10 @@ import {
safeExecute,
addLeadingSlash,
incrementId,
eventHandler
eventHandler,
SERVICE_IDENTIFIER,
container,
IHooks
} from '@tarojs/runtime'
import { isClassComponent } from './utils'
import { setReconciler } from './connect'
Expand All @@ -19,10 +22,12 @@ import type {

declare const getCurrentPages: () => PageInstance[]

const hooks = container.get<IHooks>(SERVICE_IDENTIFIER.Hooks)
const getNativeCompId = incrementId()
let R: typeof React
export let RNative: typeof React
let h: typeof React.createElement
let ReactDOM
export let PageContextNative: React.Context<string>

function initNativeComponentEntry (R: typeof React, ReactDOM) {
interface IEntryState {
Expand All @@ -34,9 +39,13 @@ function initNativeComponentEntry (R: typeof React, ReactDOM) {

interface IWrapperProps {
getCtx: () => any
renderComponent: (ctx: any) => React.ReactElement
renderComponent: (ctx: any) => React.ReactElement,
id: string,
}

if (!PageContextNative) {
PageContextNative = R.createContext('')
}
class NativeComponentWrapper extends R.Component<IWrapperProps, Record<any, any>> {
root = R.createRef<TaroRootElement>()
ctx = this.props.getCtx()
Expand All @@ -55,7 +64,13 @@ function initNativeComponentEntry (R: typeof React, ReactDOM) {
{
ref: this.root
},
this.props.renderComponent(this.ctx)
h(
PageContextNative.Provider,
{
value: this.props.id
},
this.props.renderComponent(this.ctx)
)
)
)
}
Expand All @@ -81,6 +96,7 @@ function initNativeComponentEntry (R: typeof React, ReactDOM) {
compId,
element: h(NativeComponentWrapper, {
key: compId,
id: compId,
getCtx,
renderComponent (ctx) {
return h(Component, { ...(ctx.data ||= {}).props, ...refs, $scope: ctx })
Expand Down Expand Up @@ -109,7 +125,7 @@ function initNativeComponentEntry (R: typeof React, ReactDOM) {
}
}

setReconciler(ReactDOM)
setReconciler(ReactDOM, hooks)

const app = document.getElementById('app')

Expand All @@ -120,11 +136,11 @@ function initNativeComponentEntry (R: typeof React, ReactDOM) {
}

export function createNativeComponentConfig (Component, react: typeof React, reactdom, componentConfig) {
R = react
RNative = react
h = react.createElement
ReactDOM = reactdom

setReconciler(ReactDOM)
setReconciler(ReactDOM, hooks)

const componentObj: Record<string, any> = {
options: componentConfig,
Expand All @@ -139,7 +155,7 @@ export function createNativeComponentConfig (Component, react: typeof React, rea
},
created () {
if (!Current.app) {
initNativeComponentEntry(R, ReactDOM)
initNativeComponentEntry(RNative, ReactDOM)
}
},
attached () {
Expand Down
4 changes: 2 additions & 2 deletions packages/taro-plugin-react/src/runtime/connect.ts
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ let ReactDOM
const pageKeyId = incrementId()
const hooks = container.get<IHooks>(SERVICE_IDENTIFIER.Hooks)

export function setReconciler (ReactDOM) {
export function setReconciler (ReactDOM, hooks) {
hooks.getLifecycle = function (instance, lifecycle: string) {
lifecycle = lifecycle.replace(/^on(Show|Hide)$/, 'componentDid$1')
return instance[lifecycle]
Expand Down Expand Up @@ -183,7 +183,7 @@ export function createReactApp (
const isReactComponent = isClassComponent(R, App)
let appWrapper: AppWrapper

setReconciler(ReactDOM)
setReconciler(ReactDOM, hooks)

function getAppInstance (): ReactAppInstance | null {
return appInstanceRef.current
Expand Down
10 changes: 9 additions & 1 deletion packages/taro-plugin-react/src/runtime/hooks.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,19 @@ import {
getPageInstance,
injectPageInstance
} from '@tarojs/runtime'
import { PageContext, R as React } from './connect'

import * as Connect from './connect'
import * as ConnectNative from './connect-native'

import { HOOKS_APP_ID } from './utils'

import type { Func, PageLifeCycle } from '@tarojs/runtime'

const taroHooks = (lifecycle: keyof PageLifeCycle) => {
return (fn: Func) => {
const PageContext = ConnectNative.PageContextNative || Connect.PageContext
const React = ConnectNative.RNative || Connect.R

const id = React.useContext(PageContext) || HOOKS_APP_ID

// hold fn ref and keep up to date
Expand Down Expand Up @@ -84,6 +90,8 @@ export const useAddToFavorites = taroHooks('onAddToFavorites')
export const useReady = taroHooks('onReady')

export const useRouter = (dynamic = false) => {
const React = ConnectNative.RNative || Connect.R

return dynamic ? Current.router : React.useMemo(() => Current.router, [])
}

Expand Down