Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
DCloud
uni-app
提交
1a263626
U
uni-app
项目概览
DCloud
/
uni-app
3 个月 前同步成功
通知
720
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,发现更多精彩内容 >>
提交
1a263626
编写于
7月 29, 2023
作者:
DCloud-WZF
💬
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
wip(uts): vBind
上级
3afbd25f
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
59 addition
and
130 deletion
+59
-130
packages/uni-app-uts/src/plugins/uvue/compiler/transforms/vBind.ts
...uni-app-uts/src/plugins/uvue/compiler/transforms/vBind.ts
+2
-6
packages/uni-app-uts/src/plugins/uvue/compiler/utils.ts
packages/uni-app-uts/src/plugins/uvue/compiler/utils.ts
+57
-124
未找到文件。
packages/uni-app-uts/src/plugins/uvue/compiler/transforms/vBind.ts
浏览文件 @
1a263626
...
...
@@ -8,11 +8,7 @@ import {
import
{
createCompilerError
,
ErrorCodes
}
from
'
../errors
'
import
{
camelize
}
from
'
@vue/shared
'
import
{
CAMELIZE
}
from
'
@vue/compiler-core
'
import
{
objectExp
,
expContentToMapString
,
objectStringToMapString
,
}
from
'
../utils
'
import
{
objectExp
,
objectStringToMapString
}
from
'
../utils
'
import
{
isString
}
from
'
@vue/shared
'
// v-bind without arg is handled directly in ./transformElements.ts due to it affecting
...
...
@@ -63,7 +59,7 @@ export const transformBind: DirectiveTransform = (dir, _node, context) => {
}
if
((
exp
as
any
).
content
&&
objectExp
.
test
((
exp
as
any
).
content
))
{
;(
exp
as
any
).
content
=
expContentToMapString
(
exp
)
;(
exp
as
any
).
content
=
objectStringToMapString
((
exp
as
any
).
content
)
}
else
if
((
exp
as
any
).
children
)
{
// { 'opcity': 1 - (scrollTop * 3 > 100 ? 100 : scrollTop * 3) / 100 } to map
// TODO: 考虑更多边缘情况
...
...
packages/uni-app-uts/src/plugins/uvue/compiler/utils.ts
浏览文件 @
1a263626
import
{
CompilerOptions
}
from
'
./options
'
import
{
ExpressionNode
,
SimpleExpressionNode
,
ConstantTypes
,
}
from
'
@vue/compiler-core
'
import
{
isString
}
from
'
@vue/shared
'
import
{
isObject
,
isString
}
from
'
@vue/shared
'
export
function
genRenderFunctionDecl
({
targetLanguage
,
...
...
@@ -15,34 +10,11 @@ export function genRenderFunctionDecl({
}
function
${
filename
}
Render(): VNode | null`
}
export
function
expContentToMapString
(
exp
:
ExpressionNode
):
string
{
return
objectStringToMapString
(
(
exp
as
SimpleExpressionNode
).
content
,
true
,
exp
)
}
export
const
objectExp
=
/
\{[\s\S]
*
\}
/g
export
function
objectStringToMapString
(
content
:
string
,
wrap
=
true
,
exp
?:
ExpressionNode
):
string
{
export
function
objectStringToMapString
(
content
:
string
,
wrap
=
true
):
string
{
content
=
content
.
replace
(
/
\n
/g
,
''
)
const
matched
=
content
.
match
(
objectExp
)
!
[
0
]
try
{
return
complexObjectStringToMapString
(
content
,
matched
,
wrap
)
}
catch
(
e
)
{
return
simpleObjectSringToMapString
(
content
,
matched
,
wrap
,
exp
)
}
}
function
complexObjectStringToMapString
(
content
:
string
,
matched
:
string
,
wrap
:
boolean
):
string
{
const
matchedObj
=
stringToData
(
matched
)
const
matchedObj
=
stringToData
(
matched
)
as
Record
<
any
,
any
>
const
mapConstructor
=
convertObjectToMapString
(
matchedObj
)
return
content
.
replace
(
matched
,
...
...
@@ -50,99 +22,7 @@ function complexObjectStringToMapString(
)
}
function
convertObjectToMapString
(
obj
:
Record
<
any
,
any
>
):
string
{
let
result
=
''
const
keys
=
Object
.
keys
(
obj
)
for
(
let
i
=
0
;
i
<
keys
.
length
;
i
++
)
{
const
key
=
keys
[
i
]
if
(
obj
.
hasOwnProperty
(
key
))
{
result
+=
getKeyValueString
(
key
,
obj
[
key
])
+
(
i
===
keys
.
length
-
1
?
''
:
'
,
'
)
}
}
return
`new Map<string, any | null>(
${
result
?
`[
${
result
}
]`
:
''
}
)`
}
function
getKeyValueString
(
key
:
string
,
value
:
any
):
string
{
value
=
getValueString
(
value
)
key
=
hasExtraQuotationMarks
(
key
)
||
isBooleanString
(
value
)
?
key
:
`'
${
key
}
'`
return
`[
${
key
}
,
${
value
}
]`
}
function
getValueString
(
value
:
any
):
string
{
if
(
isString
(
value
))
{
return
hasExtraQuotationMarks
(
value
)
||
isBooleanString
(
value
)
?
`
${
value
}
`
:
`'
${
value
}
'`
}
if
(
Array
.
isArray
(
value
))
{
return
getArrayString
(
value
)
}
if
(
Object
.
prototype
.
toString
.
call
(
value
)
===
'
[object Object]
'
)
{
return
convertObjectToMapString
(
value
)
}
return
value
}
function
getArrayString
(
arr
:
any
[]):
string
{
let
result
=
''
arr
.
forEach
((
item
,
index
)
=>
{
result
+=
index
!==
arr
.
length
-
1
?
`
${
getValueString
(
item
)}
, `
:
getValueString
(
item
)
})
return
`[
${
result
}
]`
}
function
simpleObjectSringToMapString
(
content
:
string
,
matched
:
string
,
wrap
:
boolean
,
exp
?:
ExpressionNode
):
string
{
const
keyValues
=
matched
.
replace
(
/
\{
|
\}
/g
,
''
).
split
(
'
,
'
)
let
mapConstructor
=
''
keyValues
.
forEach
((
keyValue
:
string
,
index
:
number
)
=>
{
const
colonIndex
=
keyValue
.
indexOf
(
'
:
'
)
const
key
=
exp
&&
needAddQuotes
(
exp
,
keyValue
)
?
`'
${
keyValue
.
substring
(
0
,
colonIndex
)}
'`
:
keyValue
.
substring
(
0
,
colonIndex
)
const
value
=
keyValue
.
substring
(
colonIndex
+
1
)
if
(
key
&&
value
)
{
mapConstructor
+=
`[
${
key
}
,
${
value
}
]`
if
(
index
<
keyValues
.
length
-
1
)
{
mapConstructor
+=
'
,
'
}
}
})
return
content
.
replace
(
matched
,
wrap
?
`new Map<string, any | null>(
${
mapConstructor
?
`[
${
mapConstructor
}
]`
:
''
}
)`
:
mapConstructor
)
}
function
needAddQuotes
(
exp
:
ExpressionNode
,
keyValue
:
string
):
boolean
{
return
(
(
exp
as
SimpleExpressionNode
).
constType
===
ConstantTypes
.
CAN_STRINGIFY
&&
!
hasExtraStartQuotationMarks
(
keyValue
)
)
}
function
removeMapWrap
(
content
:
string
):
string
{
if
(
content
===
'
new Map<string, any | null>()
'
)
{
return
''
}
const
mapPrefixLength
=
29
// new Map<string, any | null>([
return
content
.
substring
(
mapPrefixLength
,
content
.
length
-
2
)
}
function
stringToData
(
str
:
string
):
any
{
function
stringToData
(
str
:
string
):
object
|
any
[]
|
string
{
str
=
str
.
trim
()
if
(
str
.
startsWith
(
'
{
'
))
{
return
stringToObject
(
removeStartAndEndChar
(
str
))
...
...
@@ -229,6 +109,59 @@ function stringToArray(str: string) {
return
result
}
function
convertObjectToMapString
(
obj
:
Record
<
any
,
any
>
):
string
{
let
result
=
''
const
keys
=
Object
.
keys
(
obj
)
for
(
let
i
=
0
;
i
<
keys
.
length
;
i
++
)
{
const
key
=
keys
[
i
]
if
(
obj
.
hasOwnProperty
(
key
))
{
result
+=
getKeyValueString
(
key
,
obj
[
key
])
+
(
i
===
keys
.
length
-
1
?
''
:
'
,
'
)
}
}
return
`new Map<string, any | null>(
${
result
?
`[
${
result
}
]`
:
''
}
)`
}
function
getKeyValueString
(
key
:
string
,
value
:
any
):
string
{
value
=
getValueString
(
value
)
key
=
hasExtraQuotationMarks
(
key
)
||
isBooleanString
(
value
)
?
key
:
`'
${
key
}
'`
return
`[
${
key
}
,
${
value
}
]`
}
function
getValueString
(
value
:
any
):
string
{
if
(
isString
(
value
))
{
return
hasExtraQuotationMarks
(
value
)
||
isBooleanString
(
value
)
?
`
${
value
}
`
:
`'
${
value
}
'`
}
if
(
Array
.
isArray
(
value
))
{
return
getArrayString
(
value
)
}
if
(
isObject
(
value
))
{
return
convertObjectToMapString
(
value
)
}
return
value
}
function
getArrayString
(
arr
:
any
[]):
string
{
let
result
=
''
arr
.
forEach
((
item
,
index
)
=>
{
result
+=
index
!==
arr
.
length
-
1
?
`
${
getValueString
(
item
)}
, `
:
getValueString
(
item
)
})
return
`[
${
result
}
]`
}
function
removeMapWrap
(
content
:
string
):
string
{
if
(
content
===
'
new Map<string, any | null>()
'
)
{
return
''
}
const
mapPrefixLength
=
29
// new Map<string, any | null>([
return
content
.
substring
(
mapPrefixLength
,
content
.
length
-
2
)
}
function
hasExtraQuotationMarks
(
str
:
string
)
{
return
str
.
startsWith
(
"
'
"
)
||
str
.
endsWith
(
"
'
"
)
}
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录