vue组件常用的通讯方法

欢迎加我技术交流QQ群 :811956471

前言:组件是vue里面非常核心的东西,需要深入去了解和使用,该文章将不断更新、总结、归纳有关vue组件方面的知识点。以下梳理内容全部针对于 cli脚手架去整理,个人不喜欢用cdn方式去用vue框架。组件化是现在前端框架中一个非常重要的思想元素,将页面内容进行拆分之后,可独立维护,可复用性大大提高。

一、父组件向子组件传值:props

//在子组件中:
<template>
    <div id="TopBar">
        {{title_msg}}
    </div>
</template>
//接收
props:{
    title_msg:{
        type:String,
    default:"项目名称"
    }
 },

//在父组件中:===========================================================================
<template>
    <div id="app">
       <TopBar title_msg="新闻"></TopBar>
    </div>
</template>

二、子组件向父组件传值:$emit

这里介绍的方法是:在子组件定义一个自定义事件,进行传递。

//在子组件中:
<template>
    <div id="TopBar">
        <van-nav-bar :title="title_msg" />
        <button @click="val_to_parent">向父组件传值</button>
    </div>
</template>
//此处不要用箭头函数
methods: {
        val_to_parent: function() {
        this.$emit("val", "我是来自子组件的传值")
        }
    }
//在父组件中=============================================
<template>
    <div id="app">
        <TopBar :title_msg="title" @val="receive_val"></TopBar>
    </div>
</template>
methods:{
    receive_val:(val)=>console.log(val)
}

三、父组件调用子组件方法:ref

eg:

//父组件
<template>
    <base-alert ref="baseAlert"></base-alert>
    <div @click="clickMe">click me</div>
</template>

<script>
import BaseAlert from '@/components/BaseAlert'

export default {
    components: {
        BaseAlert
    },
    methods: {
        clickMe () {
          //popUp 方法在子组件中定义
          this.$refs.baseAlert.popUp()
        }
    }
}
</script>

//子组件
<template>
  <div>
    <div>child component</div>
  </div>
</template>
<script>
export default {
  data () {
    return { }
  },
  methods: {
    //定义好popUp方法
    popUp () {
      alert(11)
    }
  }
}
</script>
popUp 是函数的名字:里面可以传递参数哦
 this.$refs.baseAlert.popUp(666)
 popUp(val) {
    console.log(vla)//666
  }

四、后代组件通讯,不限制组件层级:provide/inject

不推荐在应用程序代码中直接使用,因为数据追踪比较困难,不知道那一层级声明了 provide 又或是哪些层级使用了 inject 。造成比较大的维护成本

eg:


//父组件
<template>
    <div class="home">
        <aa></aa>
    </div>
</template>

<script>
    import aa from '@/components/A.vue';
    export default {
        name: 'Home',
        components: {aa},
        data() {
            return {
                str:'我是home组件'
            }
        },
        provide(){
            return{
                a:this.str,
                b:[1,2,3]
            }
        },
        //也可以这样
        // provide:{
        //  a:'1111',//这种的无法访问到vue实例
        //  b:[1,2,3]
        // }
    };
</script>


在任意后代组件中:

<template>
</template>
<script>
    export default {
        name: 'aa',
        props: ['title'],
        data() {
            return {}
        },
        inject: {
            a: {
                from: 'a', // 来源
                default: 'parentValue' // 默认值
            },
            b: {
                from: 'b', // 来源
                default: 'parentValue' // 默认值
            },
        },
        //也可以这样注入
        // inject:['a','b']
        created() {
            console.log(this.a, this.b) // this.app 下面都是响应式的,因为都是同一实例下的引用
        }
    };
</script>

五、使用vuex通讯,此为人人必会的东西,不在赘述。

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

推荐阅读更多精彩内容

  • 废话不多说直接走起 环境搭建步骤: 一.父组件向子组件传值 1.创建子组件,在src/components/文件夹...
    妄自阅读 1,151评论 0 7
  • Vue创建组件 什么是组件 什么是组件?组件的出现,就是为了拆分Vue实例的代码量的,能够让我们以不同的组件,来划...
    TyCoding阅读 606评论 0 2
  • 2 3不使用nib1、重写自定义cell的initWithStyle:withReuseableCellIdent...
    DeerRun阅读 889评论 0 0
  • 今天的主要内容就是 早饭,游戏,午饭,上课(看书),游戏,开会,晚饭,游戏,洗澡,写日记,游戏。 啊星露谷物语太好...
    伊贺废物阅读 256评论 0 0
  • 什么是女孩子该做的事情 1 以前看过一篇文章,是一位女生写的。说在宿舍水管破裂,地面上存了好多的水。宿舍里的其她女...
    菜菜AN阅读 313评论 0 0