自定义组件使用v-model双向绑定解决方案

今天学习了coderwhy老师的项目里的自定义组件使用v-model实现双向绑定,一般都会修改props里的属性值,这是我们不提倡的,所以我总结一些问题和解决方案,如下:

一般的方法(这些方法都会修改props的属性值,我们不提倡):

方案一:(弊端:违反了单向数据流设计原则:子组件修改了props的属性值)

父组件:

 子组件:

方案二:弊端:看似改变了值是通过emit传出去让父组件修改,但是实际上这个set方法还是没有触发

子组件:

vue的父组件通过props将一些属性传给子组件,子组件里的某个元素要使用v-model绑定传进来的props,但是这里有个问题,如果子组件的某个元素,比如(input表单),他绑定的值发生变化,那么porps的属性的值就会发生变化,那么这就相当于修改了props的值,这就违反了props单向数据流的原则。那么我们需要怎么做呢?

解决方案:(这个方案没有违反props单向数据流原则)

1.拷贝一份给formData 这时formData与user里的formData没有关联

2.我们要监听formData的改变,发生改变就使用emit把事件传出去告知user里的formData修改 (因为我们要监听formData里的属性值变化 所以要深度监听)

父组件

相关代码:

setup() {
    const formData = ref({
      id: '',
      name: '',
      password: '',
      sport: '',
      createTime: ''
    })

    return { searchFormConfig, formData }
  }

子组件 

export default defineComponent({
  props: {
    modelValue: {
      type: Object,
      require: true
    }
    }
  },
  emits: ['update:modelValue'],
  setup(props, { emit }) {
    // 拷贝一份给formData 这时formData与user里的formData没有关联
    const formData = ref({ ...props.modelValue })
    // 我们要监听formData的改变,发生改变就使用emit把事件传出去告知user里的formData修改
    // 因为我们要监听formData里的属性值变化 所以要深度监听
    watch(
      formData,
      (newValue) => {
        emit('update:modelValue', newValue)
      },
      { deep: true }
    )

    return { formData }
  }
})
</script>

 

  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值