最新文章专题视频专题问答1问答10问答100问答1000问答2000关键字专题1关键字专题50关键字专题500关键字专题1500TAG最新视频文章推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37视频文章20视频文章30视频文章40视频文章50视频文章60 视频文章70视频文章80视频文章90视频文章100视频文章120视频文章140 视频2关键字专题关键字专题tag2tag3文章专题文章专题2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章专题3
问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501
当前位置: 首页 - 科技 - 知识百科 - 正文

Vue父子组件双向绑定传值的实现方法

来源:懂视网 责编:小采 时间:2020-11-27 22:10:53
文档

Vue父子组件双向绑定传值的实现方法

Vue父子组件双向绑定传值的实现方法:父子组件之间的双向绑定非常简单,但是很多人因为是从Vue 2+开始使用的,可能不知道如何双向绑定,当然最简单的双向绑定(单文件中)就是表单元素的 v-model 了,例如 <input type=text /> 它会响应表单元素的 value 属性,当输入框文本改变时
推荐度:
导读Vue父子组件双向绑定传值的实现方法:父子组件之间的双向绑定非常简单,但是很多人因为是从Vue 2+开始使用的,可能不知道如何双向绑定,当然最简单的双向绑定(单文件中)就是表单元素的 v-model 了,例如 <input type=text /> 它会响应表单元素的 value 属性,当输入框文本改变时

父子组件之间的双向绑定非常简单,但是很多人因为是从Vue 2+开始使用的,可能不知道如何双向绑定,当然最简单的双向绑定(单文件中)就是表单元素的 v-model 了,例如 <input type="text" /> 它会响应表单元素的 value 属性,当输入框文本改变时,会将 value 值传给 v-model 所绑定的变量,如果同时设置 v-model 和 value , value 属性无效。

父子组件的自定义双向 v-model

当若干dom封装成组件时,在父组件中使用子组件时,却无法在子组件标签上使用 v-model ,因为子组件标签不是表单元素,这个时候,我们需要自定义我们想要的 v-model 规则。

<!-- children.vue -->
<template>
 <h1>{{ msg }}</h1>
</template>
<script>

export default{
 model:{
 prop:'msg',//这个字段,是指父组件设置 v-model 时,将变量值传给子组件的 msg
 event:'parent-event'//这个字段,是指父组件监听 parent-event 事件
 },
 props:{
 msg:String //此处必须定义和model的prop相同的props,因为v-model会传值给子组件
 },
 mounted(){
 //这里模拟异步将msg传到父组件v-model,实现双向控制
 setTimeout(_=>{
 let some = '3秒后出现的某个值';//子组件自己的某个值
 this.$emit('praent-event',some);
 //将这个值通过 emit 触发parent-event,将some传递给父组件的v-model绑定的变量
 },3000);
 }
}
</script>

<!-- parent.vue -->
<template>
 <children v-model="parentMsg"></children>
</template>
<script>
import children from 'path/to/children.vue';
export default{
 components:{
 children
 },
 data(){
 return{
 parentMsg:'test'
 }
 },
 watch:{
 parentMsg(newV,oldV){
 console.log(newV,oldV);
 //三秒后控制台会
输出 //'3秒后出现的某个值','test' } } } </script>

你学会组件的自定义 v-model 了吗 ? 如果是普通的表单元素,同理,监听表单的 input 或者 change 事件,实时将 value 或者 checked 通过 $emit 传递就可以了。

父子组件的自定义多个双向值

上述例子,是实现单个prop值的双向绑定,当组件的需求需要复杂的操作,需要多个双向值,是如何实现的呢。这里需要用到以前被vue抛弃,后来又回归的 .sync 修饰符。

事实上,这个比 v-model 更加简单

<!-- children.vue -->
<template>
 <h1>{{ msg }}</h1>
</template>
<script>

export default{
 props:{
 msg:String
 },
 mounted(){
 //这里模拟异步将msg传到父组件v-model,实现双向控制
 setTimeout(_=>{
 let some = '3秒后出现的某个值';//子组件自己的某个值
 this.$emit('update:msg',some);
 //将这个值通过 emit
 //update为固定字段,通过冒号连接双向绑定的msg,将some传递给父组件的v-model绑定的变量
 },3000);
 }
}
</script>

<!-- parent.vue -->
<template>
 <children :msg.sync="parentMsg"></children>
 <!-- 此处只需在平时常用的单向传值上加上.sync修饰符 -->
</template>
<script>
import children from 'path/to/children.vue';
export default{
 components:{
 children
 },
 data(){
 return{
 parentMsg:'test'
 }
 },
 watch:{
 parentMsg(newV,oldV){
 console.log(newV,oldV);
 //三秒后控制台会
输出 //'3秒后出现的某个值','test' } } } </script>

此处需要注意,虽然加上 .sync 即可双向绑定,但是还是要依靠子组件 $emit 去触发 update:prop名 实现修改父组件的变量值实现双向数据流,如果直接对prop的属性直接赋值,依然会出现报错。

事实上, .sync 修饰符是一个简写,它做了一件事情

<template>
 <children :msg.sync="parentMsg"></children>
 <!-- 等价于 -->
 <children :msg="parentMsg" @updata:msg="parentMsg = $event"></children>
 <!-- 这里的$event就是子组件$emit传递的参数 -->
</template>

当需要把一个对象中的属性全部通过 .sync 传入双向数据流时,可以再简便一下写法

<template>
 <children :.sync="obj"></children>
</template>
<script>
export default{
 components:{
 children
 },
 data(){
 return{
 obj:{
 parentMsg:'test'
 }
 }
 }
}
</script>

当使用这种写法时,会将obj对象中的所有属性都通过独立的props传递给子组件,并监听对应的 update: ,此时在子组件中也要声明对应的props。

总结

以上所述是小编给大家介绍的Vue父子组件双向绑定传值的实现方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

文档

Vue父子组件双向绑定传值的实现方法

Vue父子组件双向绑定传值的实现方法:父子组件之间的双向绑定非常简单,但是很多人因为是从Vue 2+开始使用的,可能不知道如何双向绑定,当然最简单的双向绑定(单文件中)就是表单元素的 v-model 了,例如 <input type=text /> 它会响应表单元素的 value 属性,当输入框文本改变时
推荐度:
标签: VUE 实现 组件
  • 热门焦点

最新推荐

猜你喜欢

热门推荐

专题
Top