# 双向绑定
# 使用方式
- 需要在引入的mixin中定义一个
value
的属性。 - 默认在
watch
中监听了value
属性的变化,同时更新val
值。 - 提供了一个
val
属性,该属性可以获取到最新的value
值。 - 提供了一个
handleEmitChange
方法,该方法可以并触发change
input
事件。
import ValueSync from 'sadais-piui/mixin/value-sync'
export default {
mixins: [ValueSync],
props: {
value: {
type: Boolean,
default: false
}
}
}
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
# 源码
使用前请仔细阅读源码
export default {
model: {
prop: 'value',
event: 'input'
},
data() {
return {
// 同步value到val
val: this.value
}
},
watch: {
value: {
deep: true,
immediate: true,
handler(value) {
this.val = value
}
}
},
methods: {
handleEmitChange() {
this.$emit('input', this.val)
this.$emit('change', this.val)
}
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# 示例
弹窗组件的二次封装
<template>
<pi-mask
:value="val"
:mask-closeable="false"
custom-class="pi-flex-column pi-align-center pi-justify-center"
@closed="handleClose"
>
<view>
<text class="title">填写快递信息</text>
<text class="subtitle">请填写您的真实姓名、联系方式及详细地址</text>
</view>
</pi-mask>
</template>
<script>
import ValueMixin from '@sadais/piui-tool/mixin/value-sync'
export default {
name: 'FillAddress',
mixins: [ValueMixin],
props: {
value: {
type: Boolean,
default() {
return true
}
}
},
methods: {
handleClose() {
// 需要同步父组件的value,直接改变val,同时调用handleEmitChange方法
this.val = false
this.handleEmitChange()
}
}
}
</script>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
父组件中使用
<template>
<fill-address v-model="isShow">
</template>
<script>
import ValueMixin from '@sadais/piui-tool/mixin/value-sync'
export default {
data: {
isShow: false // 是否显示弹窗填写地址
}
}
</script>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
← 获取微信code