Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
Velpro187
uni-app
提交
7e40b3d9
U
uni-app
项目概览
Velpro187
/
uni-app
与 Fork 源项目一致
Fork自
DCloud / uni-app
通知
1
Star
1
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
U
uni-app
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
7e40b3d9
编写于
2月 22, 2022
作者:
fxy060608
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
fix(mp): v-for scope (#3263)
上级
639d52f1
变更
3
隐藏空白更改
内联
并排
Showing
3 changed file
with
21 addition
and
27 deletion
+21
-27
packages/uni-mp-compiler/__tests__/scope.spec.ts
packages/uni-mp-compiler/__tests__/scope.spec.ts
+17
-10
packages/uni-mp-compiler/src/transforms/utils.ts
packages/uni-mp-compiler/src/transforms/utils.ts
+1
-2
packages/uni-mp-compiler/src/transforms/vFor.ts
packages/uni-mp-compiler/src/transforms/vFor.ts
+3
-15
未找到文件。
packages/uni-mp-compiler/__tests__/scope.spec.ts
浏览文件 @
7e40b3d9
...
...
@@ -20,9 +20,9 @@ describe('compiler: scope', () => {
)
assert
(
`<view v-for="item in items"><view v-for="item1 in item1" :data-id="item.id" :data-title="item1.title"/></view>`
,
`<view wx:for="{{a}}" wx:for-item="item"><view wx:for="{{
b}}" wx:for-item="item1" data-id="{{item.a
}}" data-title="{{item1.a}}"/></view>`
,
`<view wx:for="{{a}}" wx:for-item="item"><view wx:for="{{
item.a}}" wx:for-item="item1" data-id="{{item.b
}}" data-title="{{item1.a}}"/></view>`
,
`(_ctx, _cache) => {
return { a: _f(_ctx.items, (item, k0, i0) => { return { a:
item.id }; }), b: _f(_ctx.item1, (item1, k1, i1) => { return { a: item1.title
}; }) }
return { a: _f(_ctx.items, (item, k0, i0) => { return { a:
_f(_ctx.item1, (item1, k1, i1) => { return { a: item1.title }; }), b: item.id
}; }) }
}`
)
assert
(
...
...
@@ -30,6 +30,13 @@ describe('compiler: scope', () => {
`<view wx:for="{{a}}" wx:for-item="item" wx:key="b" data-id="{{item.c}}"><view wx:for="{{item.a}}" wx:for-item="weeks" wx:key="a" data-id="{{weeks.b}}"/></view>`
,
`(_ctx, _cache) => {
return { a: _f(_ctx.weeks, (item, weekIndex, i0) => { return { a: _f(item, (weeks, weeksIndex, i1) => { return { a: weeksIndex, b: weeks.id }; }), b: weekIndex, c: item.id }; }) }
}`
)
assert
(
`<view v-for="x in 2"><view v-for="y in 2">{{x+y}}</view></view>`
,
`<view wx:for="{{a}}" wx:for-item="x"><view wx:for="{{x.a}}" wx:for-item="y">{{y.a}}</view></view>`
,
`(_ctx, _cache) => {
return { a: _f(2, (x, k0, i0) => { return { a: _f(2, (y, k1, i1) => { return { a: _t(x + y) }; }) }; }) }
}`
)
})
...
...
@@ -52,9 +59,9 @@ describe('compiler: scope', () => {
)
assert
(
`<view v-for="s in items1"><view v-for="r in items2"><text v-if="a == 2">s</text></view></view>`
,
`<view wx:for="{{a}}" wx:for-item="s"><view wx:for="{{
b}}" wx:for-item="r"><text wx:if="{{c
}}">s</text></view></view>`
,
`<view wx:for="{{a}}" wx:for-item="s"><view wx:for="{{
s.a}}" wx:for-item="r"><text wx:if="{{b
}}">s</text></view></view>`
,
`(_ctx, _cache) => {
return { a: _f(_ctx.items1, (s, k0, i0) => { return {
}; }), b: _f(_ctx.items2, (r, k1, i1) => { return _ctx.a == 2 ? {} : {}; }), c
: _ctx.a == 2 }
return { a: _f(_ctx.items1, (s, k0, i0) => { return {
a: _f(_ctx.items2, (r, k1, i1) => { return _ctx.a == 2 ? {} : {}; }) }; }), b
: _ctx.a == 2 }
}`
)
})
...
...
@@ -68,25 +75,25 @@ describe('compiler: scope', () => {
)
assert
(
`<view v-for="s in items1"><view v-for="r in items2"><text v-if="a == 2">a</text><text v-else-if="b == 3">s</text></view></view>`
,
`<view wx:for="{{a}}" wx:for-item="s"><view wx:for="{{
b}}" wx:for-item="r"><text wx:if="{{c}}">a</text><text wx:elif="{{d
}}">s</text></view></view>`
,
`<view wx:for="{{a}}" wx:for-item="s"><view wx:for="{{
s.a}}" wx:for-item="r"><text wx:if="{{b}}">a</text><text wx:elif="{{c
}}">s</text></view></view>`
,
`(_ctx, _cache) => {
return { a: _f(_ctx.items1, (s, k0, i0) => { return {
}; }), b: _f(_ctx.items2, (r, k1, i1) => { return _ctx.a == 2 ? {} : _ctx.b == 3 ? {} : {}; }), c: _ctx.a == 2, d
: _ctx.b == 3 }
return { a: _f(_ctx.items1, (s, k0, i0) => { return {
a: _f(_ctx.items2, (r, k1, i1) => { return _ctx.a == 2 ? {} : _ctx.b == 3 ? {} : {}; }) }; }), b: _ctx.a == 2, c
: _ctx.b == 3 }
}`
)
})
test
(
'
v-for + v-for + v-for + v-if
'
,
()
=>
{
assert
(
`<view v-for="s in items1"><view v-for="r in items2"><view v-for="t in items3"><text v-if="s == 2">s</text></view></view></view>`
,
`<view wx:for="{{a}}" wx:for-item="s"><view wx:for="{{
b}}" wx:for-item="r"><view wx:for="{{s
.a}}" wx:for-item="t"><text wx:if="{{s.b}}">s</text></view></view></view>`
,
`<view wx:for="{{a}}" wx:for-item="s"><view wx:for="{{
s.a}}" wx:for-item="r"><view wx:for="{{r
.a}}" wx:for-item="t"><text wx:if="{{s.b}}">s</text></view></view></view>`
,
`(_ctx, _cache) => {
return { a: _f(_ctx.items1, (s, k0, i0) => { return { a: _f(_ctx.items
3, (t, k2, i2) => { return s == 2 ? {} : {}; }), b: s == 2 }; }), b: _f(_ctx.items2, (r, k1, i1) => { return {
}; }) }
return { a: _f(_ctx.items1, (s, k0, i0) => { return { a: _f(_ctx.items
2, (r, k1, i1) => { return { a: _f(_ctx.items3, (t, k2, i2) => { return s == 2 ? {} : {}; }) }; }), b: s == 2
}; }) }
}`
)
assert
(
`<view v-for="s in items1"><view v-for="r in items2"><view v-for="t in items3"><text v-if="r == 2">s</text></view></view></view>`
,
`<view wx:for="{{a}}" wx:for-item="s"><view wx:for="{{
b
}}" wx:for-item="r"><view wx:for="{{r.a}}" wx:for-item="t"><text wx:if="{{r.b}}">s</text></view></view></view>`
,
`<view wx:for="{{a}}" wx:for-item="s"><view wx:for="{{
s.a
}}" wx:for-item="r"><view wx:for="{{r.a}}" wx:for-item="t"><text wx:if="{{r.b}}">s</text></view></view></view>`
,
`(_ctx, _cache) => {
return { a: _f(_ctx.items1, (s, k0, i0) => { return {
}; }), b: _f(_ctx.items2, (r, k1, i1) => { return { a: _f(_ctx.items3, (t, k2, i2) => { return r == 2 ? {} : {}; }), b: r == 2
}; }) }
return { a: _f(_ctx.items1, (s, k0, i0) => { return {
a: _f(_ctx.items2, (r, k1, i1) => { return { a: _f(_ctx.items3, (t, k2, i2) => { return r == 2 ? {} : {}; }), b: r == 2 }; })
}; }) }
}`
)
})
...
...
packages/uni-mp-compiler/src/transforms/utils.ts
浏览文件 @
7e40b3d9
...
...
@@ -173,13 +173,12 @@ export function findReferencedScope(
return
scope
}
else
if
(
isVForScope
(
scope
))
{
if
(
!
findReferenced
)
{
// 部分情况下(比如包含了自定义组件,组件的 vueId 需要访问 vFor 的 index),只要在 vFor 下,不管有无引用,作用域均绑定在该 vFor 下
return
scope
}
if
(
isReferencedByIds
(
node
,
scope
.
locals
))
{
return
scope
}
return
findReferencedScope
(
node
,
scope
.
parent
!
)
return
findReferencedScope
(
node
,
scope
.
parent
!
,
findReferenced
)
}
return
scope
}
...
...
packages/uni-mp-compiler/src/transforms/vFor.ts
浏览文件 @
7e40b3d9
import
{
extend
,
isString
}
from
'
@vue/shared
'
import
{
isElementNode
}
from
'
@dcloudio/uni-cli-shared
'
import
{
createCompilerError
,
createSimpleExpression
,
...
...
@@ -48,7 +49,6 @@ import {
import
{
CodegenScope
,
CodegenVForScope
}
from
'
../options
'
import
{
V_FOR
}
from
'
../runtimeHelpers
'
import
{
createVSlotCallExpression
}
from
'
./vSlot
'
import
{
isElementNode
,
isUserComponent
}
from
'
@dcloudio/uni-cli-shared
'
export
type
VForOptions
=
Omit
<
ForParseResult
,
'
tagType
'
>
&
{
sourceExpr
?:
Expression
...
...
@@ -118,8 +118,8 @@ export const transformFor = createStructuralDirectiveTransform(
const
sourceAliasReferencedScope
=
findReferencedScope
(
cloneSourceExpr
,
context
.
currentScope
,
// issues/3263
!
hasUserComponent
(
node
,
context
)
//
vFor 嵌套时,始终保持嵌套关系,
issues/3263
false
)
// 寻找子节点中 if 指令作用域
const
vIfReferencedScope
=
findVIfReferencedScope
(
...
...
@@ -219,18 +219,6 @@ 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.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录