vue父子组件通信

组件目录结构

parent
child

API: $emit、 $on、 $refs、 props

1、父子组件通信

QQ20181224-150051@2x.png

需求合理性我们先不考虑,demo就为了搞清怎么通信,我们要求:
1、父组件传值给子组件,同时父组件input输入框value也可同步到子组件
2、点击子组件加减子组件数字跟随变动, 父组件input value跟随变动,

父组件
<template>
<div>
    <input type="text" v-model="count">
    <add-child :count="count" ref='addChild' @childAdd="add"   @childReduce="reduce"></add-child>
</div>
    
</template>
<script>
import addChild from '@/components/add'
export default {
    data(){
        return {
            count: 0
        }
    },
    methods:{
        add(count){
            this.count = count
        },
        reduce(count){
            this.count = count
        }
    },
    watch: {
        count (val) {
           return this.count = Number(val)
        }
    },
    components:{
        addChild
    }
}
</script>
子组件
<template>
<div>
    <span class="button" @click="add">+</span>
    <span class="button" @click="reduce">-</span>
</div>
    
</template>

<script>
export default {
    props:{
        count:{
            //约定数据类型
            type: Number,
              //默认值
            default: 0
        }
    },
    methods:{
        add(){
            this.$emit('childAdd',this.count + 1)
        },
        reduce(){
            this.$emit('childReduce', this.count - 1)
        },
        
    }
}
</script>
父组件引入子组件
import addChild from '@/components/add'
父子件注册子组件
//并在父组件内注册子组件
components:{
    addChild
}
父组件html
// v-bind:count="count" 父组件传递值给子组件,v-on:add="add"监听子组件 (用v-bind和v-on有助于更好的理解,熟悉了我们可以简化)
    <!-- <add-child v-bind:count="count" ref='addChild' v-on:toast="toast" v-on:parentAdd="add"   v-on:parentReduce="reduce"></add-child> -->
    <add-child :count="count" @add="childAdd"  @reduce="childReduce"></add-child>
子组件接收父组件传递的值
props:{
        count:{
            //约定数据类型
            type: Number,
              //默认值
            default: 0
        }
    }

接收父组件传递的值count
发送事件
 methods:{
        add(){
            this.$emit('childAdd',this.count + 1)
        },
        reduce(){
            this.$emit('childReduce', this.count - 1)
        }
    }

//父组件监听子组件指令childAdd、childReduce 并触发父组件方法add、reduce
以上父组件穿值给子组件,子组件触发事件给父组件搞定,总结一下,父组件v-bind:count="count"穿值给子组件,子组件props:接收(props接收的父组件的值相当于子组件内定义data只不过不能直接修改疑问可搜索子组件为什么不能直接修改父组件值),继续,子组件定义方法并执行emit指令定义指令名字“childAdd、childReduce”,当子组件触发add、reduce方法触发emit并发指令给父组件,父组件v-on:childAdd(简写@childAdd) 监听并触发父组件方法,如下图
QQ20181224-160938@2x.png

接下来我们再用$on,监听指令不在dom内,直接写在js中 上图

QQ20181224-165518@2x.png

标注忽略了 child组件ref="addChild" 和普通获取操作dom一样

我们再看看console this.refs


image.png

这样我们就可以做到和dom内监听子组件一样的效果

当然这样写感觉恶心了不少,不过我是为了引出父组件直接操作子组件方法做个引子

给父组件加一个功能可以改变子组件显示值(还是那句话不管合不合理我们只看怎么实现)
image.png
同样还是用ref来获取子组件,这样可以直接触发子组件方法。

ok父子组件通信算是说完了,
预告:明天继续 兄弟组件通信

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 父组件给子组件传递数据 在组件中动态绑定(如果只想传递一个静态的prop ,可以不绑定,如下)要传递的数据 在子组...
    苦瓜_6阅读 23,286评论 0 0
  • 1.父组件传递数据给子组件 父组件数据如何传递给子组件呢?可以通过props属性来实现 父组件: //这里必须要用...
    温柔蟹子小龙女阅读 1,267评论 0 0
  • vue设计模式是数据流在组件之间是单向流动,组件内部是数据双向绑定, 父组件一般会通过props绑定数据传递给子组...
    杰出噜阅读 1,748评论 0 0
  • Vue父子组件通信 Web中的组件其实就是页面组成的一部分。 那组件之间的通信该怎么办?这是个重点(必须掌握),同...
    程序员之路阅读 3,808评论 0 2
  • 《局外人》是一本很好读的小说,篇幅短,情节简单,没有任何晦涩的表达,也无冗长的句段,只消一个午后即可翻阅完毕。 ...
    翹囍阅读 5,145评论 4 10