Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
DCloud
uni-app
提交
cfc2bae3
U
uni-app
项目概览
DCloud
/
uni-app
14 天 前同步成功
通知
751
Star
38709
Fork
3642
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
8
列表
看板
标记
里程碑
合并请求
1
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
U
uni-app
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
8
Issue
8
列表
看板
标记
里程碑
合并请求
1
合并请求
1
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
提交
cfc2bae3
编写于
6月 02, 2023
作者:
Q
qiang
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
fix(mp): event in v-for (question/171043)
上级
924aec31
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
24 addition
and
5 deletion
+24
-5
packages/uni-template-compiler/__tests__/compiler-extra.spec.js
...es/uni-template-compiler/__tests__/compiler-extra.spec.js
+14
-0
packages/uni-template-compiler/lib/script/traverse/data/event.js
...s/uni-template-compiler/lib/script/traverse/data/event.js
+10
-5
未找到文件。
packages/uni-template-compiler/__tests__/compiler-extra.spec.js
浏览文件 @
cfc2bae3
...
...
@@ -416,6 +416,20 @@ describe('mp:compiler-extra', () => {
'
<block wx:for="{{$root.l0}}" wx:for-item="value" wx:for-index="key" wx:key="$index"><view><button data-event-opts="{{[[
\'
tap
\'
,[[
\'
click1
\'
,[value.$index]]]]]}}" bindtap="__e">click1(index)</button><button data-event-opts="{{[[
\'
tap
\'
,[[
\'
e0
\'
,[
\'
$event
\'
]]]]]}}" data-event-params="{{({value:value.$orig})}}" bindtap="__e">fnObj.click(value)</button></view></block>
'
,
'
with(this){var l0=__map(dataObj,function(value,key,index){var $orig=__get_orig(value);return{$orig:$orig,$index:index}});if(!_isMounted){e0=function($event,value){var _temp=arguments[arguments.length-1].currentTarget.dataset,_temp2=_temp.eventParams||_temp["event-params"],value=_temp2.value;var _temp,_temp2;return fnObj.click(value)}}$mp.data=Object.assign({},{$root:{l0:l0}})}
'
)
assertCodegen
(
`<view v-for="(value,key,index) in obj" :key="key" @click="test(index)">
<view v-for="(item,key1,index1) in value" :key="key1" @click="test(index1)">text</view>
</view>`
,
'
<block wx:for="{{$root.l1}}" wx:for-item="value" wx:for-index="key" wx:key="key"><view data-event-opts="{{[[
\'
tap
\'
,[[
\'
test
\'
,[value.$index]]]]]}}" bindtap="__e"><block wx:for="{{value.l0}}" wx:for-item="item" wx:for-index="key1" wx:key="key1"><view data-event-opts="{{[[
\'
tap
\'
,[[
\'
test
\'
,[item.$index]]]]]}}" bindtap="__e">text</view></block></view></block>
'
,
'
with(this){var l1=__map(obj,function(value,key,index){var $orig=__get_orig(value);var l0=__map(value,function(item,key1,index1){var $orig=__get_orig(item);return{$orig:$orig,$index:index1}});return{$orig:$orig,l0:l0,$index:index}});$mp.data=Object.assign({},{$root:{l1:l1}})}
'
)
assertCodegen
(
`<view v-for="(value,key,index) in obj" :key="key" @click="test(index)">
<view v-for="(item,index1) in value" :key="key1" @click="test(index1)">text</view>
</view>`
,
'
<block wx:for="{{$root.l0}}" wx:for-item="value" wx:for-index="key" wx:key="key"><view data-event-opts="{{[[
\'
tap
\'
,[[
\'
test
\'
,[value.$index]]]]]}}" bindtap="__e"><block wx:for="{{value.$orig}}" wx:for-item="item" wx:for-index="index1" wx:key="*this"><view data-event-opts="{{[[
\'
tap
\'
,[[
\'
e0
\'
,[
\'
$event
\'
]]]]]}}" data-event-params="{{({index1})}}" bindtap="__e">text</view></block></view></block>
'
,
'
with(this){var l0=__map(obj,function(value,key,index){var $orig=__get_orig(value);return{$orig:$orig,$index:index}});if(!_isMounted){e0=function($event,index1){var _temp=arguments[arguments.length-1].currentTarget.dataset,_temp2=_temp.eventParams||_temp["event-params"],index1=_temp2.index1;var _temp,_temp2;return test(index1)}}$mp.data=Object.assign({},{$root:{l0:l0}})}
'
)
})
it
(
'
generate class binding
'
,
()
=>
{
...
...
packages/uni-template-compiler/lib/script/traverse/data/event.js
浏览文件 @
cfc2bae3
...
...
@@ -232,15 +232,20 @@ function isValuePath (path) {
return
path
.
key
!==
'
key
'
&&
path
.
key
!==
'
id
'
&&
(
path
.
key
!==
'
property
'
||
path
.
parent
.
computed
)
&&
!
(
path
.
key
===
'
value
'
&&
path
.
parentPath
.
parentPath
.
isObjectPattern
())
&&
!
(
path
.
key
===
'
left
'
&&
path
.
parentPath
.
parentPath
.
parentPath
.
isObjectPattern
())
}
/**
* 判断 v-for 中是否包含复杂表达式:数组、对象、方法
*/
const
isSafeScoped
=
(
state
)
=>
{
const
scopedArray
=
state
.
scoped
let
checkForIndex
=
false
for
(
let
index
=
0
;
index
<
scopedArray
.
length
;
index
++
)
{
const
scoped
=
scopedArray
[
index
]
const
arrayExtra
=
scoped
.
forExtra
[
0
].
elements
[
0
].
value
// 简易判断
// 判断仅外层遍历对象是否包含了 index 参数
if
(
checkForIndex
&&
scoped
.
forIndex
&&
scoped
.
forKey
)
{
return
false
}
if
(
index
===
0
&&
!
(
scoped
.
forIndex
&&
scoped
.
forKey
))
{
checkForIndex
=
true
}
// 简易判断 v-for 中是否包含复杂表达式:数组、对象、方法
if
(
typeof
arrayExtra
===
'
string
'
&&
(
arrayExtra
.
startsWith
(
'
[
'
)
||
arrayExtra
.
startsWith
(
'
{
'
)
||
/
\(
.*
\)
/
.
test
(
arrayExtra
)))
{
return
false
}
...
...
@@ -320,7 +325,7 @@ function parseEvent (keyPath, valuePath, state, isComponent, isNativeOn = false,
// "click":function($event) {click1(item);click2(item);}
const
body
=
funcPath
.
node
.
body
&&
funcPath
.
node
.
body
.
body
const
funcParams
=
funcPath
.
node
.
params
if
(
body
&&
body
.
length
&&
funcParams
&&
funcParams
.
length
===
1
&&
!
hasMemberExpression
(
funcPath
))
{
if
(
body
&&
body
.
length
&&
funcParams
&&
funcParams
.
length
===
1
&&
!
hasMemberExpression
(
funcPath
)
&&
isSafeScoped
(
state
)
)
{
const
exprStatements
=
body
.
filter
(
node
=>
{
return
t
.
isExpressionStatement
(
node
)
&&
t
.
isCallExpression
(
node
.
expression
)
&&
!
node
.
expression
.
arguments
.
find
(
element
=>
{
// click1(item().a)
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录