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,
// }
if (once) {
- doIf()
+ doChange()
} else {
- renderEffect(() => doIf())
+ renderEffect(() => doChange())
}
// TODO: SSR
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)
}
}
}
+
+/*! #__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,
+ )
+}
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'