vue组件中,prop双向绑定的实现

vue组件中,props双向绑定的实现

1、vue2.x中的使用

总所周知, vue2.x 中,在组件上使用 v-model 相当于绑定 value prop 和 input 事件:

<Component v-model="pageTitle" />
<!-- 等同于: -->
<Component :value="pageTitle" @input="pageTitle = $event" />

在组件内部,可通过model接收,将默认的属性名value或默认绑定的input事件进行更改:

// Component.vue
export default {
  model: {
    prop: 'title', // 将默认的value更改为title
    event: 'change' // 将默认的input事件更改为change
  },
  props: {
    // 这将允许 `value` 属性用于其他用途
    value: String,
    // 使用 `title` 代替 `value` 作为 model 的 prop
    title: {
      type: String,
      default: ''
    }
  },
  methods: {
  	// 子组件中,可通过调用changeTitle方法,传入value去更改父组件中的pageTitle
  	changeTitle(value) {
  		this.$emit('change', value)
  	}
  }
}

比较局限的是,在vue2.x的版本中,通过v-model这种方式,只能使一组prop达到双向绑定的目的,若要绑定多个prop,我们可以使用.sync修饰符,来设置多个prop的绑定:

<Component :page.sync ="homePage"/>
<!-- 等同于: -->
<Component :page= "homePage" @update:page="homePage =$event" />

多个prop

<Component :page.sync ="homePage" :page-size.sync ="pageSize"/>
<!-- 等同于: -->
<Component :page= "homePage" @update:page="homePage =$event" :page-size= "pageSize" @update:pageSize="pageSize =$event" />

组件内部,则可通过$emit去更改父组件中的值

// Component.vue
export default {
  props: {
    page: {
      type: String,
      default: ''
    },
    pageSize: {
      type: String,
      default: ''
    }
  },
  methods: {
  	changePage(value) {
  		this.$emit('update:page', value)
  	},
  	changePageSize(value) {
  		this.$emit('update:pageSize', value)
  	}
  }
}
2、vue3.x中的使用

以上是vue2.x中运用的方法,在 3.x 中,v-model语法糖将二者进行了结合,在自定义组件上的 v-model 相当于传递了 modelValue prop 并接收抛出的 update:modelValue 事件:

<Component v-model:page="homePage" />
<!-- 等同于 -->
<Component :page="homePage" @update:page="homePage = $event" />
3、完整实现

写法上,类似于vue2.x中的.sync修饰符,在官方文档说明中,3.x也推荐使用通过v-model这种方式,去替换.sync修饰符这种写法,若结合组件内的computed,会达到更多意想不到的效果:

<!-- home.vue-->
<Component v-model:page="homePage" v-model:page-size="pageSize" />
// Component.vue
export default {
  props: {
    page: {
      type: String,
      default: ''
    },
    pageSize: {
      type: String,
      default: ''
    }
  },
  computed: {
  	// 通过get与set方法,可是page这个prop在子组件中,通过sonPage去监听更改
  	// 子组件也可以随意更改和使用sonPage这个属性
  	sonPage: {
  		get() {
  			return this.page
  		},
  		set(value) {
  			this.$emit('update:page', value)
  		}
  	},
  	sonSize: {
  		get() {
  			return this.pageSize
  		},
  		set(value) {
  			this.$emit('update:pageSize', value)
  		}
  	}
  }
}
  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue ,可以使用 `v-bind` 和 `v-on` 指令实现父子组件值的双向。 首先,在父组件使用 `v-bind` 一个变量到子组件的 `prop` 上,例如: ```html <template> <div> <child-component v-bind:childValue="parentValue"></child-component> </div> </template> <script> export default { data() { return { parentValue: '' } } } </script> ``` 然后,在子组件使用 `props` 接收父组件传递的值,并使用 `v-model` 组件内部的变量,例如: ```html <template> <div> <input v-model="childValue"> </div> </template> <script> export default { props: { childValue: { type: String, default: '' } } } </script> ``` 这样,当子组件内部的 `input` 元素发生变化时,父组件的 `parentValue` 也会跟着改变。 注意,如果子组件需要修改父组件传递的值,需要使用 `$emit` 方法触发一个自义事件,例如: ```html <template> <div> <input v-model="childValue" @input="handleChange"> </div> </template> <script> export default { props: { childValue: { type: String, default: '' } }, methods: { handleChange() { this.$emit('update:childValue', this.childValue) } } } </script> ``` 在父组件,可以使用 `v-on` 监听子组件触发的自义事件,并更新父组件的变量,例如: ```html <template> <div> <child-component v-bind:childValue="parentValue" v-on:update:childValue="handleChildValueChange"></child-component> </div> </template> <script> export default { data() { return { parentValue: '' } }, methods: { handleChildValueChange(value) { this.parentValue = value } } } </script> ``` 这样,当子组件内部的 `input` 元素发生变化时,不仅父组件的 `parentValue` 会跟着改变,子组件也可以修改父组件的值。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值