# 双向绑定

# 使用方式

  1. 需要在引入的mixin中定义一个value的属性。
  2. 默认在 watch 中监听了 value 属性的变化,同时更新 val 值。
  3. 提供了一个 val 属性,该属性可以获取到最新的value值。
  4. 提供了一个 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

# 源码

使用前请仔细阅读源码

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

# 示例

弹窗组件的二次封装

<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

父组件中使用

<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
Last updated: 2021/11/1 下午4:02:09