Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
陈庄旺
uni-app
提交
f3b62a6b
U
uni-app
项目概览
陈庄旺
/
uni-app
与 Fork 源项目一致
Fork自
DCloud / uni-app
通知
1
Star
0
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,发现更多精彩内容 >>
提交
f3b62a6b
编写于
1月 19, 2022
作者:
fxy060608
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
fix(mp): v-if with wxs module (#3199)
上级
aa8b7779
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
121 addition
and
1 deletion
+121
-1
packages/uni-mp-compiler/__tests__/wxs.spec.ts
packages/uni-mp-compiler/__tests__/wxs.spec.ts
+46
-0
packages/uni-mp-compiler/src/transform.ts
packages/uni-mp-compiler/src/transform.ts
+75
-1
未找到文件。
packages/uni-mp-compiler/__tests__/wxs.spec.ts
浏览文件 @
f3b62a6b
...
...
@@ -27,4 +27,50 @@ describe('compiler: transform wxs', () => {
}
)
})
test
(
'
v-if
'
,
()
=>
{
assert
(
`<view v-if="test.aa()">123</view>`
,
`<view wx:if="{{test.aa()}}">123</view>`
,
`(_ctx, _cache) => {
return {}
}`
,
{
filters
:
[
'
test
'
],
}
)
assert
(
`<view v-if="test.aa()">{{msg}}</view>`
,
`<view wx:if="{{test.aa()}}">{{a}}</view>`
,
`(_ctx, _cache) => {
return { ...{ a: _t(_ctx.msg) } }
}`
,
{
filters
:
[
'
test
'
],
}
)
})
test
(
'
v-if + v-else
'
,
()
=>
{
assert
(
`<view v-if="test.aa()">{{foo}}</view><view v-else>{{bar}}</view>`
,
`<view wx:if="{{test.aa()}}">{{a}}</view><view wx:else>{{b}}</view>`
,
`(_ctx, _cache) => {
return { ...{ a: _t(_ctx.foo) }, ...{ b: _t(_ctx.bar) } }
}`
,
{
filters
:
[
'
test
'
],
}
)
})
test
(
'
v-if + v-else-if + v-else
'
,
()
=>
{
assert
(
`<view v-if="test.aa()">{{foo}}</view><view v-else-if="test.bb()">{{foo}}</view><view v-else>{{bar}}</view>`
,
`<view wx:if="{{test.aa()}}">{{a}}</view><view wx:elif="{{test.bb()}}">{{b}}</view><view wx:else>{{c}}</view>`
,
`(_ctx, _cache) => {
return { ...{ a: _t(_ctx.foo) }, ...{ ...{ b: _t(_ctx.foo) }, ...{ c: _t(_ctx.bar) } } }
}`
,
{
filters
:
[
'
test
'
],
}
)
})
})
packages/uni-mp-compiler/src/transform.ts
浏览文件 @
f3b62a6b
...
...
@@ -18,6 +18,7 @@ import {
isIdentifier
,
isSpreadElement
,
Identifier
,
spreadElement
,
}
from
'
@babel/types
'
import
{
DirectiveNode
,
...
...
@@ -50,6 +51,7 @@ import {
import
{
EXTEND
}
from
'
./runtimeHelpers
'
import
{
createObjectExpression
}
from
'
./ast
'
import
{
SCOPED_SLOT_IDENTIFIER
}
from
'
./transforms/utils
'
import
{
genBabelExpr
}
from
'
./codegen
'
export
interface
ImportItem
{
exp
:
string
|
ExpressionNode
...
...
@@ -550,7 +552,15 @@ function createRenderDataExpr(
context
:
TransformContext
)
{
const
objExpr
=
createObjectExpression
(
properties
)
if
(
context
.
renderDataSpread
||
!
hasSpreadElement
(
objExpr
))
{
if
(
!
hasSpreadElement
(
objExpr
))
{
return
objExpr
}
// filters: ['test']
// v-if="text.aa()"
if
(
context
.
filters
.
length
)
{
transformFilterObjectSpreadExpr
(
objExpr
,
context
)
}
if
(
context
.
renderDataSpread
)
{
return
objExpr
}
return
transformObjectSpreadExpr
(
objExpr
,
context
)
...
...
@@ -657,3 +667,67 @@ function transformConditionalExpression(
}
return
expr
}
function
transformFilterObjectSpreadExpr
(
objExpr
:
ObjectExpression
,
context
:
TransformContext
)
{
const
properties
=
objExpr
.
properties
as
(
ObjectProperty
|
SpreadElement
)[]
properties
.
forEach
((
prop
)
=>
{
if
(
isObjectProperty
(
prop
))
{
transformFilterObjectPropertyExpr
(
prop
,
context
)
}
else
{
prop
.
argument
=
transformFilterConditionalExpression
(
prop
.
argument
as
ConditionalExpression
,
context
)
}
})
}
function
transformFilterObjectPropertyExpr
(
prop
:
ObjectProperty
,
context
:
TransformContext
)
{
// vFor, withScopedSlot
const
returnStatement
=
parseReturnStatement
(
prop
)
if
(
returnStatement
)
{
const
objExpr
=
returnStatement
.
argument
as
ObjectExpression
if
(
hasSpreadElement
(
objExpr
))
{
transformFilterObjectSpreadExpr
(
objExpr
,
context
)
}
}
}
function
transformFilterConditionalExpression
(
expr
:
ConditionalExpression
,
context
:
TransformContext
)
{
const
{
test
,
consequent
,
alternate
}
=
expr
if
(
isObjectExpression
(
consequent
)
&&
hasSpreadElement
(
consequent
))
{
transformFilterObjectSpreadExpr
(
consequent
,
context
)
}
if
(
isObjectExpression
(
alternate
))
{
if
(
hasSpreadElement
(
alternate
))
{
transformFilterObjectSpreadExpr
(
alternate
,
context
)
}
}
else
if
(
isConditionalExpression
(
alternate
))
{
expr
.
alternate
=
transformFilterConditionalExpression
(
alternate
,
context
)
}
const
testCode
=
genBabelExpr
(
test
)
// filter test
if
(
context
.
filters
.
find
((
filter
)
=>
testCode
.
includes
(
filter
+
'
.
'
)))
{
// test.aa() ? {a:1} : {b:2} => {...{a:1},...{b:2}}
const
properties
:
SpreadElement
[]
=
[]
if
(
!
isObjectExpression
(
consequent
)
||
consequent
.
properties
.
length
)
{
properties
.
push
(
spreadElement
(
consequent
))
}
if
(
!
isObjectExpression
(
expr
.
alternate
)
||
expr
.
alternate
.
properties
.
length
)
{
properties
.
push
(
spreadElement
(
expr
.
alternate
))
}
return
objectExpression
(
properties
)
}
return
expr
}
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录