vue组件通信,点击传值,动态传值(父传子,子传父)

vue说到组件通信,无非是父组件传子组件,子组件传父组件,跨级组件传值,同级组件传值,个人觉得,除了父子组件的传值,其余情况就可以用vuex来解决了,这篇先不说vuex,这里介绍父子组件传值。不会你打我!

一、父组件传子组件,核心--props

下面是场景,点击传值给子组件

在这里触发 handleClick 点击事件,额外声明一个clickData,点击按钮将 inpMessage 的值赋给 clickData ,再传给子组件

父组件index.vue

<template>
  <div>
    <input type="text" v-model="inpMessage">
    <button @click="handleClick">点击传给子组件</button>
    <children :message="clickData" />  //message为子组件props接收的值,clickData为父组件要传的值
  </div>
</template>

<script>
  import children from './page/children'
  export default {
    name: "index",
    components:{
      children
    },
    data(){
      return{
        inpMessage:'',
        clickData:''
      }
    },
    methods:{
      handleClick(){
        //赋值
        this.clickData = this.inpMessage
      },
    }
  }
</script>

<style></style>

子组件children.vue

<template>
    <div>
      <input type="text" v-model="childrenMessage">
      <!--<button @click="childClick">传值给父组件</button>-->
    </div>
</template>

<script>
    export default {
        name: "children",
      props:{
          message:String  //接收父组件传过来的值,这是稍微高级一点的写法,也可以props:[' message']
      },
      data(){
          return{
            childrenMessage:''
          }
      },
      created(){
        this.childrenMessage=this.message  //初始化时候的赋值
      },
    }
</script>

<style scoped>

</style>

上面是父组件传值给子组件的过程,最重要的点是props接收,上面是点击事件传值,还有一种场景是动态传值,实时更新父组件的值,自组件动态更新,这里就要用到watch了,附上自组件代码

子组件:watch监听法

<template>
    <div>
      <input type="text" v-model="childrenMessage">
      <!--<button @click="childClick">传值给父组件</button>-->
    </div>
</template>

<script>
    export default {
        name: "children",
      props:{
          message:String
      },
      data(){
          return{
            childrenMessage:''
          }
      },
      created(){
        this.childrenMessage=this.message
      },

      //这里用watch方法来监听父组件传过来的值,来实现实时更新
      watch:{
        message(val){    //message即为父组件的值,val参数为值
          this.childrenMessage = val    //将父组件的值赋给childrenMessage 子组件的值
        }
      }

    }
</script>

<style scoped>

</style>

二、子组件传父组件,核心--$emit,这里附上完整父子传值的代码,vue是不允许子组件向父组件传值去改变父组件的值的,但是我们可以通过自定义事件的形式去改变值,例如点击事件,再通过$emit来传递,代码注释中有介绍。

父组件

<template>
  <div>
    <input type="text" v-model="inpMessage">
    <button @click="handleClick">点击传给子组件</button>
      //@messageData为子组件声明传递过来的值,函数,getData为函数,val参数是传递过来的值
    <children :message="clickData" @messageData="getData"/>
  </div>
</template>

<script>
  import children from './page/children'
  export default {
    name: "index",
    components:{
      children
    },
    data(){
      return{
        inpMessage:'',
        clickData:''
      }
    },
    methods:{
      handleClick(){
        this.clickData = this.inpMessage
      },
        //接收子组件传递的值,val参数是传递过来的值  ,给inpMessage 赋值,子组件改变父组件的值
      getData(val){
        this.inpMessage = val
        console.log(val)
      }
    }
  }
</script>

<style></style>

子组件

<template>
    <div>
      <input type="text" v-model="childrenMessage">
      <button @click="childClick">传值给父组件</button>
    </div>
</template>

<script>
    export default {
        name: "children",
      props:{
          message:String
      },
      data(){
          return{
            childrenMessage:''
          }
      },
      created(){
        this.childrenMessage=this.message
      },
      methods:{
        //点击传值给父组件,通过$emit传递,第一个参数messageData相当于传播的媒介,this.childrenMessage为需要传递的值,后面也可以传递多个参数
        childClick(){
          this.$emit('messageData',this.childrenMessage)
          console.log(this.childrenMessage)
        }
      },
      watch:{
        message(val){
          this.childrenMessage = val
        }
      }

    }
</script>

后续更新同级组件传值,和Vuex的使用方法。希望各位大佬批评指正!

猜你喜欢

转载自blog.csdn.net/xr510002594/article/details/83304141