Skip to content

Commit 544a32b

Browse files
authored
6.04 核心上线 (#627)
1 parent 4812b28 commit 544a32b

File tree

5 files changed

+71
-33
lines changed

5 files changed

+71
-33
lines changed
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
<!--htmlcs-disable-->
2+
<!DOCTYPE html>
3+
<html mip>
4+
<head>
5+
<meta charset="utf-8">
6+
<title>MIP tree demo</title>
7+
<meta name="apple-touch-fullscreen" content="yes">
8+
<meta name="apple-mobile-web-app-capable" content="yes">
9+
<meta name="format-detection" content="telephone=no">
10+
<meta name="viewport" content="width=device-width,minimum-scale=1,initial-scale=1">
11+
<link rel="stylesheet" href="../../dist/mip.css">
12+
<style mip-custom>
13+
</style>
14+
</head>
15+
16+
<body>
17+
<mip-test-slot><span>hello</span></mip-test-slot>
18+
<script src="../../dist/mip.js"></script>
19+
<script src="../../dist/mip-vue.js"></script>
20+
<script src="./mip-test-slot.js"></script>
21+
</body>
22+
</html>
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
/**
2+
* @file mip-tree
3+
* @author sfe
4+
*/
5+
6+
/* global MIP */
7+
8+
MIP.registerVueCustomElement('mip-test-slot', {
9+
template: `
10+
<div>
11+
<div v-for="i in [1, 2, 3, 4, 5, 6,7]" :key="i">
12+
{{ i }}
13+
<slot></slot>
14+
</div>
15+
</div>
16+
`
17+
})

packages/mip/src/vue/core/instance/render-helpers/render-slot.js

Lines changed: 9 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ export function renderSlot (
1919
bindObject
2020
) {
2121
const scopedSlotFn = this.$scopedSlots[name]
22+
let nodes
2223
if (scopedSlotFn) { // scoped slot
2324
props = props || {}
2425
if (bindObject) {
@@ -32,18 +33,15 @@ export function renderSlot (
3233
props = extend(extend({}, bindObject), props)
3334
}
3435

35-
return scopedSlotFn(props) || fallback
36+
nodes = scopedSlotFn(props) || fallback
37+
} else {
38+
nodes = this.$slots[name] || fallback
3639
}
37-
const slotNodes = this.$slots[name]
38-
// warn duplicate slot usage
39-
if (slotNodes && process.env.NODE_ENV !== 'production') {
40-
slotNodes._rendered && warn(
41-
`Duplicate presence of slot "${name}" found in the same render tree ` +
42-
'- this will likely cause render errors.',
43-
this
44-
)
45-
slotNodes._rendered = true
40+
41+
const target = props && props.slot
42+
if (target) {
43+
return this.$createElement('template', { slot: target }, nodes)
4644
}
4745

48-
return slotNodes || fallback
46+
return nodes
4947
}

packages/mip/src/vue/core/instance/render.js

Lines changed: 2 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -65,21 +65,10 @@ export function renderMixin (Vue) {
6565
const vm = this
6666
const {render, _parentVnode} = vm.$options
6767

68-
if (vm._isMounted) {
69-
// if the parent didn't update, the slot nodes will be the ones from
70-
// last render. They need to be cloned to ensure "freshness" for this render.
71-
for (const key in vm.$slots) {
72-
const slot = vm.$slots[key]
73-
if (slot._rendered) {
74-
vm.$slots[key] = cloneVNodes(slot, true
75-
// deep
76-
)
77-
}
78-
}
68+
if (_parentVnode) {
69+
vm.$scopedSlots = _parentVnode.data.scopedSlots || emptyObject
7970
}
8071

81-
vm.$scopedSlots = (_parentVnode && _parentVnode.data.scopedSlots) || emptyObject
82-
8372
// set parent vnode. this allows render functions to have access
8473
// to the data on the placeholder node.
8574
vm.$vnode = _parentVnode

packages/mip/src/vue/core/vdom/patch.js

Lines changed: 21 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
* of making flow understand it is not worth it.
1616
*/
1717

18-
import VNode from './vnode'
18+
import VNode, {cloneVNode} from './vnode'
1919
import config from '../config'
2020
import {SSR_ATTR} from 'shared/constants'
2121
import {registerRef} from './modules/ref'
@@ -123,7 +123,7 @@ export function createPatchFunction (backend) {
123123
function createElm (vnode, insertedVnodeQueue, parentElm, refElm, nested) {
124124
// mip patch: 如果是渲染好的 Node 节点,直接插入
125125
if (vnode instanceof Node) {
126-
nodeOps.insertBefore(parentElm, vnode, refElm)
126+
nodeOps.insertBefore(parentElm, vnode.cloneNode(true), refElm)
127127
return
128128
}
129129

@@ -438,20 +438,20 @@ export function createPatchFunction (backend) {
438438
newCh[newEndIdx--] = oldEndVnode
439439
oldEndVnode = oldCh[oldEndIdx--]
440440
} else if (sameVnode(oldStartVnode, newStartVnode)) {
441-
patchVnode(oldStartVnode, newStartVnode, insertedVnodeQueue)
441+
patchVnode(oldStartVnode, newStartVnode, insertedVnodeQueue, newCh, newStartIdx)
442442
oldStartVnode = oldCh[++oldStartIdx]
443443
newStartVnode = newCh[++newStartIdx]
444444
} else if (sameVnode(oldEndVnode, newEndVnode)) {
445-
patchVnode(oldEndVnode, newEndVnode, insertedVnodeQueue)
445+
patchVnode(oldEndVnode, newEndVnode, insertedVnodeQueue, newCh, newStartIdx)
446446
oldEndVnode = oldCh[--oldEndIdx]
447447
newEndVnode = newCh[--newEndIdx]
448448
} else if (sameVnode(oldStartVnode, newEndVnode)) { // Vnode moved right
449-
patchVnode(oldStartVnode, newEndVnode, insertedVnodeQueue)
449+
patchVnode(oldStartVnode, newEndVnode, insertedVnodeQueue, newCh, newStartIdx)
450450
canMove && nodeOps.insertBefore(parentElm, oldStartVnode.elm, nodeOps.nextSibling(oldEndVnode.elm))
451451
oldStartVnode = oldCh[++oldStartIdx]
452452
newEndVnode = newCh[--newEndIdx]
453453
} else if (sameVnode(oldEndVnode, newStartVnode)) { // Vnode moved left
454-
patchVnode(oldEndVnode, newStartVnode, insertedVnodeQueue)
454+
patchVnode(oldEndVnode, newStartVnode, insertedVnodeQueue, newCh, newStartIdx)
455455
canMove && nodeOps.insertBefore(parentElm, oldEndVnode.elm, oldStartVnode.elm)
456456
oldEndVnode = oldCh[--oldEndIdx]
457457
newStartVnode = newCh[++newStartIdx]
@@ -477,7 +477,7 @@ export function createPatchFunction (backend) {
477477
}
478478

479479
if (sameVnode(vnodeToMove, newStartVnode)) {
480-
patchVnode(vnodeToMove, newStartVnode, insertedVnodeQueue)
480+
patchVnode(vnodeToMove, newStartVnode, insertedVnodeQueue, newCh, newStartIdx)
481481
oldCh[idxInOld] = undefined
482482
canMove && nodeOps.insertBefore(parentElm, vnodeToMove.elm, oldStartVnode.elm)
483483
} else {
@@ -505,11 +505,23 @@ export function createPatchFunction (backend) {
505505
}
506506
}
507507

508-
function patchVnode (oldVnode, vnode, insertedVnodeQueue, removeOnly) {
508+
function patchVnode (
509+
oldVnode,
510+
vnode,
511+
insertedVnodeQueue,
512+
ownerArray,
513+
index,
514+
removeOnly
515+
) {
509516
if (oldVnode === vnode) {
510517
return
511518
}
512519

520+
if (isDef(vnode.elm) && isDef(ownerArray)) {
521+
// clone reused vnode
522+
vnode = ownerArray[index] = cloneVNode(vnode)
523+
}
524+
513525
const elm = vnode.elm = oldVnode.elm
514526

515527
if (isTrue(oldVnode.isAsyncPlaceholder)) {
@@ -733,7 +745,7 @@ export function createPatchFunction (backend) {
733745
const isRealElement = isDef(oldVnode.nodeType)
734746
if (!isRealElement && sameVnode(oldVnode, vnode)) {
735747
// patch existing root node
736-
patchVnode(oldVnode, vnode, insertedVnodeQueue, removeOnly)
748+
patchVnode(oldVnode, vnode, insertedVnodeQueue, null, null, removeOnly)
737749
} else {
738750
if (isRealElement) {
739751
// mounting to a real element

0 commit comments

Comments
 (0)