vue组件传值,父子组件双向绑定的使用

目录

vue组件传值

父子组件之间的双向绑定 


vue组件传值

父子传值
    父传子
       传   子组件标签   属性名=值
       收   props:{
           属性名:{
               type:类型,多个类型  [Object,Array,String],
               default:基本数据类型,直接写
                       复杂数据类型:()=>{return 复杂数据类型}
               required:true, // 必填
               validator:(value)=>{
                   return boolean值
                      true:验证通过
                      false:验证失败
               }
           }
           单向数据流:栈不可修改,堆随便改
                   基本数据类型不可修改,复杂 数据类型,只要不修改它的引用地址(栈),它的值随便修改
       }
    子传父(子触发父方法)
       绑定:  子组件标签  @子组件方法名="父组件方法"
       触发:
         子组件内触发:this.$emit('子组件方法名',参数值)
  兄弟组件传值
     1:Vue.prototype.$bus=new Vue()
     2: 监听  this.$bus.$on('方法名',(参数值)=>{...})
     3:触发   this.$bus.$emit('方法名',实参值)
     4:销毁  this.$bus.$off('方法名')
     特点:bus的监听会累加,bus的监听不使用时要销毁,beforeDestroy销毁处理
v-model
   子组件标签   :value="父组件属性"  @input="父组件属性=$event"
   子组件标签  v-model="父组件属性"
   子组件内:
      props:['value']
      model:{
          prop:'value',
          event:'input'
      }
      触发:this.$emit('input',实参值)
.sync修饰符
   子组件标签  :属性名="父组件属性"   @update:属性名="父组件属性=$event"
   子组件标签  :属性名.sync="父组件属性"
   子组件内
     props:['属性名']
     触发:this.$emit('@update:属性名',实参值)

父子组件之间的双向绑定 

父子组件双向绑定
  子组件标签   :value="父组件属性"  @input="父组件属性=$event"      
  子组件标签   v-model="父组件属性"   
  子组件内:
     props:['value'],
     model:{
         prop:'传入的属性名,默认是value',
         event:'绑定的事件名,默认是input'
     },
     单向数据流:栈不可修改,堆可以修改
               基本数据类型不可修改,复杂数据类型,只要不改变它的引用地址(栈),它的值随便修改
      this.$emit('input',实参值) 
      
      
1:子组件标签上  :value="父组件属性"   @input="父组件属性=$event"
   子组件标签上  v-model="父组件属性"  
2:子组件内
   props:['value'],
   修改value
    this.$emit('input',修改后的值)
  不使用value和input
  model:{
      prop:'value',
      event:'input'
  }

 第一种写法是:

在父组件里面的子组件标签

<template>
  <div>
    首页
    <h3>使用全局组件v-model 第一种方式</h3>
    <h2>{{ fatherNum }}</h2>
    <!-- <HmNum :value="fatherNum" @input="fatherNum = $event" /> -->
  </div>
</template>

<script>
export default {
  data() {
    return {
      fatherNum: 1
    }
  },
  created() {},
  methods: {}
}
</script>

<style></style>

然后在子组件接受

<template>
  <div>
    <button @click="btn(-1)">-</button>
    <input type="text" :value="value"><button @click="btn(1)">+</button>
  </div>
</template>

<script>
export default {
  name: 'HmNum',
  // 这是第一种
  props: {
    value: {
      type: Number,
      default: 1
    }
  },
  methods: {
    btn(a) {
      this.$emit('input', this.value + a)
    }
  }
}
</script>

<style></style>

 以上这种方式实现的父子组件的v-model通信,虽可行,但限制了我们必须popos接收的属性名为value和emit触发的必须为input,这样就容易有冲突,特别是在表单里面。所以,
为了更优雅的使用v-model通信而解决冲突的问题,我们可以通过在子组件中使用model选项,

下面演示写法2:

在父组件里面的子组件标签

<template>
  <div>
    首页
    <h3>使用全局组件v-model 第一种方式</h3>
    <h2>{{ fatherNum }}</h2>
    <HmNum v-model="fatherNum" />
  </div>
</template>

<script>
export default {
  data() {
    return {
      fatherNum: 1
    }
  },
  created() {},
  methods: {}
}
</script>

<style></style>

然后在子组件接受 

<template>
  <div>
    <button @click="btn(-1)">-</button>
    <input type="text" :value="aaa"><button @click="btn(1)">+</button>
  </div>
</template>

<script>
export default {
  name: 'HmNum',
  // 这是第一二种
  model: {
    // 这个是属性值
    prop: 'aaa',
    // 这个是绑定的事件名
    event: 'xxx'
  },
  props: {
    aaa: {
      type: Number,
      default: 1
    }
  },
  methods: {
    btn(a) {
      this.$emit('xxx', this.aaa + a)
    }
  }
}
</script>

<style></style>

注意:

第二种方式还有的好处是减少了父组件的代码,在自己组件里面就把事件,和值都写了

兄弟组件之间传值的话,最后一定要销毁,不然的话会造成 累计加!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在 Vue 中,可以通过父组件传递属性(props)给子组件来实现父子组件之间的通信。具体步骤如下: 1. 在父组件中,通过属性绑定的方式将数据传递给子组件。例如: ``` <template> <div> <ChildComponent :propName="propValue"></ChildComponent> </div> </template> <script> import ChildComponent from './ChildComponent.vue' export default { components: { ChildComponent }, data() { return { propValue: 'Hello World' } } } </script> ``` 2. 在子组件中,通过 props 接收父组件传递的属性。例如: ``` <template> <div> {{ propName }} </div> </template> <script> export default { props: { propName: { type: String, default: '' } } } </script> ``` 这样,父组件就可以将数据传递给子组件,并且子组件可以根据传递的数据进行相应的操作。 ### 回答2: 在Vue中,父组件可以通过props属性向子组件传递数据。子组件可以接收这些数据并在模板中使用。以下是一个简单的示例: 父组件中的代码: ``` <template> <div> <h1>父组件</h1> <p>父组件的数据:{{ parentData }}</p> <ChildComponent :childData="parentData"></ChildComponent> </div> </template> <script> import ChildComponent from './ChildComponent.vue'; export default { components: { ChildComponent }, data() { return { parentData: 'Hello Vue!' }; } }; </script> ``` 子组件中的代码: ``` <template> <div> <h2>子组件</h2> <p>子组件接收到的数据:{{ childData }}</p> </div> </template> <script> export default { props: ['childData'] }; </script> ``` 在父组件中,我们将`parentData`通过v-bind指令传递给子组件的`childData`。在子组件中,我们可以通过props属性接收`childData`并在模板中使用。 这样,当父组件的数据发生变化时,子组件也会随之更新。父子组件之间的传值通过props实现了双向数据流。这对于构建复杂的组件结构非常有帮助,使得数据的传递变得简单和可控。 ### 回答3: Vue中,可以通过props属性实现父组件向子组件传递数据。具体可以分为以下几个步骤: 1. 在父组件中定义要传递给子组件的数据,通过在子组件标签上绑定属性的方式传递。在父组件中引入子组件,并在模板中使用组件的标签。 2. 在子组件中,通过在props选项中声明要接收的属性,来接收来自父组件的数据。可以使用v-bind指令将父组件传递过来的属性绑定到子组件的属性上。 3. 在子组件中,通过使用传递过来的属性,可以直接在模板中使用组件传递的值。 这样,就实现了父组件向子组件传递数据的功能。 示例代码如下: // 父组件 <template> <div> <h1>父组件</h1> <child-component :message="message"></child-component> </div> </template> <script> import ChildComponent from './ChildComponent.vue'; export default { name: 'ParentComponent', data() { return { message: 'Hello Vue!', }; }, components: { ChildComponent, }, }; </script> // 子组件 <template> <div> <h2>子组件</h2> <p>{{ message }}</p> </div> </template> <script> export default { name: 'ChildComponent', props: ['message'], }; </script> 这样父组件中的message数据就会传递给子组件,并在子组件中显示出来。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值