Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
DCloud
uni-app
提交
2cc7d59a
U
uni-app
项目概览
DCloud
/
uni-app
3 个月 前同步成功
通知
725
Star
38705
Fork
3642
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
7
列表
看板
标记
里程碑
合并请求
1
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
U
uni-app
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
7
Issue
7
列表
看板
标记
里程碑
合并请求
1
合并请求
1
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
2cc7d59a
编写于
2月 22, 2022
作者:
fxy060608
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
fix(mp): v-for + component (#3263)
上级
ad1b719f
变更
3
隐藏空白更改
内联
并排
Showing
3 changed file
with
34 addition
and
25 deletion
+34
-25
packages/uni-mp-compiler/__tests__/scopedSlot.spec.ts
packages/uni-mp-compiler/__tests__/scopedSlot.spec.ts
+12
-22
packages/uni-mp-compiler/src/transforms/utils.ts
packages/uni-mp-compiler/src/transforms/utils.ts
+6
-1
packages/uni-mp-compiler/src/transforms/vFor.ts
packages/uni-mp-compiler/src/transforms/vFor.ts
+16
-2
未找到文件。
packages/uni-mp-compiler/__tests__/scopedSlot.spec.ts
浏览文件 @
2cc7d59a
import
{
assert
}
from
'
./testUtils
'
describe
(
'
compiler: transform scoped slots
'
,
()
=>
{
test
(
'
basic
'
,
()
=>
{
test
(
'
scoped + v-for + component
'
,
()
=>
{
assert
(
`<view><slot :item="item" :index="index"/></view>`
,
`<view><slot name="d"/></view>`
,
`<MyComponent :dataList="dataList">
<template v-slot:default="slotProps">
<view>
<view v-for="(item, key) in dataList" :key="key">
<test>{{ item.title }}</test>
</view>
</view>
</template>
</MyComponent>`
,
`<my-component u-s="{{['d']}}" u-i="2a9ec0b0-0" u-p="{{b}}"><view wx:for="{{a}}" wx:for-item="slotProps" wx:key="b" slot="{{slotProps.c}}"><view><view wx:for="{{slotProps.a}}" wx:for-item="item" wx:key="c"><test u-s="{{['d']}}" u-i="{{item.b}}">{{item.a}}</test></view></view></view></my-component>`
,
`(_ctx, _cache) => {
return { a: _r("d", { item: _ctx.item, index: _ctx.index }) }
}`
)
})
test
(
'
named slots
'
,
()
=>
{
assert
(
`<view><slot name="header" :item="item" :index="index"/></view>`
,
`<view><slot name="header"/></view>`
,
`(_ctx, _cache) => {
return { a: _r("header", { item: _ctx.item, index: _ctx.index }) }
}`
)
})
test
(
'
named slots + v-if
'
,
()
=>
{
assert
(
`<view><slot v-if="ok" name="header" :item="item" :index="index"/></view>`
,
`<view><slot wx:if="{{a}}" name="header"/></view>`
,
`(_ctx, _cache) => {
return _e({ a: _ctx.ok }, _ctx.ok ? { b: _r("header", { item: _ctx.item, index: _ctx.index }) } : {})
return { a: _w((slotProps, s0, i0) => { return { a: _f(_ctx.dataList, (item, key, i1) => { return { a: _t(item.title), b: '2a9ec0b0-1' + '-' + i0 + '-' + i1 + ',' + '2a9ec0b0-0', c: key }; }), b: i0, c: s0 }; }, { name: 'd', path: 'a', vueId: '2a9ec0b0-0' }), b: _p({ dataList: _ctx.dataList }) }
}`
)
})
...
...
packages/uni-mp-compiler/src/transforms/utils.ts
浏览文件 @
2cc7d59a
...
...
@@ -166,11 +166,16 @@ export function rewriteExpression(
export
function
findReferencedScope
(
node
:
Expression
,
scope
:
CodegenScope
scope
:
CodegenScope
,
findReferenced
:
boolean
=
true
):
CodegenScope
{
if
(
isVIfScope
(
scope
))
{
return
scope
}
else
if
(
isVForScope
(
scope
))
{
if
(
!
findReferenced
)
{
// 部分情况下(比如包含了自定义组件,组件的 vueId 需要访问 vFor 的 index),只要在 vFor 下,不管有无引用,作用域均绑定在该 vFor 下
return
scope
}
if
(
isReferencedByIds
(
node
,
scope
.
locals
))
{
return
scope
}
...
...
packages/uni-mp-compiler/src/transforms/vFor.ts
浏览文件 @
2cc7d59a
...
...
@@ -48,7 +48,7 @@ import {
import
{
CodegenScope
,
CodegenVForScope
}
from
'
../options
'
import
{
V_FOR
}
from
'
../runtimeHelpers
'
import
{
createVSlotCallExpression
}
from
'
./vSlot
'
import
{
isElementNode
}
from
'
@dcloudio/uni-cli-shared
'
import
{
isElementNode
,
isUserComponent
}
from
'
@dcloudio/uni-cli-shared
'
export
type
VForOptions
=
Omit
<
ForParseResult
,
'
tagType
'
>
&
{
sourceExpr
?:
Expression
...
...
@@ -117,7 +117,9 @@ export const transformFor = createStructuralDirectiveTransform(
const
sourceAliasReferencedScope
=
findReferencedScope
(
cloneSourceExpr
,
context
.
currentScope
context
.
currentScope
,
// issues/3263
!
hasUserComponent
(
node
,
context
)
)
// 寻找子节点中 if 指令作用域
const
vIfReferencedScope
=
findVIfReferencedScope
(
...
...
@@ -217,6 +219,18 @@ export const transformFor = createStructuralDirectiveTransform(
}
)
as
unknown
as
NodeTransform
function
hasUserComponent
(
node
:
ElementNode
,
context
:
TransformContext
):
boolean
{
if
(
isUserComponent
(
node
,
context
))
{
return
true
}
return
node
.
children
.
some
(
(
node
)
=>
isElementNode
(
node
)
&&
hasUserComponent
(
node
,
context
)
)
}
function
clearExpr
(
expr
:
Expression
)
{
Object
.
keys
(
expr
).
forEach
((
key
)
=>
{
delete
(
expr
as
any
)[
key
]
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录