Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
Velpro187
uni-app
提交
7eccb3f4
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,发现更多精彩内容 >>
提交
7eccb3f4
编写于
4月 28, 2021
作者:
D
DCloud_LXH
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
feat: useAttrs
上级
e6ba5dad
变更
4
隐藏空白更改
内联
并排
Showing
4 changed file
with
79 addition
and
33 deletion
+79
-33
packages/uni-components/src/helpers/useAttrs.ts
packages/uni-components/src/helpers/useAttrs.ts
+59
-0
packages/uni-h5/src/helpers/dom.ts
packages/uni-h5/src/helpers/dom.ts
+0
-20
packages/uni-h5/src/view/components/video/index.tsx
packages/uni-h5/src/view/components/video/index.tsx
+10
-7
packages/uni-h5/src/view/components/web-view/index.tsx
packages/uni-h5/src/view/components/web-view/index.tsx
+10
-6
未找到文件。
packages/uni-components/src/helpers/useAttrs.ts
0 → 100644
浏览文件 @
7eccb3f4
import
{
getCurrentInstance
,
reactive
,
shallowRef
,
watchEffect
}
from
'
vue
'
type
Hash
<
T
>
=
{
[
key
:
string
]:
T
}
function
entries
<
T
>
(
obj
:
Hash
<
T
>
):
[
string
,
T
][]
{
return
Object
.
keys
(
obj
).
map
((
key
:
string
)
=>
[
key
,
obj
[
key
]])
}
interface
Params
{
excludeListeners
?:
boolean
excludeKeys
?:
string
[]
}
const
DEFAULT_EXCLUDE_KEYS
=
[
'
class
'
,
'
style
'
]
const
LISTENER_PREFIX
=
/^on
[
A-Z
]
+/
export
const
useAttrs
=
(
params
:
Params
=
{})
=>
{
const
{
excludeListeners
=
false
,
excludeKeys
=
[]
}
=
params
const
instance
=
getCurrentInstance
()
const
attrs
=
shallowRef
({})
const
listeners
=
shallowRef
({})
const
excludeAttrs
=
shallowRef
({})
const
allExcludeKeys
=
excludeKeys
.
concat
(
DEFAULT_EXCLUDE_KEYS
)
// Since attrs are not reactive, make it reactive instead of doing in `onUpdated` hook for better performance
instance
!
.
attrs
=
reactive
(
instance
!
.
attrs
)
watchEffect
(()
=>
{
const
res
=
entries
(
instance
!
.
attrs
).
reduce
(
(
acc
,
[
key
,
val
])
=>
{
if
(
allExcludeKeys
.
includes
(
key
))
{
;(
acc
.
exclude
as
any
)[
key
]
=
val
}
else
if
(
LISTENER_PREFIX
.
test
(
key
))
{
if
(
!
excludeListeners
)
{
;(
acc
.
attrs
as
any
)[
key
]
=
val
}
;(
acc
.
listeners
as
any
)[
key
]
=
val
}
else
{
;(
acc
.
attrs
as
any
)[
key
]
=
val
}
return
acc
},
{
exclude
:
{},
attrs
:
{},
listeners
:
{},
}
)
attrs
.
value
=
res
.
attrs
listeners
.
value
=
res
.
listeners
excludeAttrs
.
value
=
res
.
exclude
})
return
{
$attrs
:
attrs
,
$listeners
:
listeners
,
$excludeAttrs
:
excludeAttrs
}
}
packages/uni-h5/src/helpers/dom.ts
浏览文件 @
7eccb3f4
...
...
@@ -12,23 +12,3 @@ export function checkMinWidth(minWidth: number) {
]
return
Math
.
max
.
apply
(
null
,
sizes
)
>
minWidth
}
export
function
separateAttrs
(
attrs
:
Data
)
{
const
ignore
=
[
'
style
'
,
'
class
'
]
let
$listeners
:
Data
=
{}
// 事件
let
$ignoreAttrs
:
Data
=
{}
// ignore
let
$otherAttrs
:
Data
=
{}
// 事件 和 ignore
let
$attrs
:
Data
=
{}
// 除去 ignore 和 事件
for
(
const
key
in
attrs
)
{
if
(
/^on
[
A-Z
]
+/
.
test
(
key
))
{
$listeners
[
key
]
=
attrs
[
key
]
$otherAttrs
[
key
]
=
attrs
[
key
]
}
else
if
(
ignore
.
includes
(
key
))
{
$ignoreAttrs
[
key
]
=
attrs
[
key
]
$otherAttrs
[
key
]
=
attrs
[
key
]
}
else
{
$attrs
[
key
]
=
attrs
[
key
]
}
}
return
{
$attrs
,
$otherAttrs
,
$listeners
,
$ignoreAttrs
}
}
packages/uni-h5/src/view/components/video/index.tsx
浏览文件 @
7eccb3f4
...
...
@@ -14,10 +14,12 @@ import {
import
{
passive
}
from
'
@dcloudio/uni-shared
'
import
{
useI18n
,
initI18nVideoMsgsOnce
}
from
'
@dcloudio/uni-core
'
import
{
getRealPath
}
from
'
@dcloudio/uni-platform
'
import
{
useSubscribe
}
from
'
@dcloudio/uni-components
'
import
{
useCustomEvent
}
from
'
@dcloudio/uni-components
'
import
{
useUserAction
}
from
'
@dcloudio/uni-components
'
import
{
separateAttrs
}
from
'
../../../helpers/dom
'
import
{
useSubscribe
,
useCustomEvent
,
useUserAction
,
useAttrs
,
}
from
'
@dcloudio/uni-components
'
type
CustomEventTrigger
=
ReturnType
<
typeof
useCustomEvent
>
type
UserActionState
=
ReturnType
<
typeof
useUserAction
>
[
'
state
'
]
...
...
@@ -803,6 +805,9 @@ export default /*#__PURE__*/ defineComponent({
const
containerRef
=
ref
(
null
)
const
trigger
=
useCustomEvent
(
rootRef
,
emit
as
SetupContext
[
'
emit
'
])
const
{
state
:
userActionState
}
=
useUserAction
()
const
{
$attrs
:
videoAttrs
}
=
useAttrs
({
excludeListeners
:
true
,
})
const
{
t
}
=
useI18n
()
initI18nVideoMsgsOnce
()
const
{
...
...
@@ -862,8 +867,6 @@ export default /*#__PURE__*/ defineComponent({
)
return
()
=>
{
const
videoAttrs
=
separateAttrs
(
attrs
).
$attrs
return
(
<
uni
-
video
ref
=
{
rootRef
}
id
=
{
props
.
id
}
>
<
div
...
...
@@ -886,7 +889,7 @@ export default /*#__PURE__*/ defineComponent({
src
=
{
videoState
.
src
}
poster
=
{
props
.
poster
}
autoplay
=
{
!!
props
.
autoplay
}
{
...
videoAttrs
}
{
...
videoAttrs
.
value
}
class
=
"uni-video-video"
webkit
-
playsinline
playsinline
...
...
packages/uni-h5/src/view/components/web-view/index.tsx
浏览文件 @
7eccb3f4
...
...
@@ -7,10 +7,9 @@ import {
onDeactivated
,
Teleport
,
}
from
'
vue
'
import
{
ResizeSensor
}
from
'
@dcloudio/uni-components
'
import
{
ResizeSensor
,
useAttrs
}
from
'
@dcloudio/uni-components
'
import
{
getRealPath
}
from
'
@dcloudio/uni-platform
'
import
{
updateElementStyle
}
from
'
@dcloudio/uni-shared
'
import
{
separateAttrs
}
from
'
../../../helpers/dom
'
const
props
=
{
src
:
{
...
...
@@ -29,6 +28,9 @@ export default /*#__PURE__*/ defineComponent({
const
rootRef
:
RootRef
=
ref
(
null
)
const
iframeRef
:
RootRef
=
ref
(
null
)
const
_resize
=
useWebViewSize
(
rootRef
,
iframeRef
)
const
{
$attrs
,
$excludeAttrs
,
$listeners
}
=
useAttrs
({
excludeListeners
:
true
,
})
onMounted
(()
=>
{
_resize
()
...
...
@@ -43,11 +45,13 @@ export default /*#__PURE__*/ defineComponent({
})
return
()
=>
{
const
webViewAttrs
=
separateAttrs
(
attrs
)
return
(
<>
<
uni
-
web
-
view
{
...
webViewAttrs
.
$otherAttrs
}
ref
=
{
rootRef
}
>
<
uni
-
web
-
view
{
...
$listeners
.
value
}
{
...
$excludeAttrs
.
value
}
ref
=
{
rootRef
}
>
<
ResizeSensor
onResize
=
{
_resize
}
/>
</
uni
-
web
-
view
>
...
...
@@ -55,7 +59,7 @@ export default /*#__PURE__*/ defineComponent({
<
iframe
ref
=
{
iframeRef
}
src
=
{
getRealPath
(
props
.
src
)
}
{
...
webViewAttrs
.
$attrs
}
{
...
$attrs
.
value
}
></
iframe
>
</
Teleport
>
</>
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录