Skip to content

Commit

Permalink
feat(runtime-vapor): export createBranch
Browse files Browse the repository at this point in the history
  • Loading branch information
sxzz committed Nov 14, 2024
1 parent 3da5ecf commit 59975ed
Show file tree
Hide file tree
Showing 2 changed files with 31 additions and 12 deletions.
41 changes: 30 additions & 11 deletions packages/runtime-vapor/src/apiCreateIf.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,19 +6,21 @@ import { createComment, createTextNode, insert, remove } from './dom/element'
type BlockFn = () => Block

/*! #__NO_SIDE_EFFECTS__ */
export const createIf = (
condition: () => any,
b1: BlockFn,
b2?: BlockFn,
export function createBranch(
expression: () => any,
render: (value: any) => BlockFn | undefined,
once?: boolean,
commentLabel?: string,
// hydrationNode?: Node,
): Fragment => {
): Fragment {
let newValue: any
let oldValue: any
let branch: BlockFn | undefined
let block: Block | undefined
let scope: EffectScope | undefined
const anchor = __DEV__ ? createComment('if') : createTextNode()
const anchor = __DEV__
? createComment(commentLabel || 'dynamic')
: createTextNode()
const fragment: Fragment = shallowReactive({
nodes: [],
anchor,
Expand All @@ -32,9 +34,9 @@ export const createIf = (
// }

if (once) {
doIf()
doChange()
} else {
renderEffect(() => doIf())
renderEffect(() => doChange())
}

// TODO: SSR
Expand All @@ -44,14 +46,15 @@ export const createIf = (

return fragment

function doIf() {
if ((newValue = !!condition()) !== oldValue) {
function doChange() {
if ((newValue = expression()) !== oldValue) {
const parent = anchor.parentNode
if (block) {
scope!.stop()
remove(block, parent!)
}
if ((branch = (oldValue = newValue) ? b1 : b2)) {
oldValue = newValue
if ((branch = render(newValue))) {
scope = effectScope()
fragment.nodes = block = scope.run(branch)!
parent && insert(block, parent, anchor)
Expand All @@ -62,3 +65,19 @@ export const createIf = (
}
}
}

/*! #__NO_SIDE_EFFECTS__ */
export function createIf(
condition: () => any,
b1: BlockFn,
b2?: BlockFn,
once?: boolean,
// hydrationNode?: Node,
): Fragment {
return createBranch(
() => !!condition(),
value => (value ? b1 : b2),
once,
__DEV__ ? 'if' : undefined,
)
}
2 changes: 1 addition & 1 deletion packages/runtime-vapor/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -126,7 +126,7 @@ export {
type ObjectPlugin,
type FunctionPlugin,
} from './apiCreateVaporApp'
export { createIf } from './apiCreateIf'
export { createBranch, createIf } from './apiCreateIf'
export { createFor, createForSlots } from './apiCreateFor'
export { createComponent } from './apiCreateComponent'
export { createSelector } from './apiCreateSelector'
Expand Down

0 comments on commit 59975ed

Please sign in to comment.