zoukankan      html  css  js  c++  java
  • vue组件间通信六种方式

    组件是 vue.js最强大的功能之一,而组件实例的作用域是相互独立的,这就意味着不同组件之间的数据无法相互引用。一般来说,组件可以有以下几种关系:

    如上图所示,A 和 B、B 和 C、B 和 D 都是父子关系,C 和 D 是兄弟关系,A 和 C 是隔代关系(可能隔多代)。

    针对不同的使用场景,如何选择行之有效的通信方式?这是我们所要探讨的主题。本文总结了vue组件间通信的几种方式,

    如props、 $emit/ $on、vuex、 $parent / $children$attrs/ $listeners和provide/inject,以通俗易懂的实例讲述这其中的差别及使用场

    1.父组件向子组件传值

    接下来我们通过一个例子,说明父组件如何向子组件传递值:在子组件Users.vue中如何获取父组件App.vue中的数据 users:["Henry","Bucky","Emily"]

    //App.vue父组件

    <template>

    <div id="app">

    <users v-bind:users="users"></users>//前者自定义名称便于子组件调用,后者要传递数据名

    </div>

    </template>

    <script>

    import Users from "./components/Users"

    export default {

    name: 'App',

    data(){

    return{

    users:["Henry","Bucky","Emily"]

    }

    },

    components:{

    "users":Users

    }

    }

    //users子组件

    <template>

    <div class="hello">

    <ul>

    <li v-for="user in users">{{user}}</li>//遍历传递过来的值,然后呈现到页面

    </ul>

    </div>

    </template>

    <script>

    export default {

    name: 'HelloWorld',

    props:{

    users:{ //这个就是父组件中子标签自定义名字

    type:Array,

    required:true

    }

    }

    }

    </script>

    总结:父组件通过props向下传递数据给子组件。注:组件中的数据共有三种形式:data、props、computed

    2.子组件向父组件传值(通过事件形式)

    1. // 子组件

    2. <template>

    3. <header>

    4. <h1 @click="changeTitle">{{title}}</h1>//绑定一个点击事件

    5. </header>

    6. </template>

    7. <script>

    8. export default {

    9. name: 'app-header',

    10. data() {

    11. return {

    12. title:"Vue.js Demo"

    13. }

    14. },

    15. methods:{

    16. changeTitle() {

    17. this.$emit("titleChanged","子向父组件传值");//自定义事件 传递值“子向父组件传值”

    18. }

    19. }

    20. }

    21. </script>

    1. // 父组件

    2. <template>

    3. <div id="app">

    4. <app-header v-on:titleChanged="updateTitle" ></app-header>//与子组件titleChanged自定义事件保持一致

    5. // updateTitle($event)接受传递过来的文字

    6. <h2>{{title}}</h2>

    7. </div>

    8. </template>

    9. <script>

    10. import Header from "./components/Header"

    11. export default {

    12. name: 'App',

    13. data(){

    14. return{

    15. title:"传递的是一个值"

    16. }

    17. },

    18. methods:{

    19. updateTitle(e){ //声明这个函数

    20. this.title = e;

    21. }

    22. },

    23. components:{

    24. "app-header":Header,

    25. }

    26. }

    27. </script>

    方法二、 $emit $on

    这种方法通过一个空的Vue实例作为中央事件总线(事件中心),用它来触发事件和监听事件,巧妙而轻量地实现了任何组件间的通信,包括父子、兄弟、跨级。当我们的项目比较大时,可以选择更好的状态管理解决方案vuex。

  • 相关阅读:
    [转]SDRAM/DDR/DDR2/DDR3/DDR4
    Altera cyclone系列altlvds调试
    [转]关于Altera LVDS 经验分享
    [转]FPGA的GTP高速串行接口数据收发
    [转]ISE、vivado、QuartusII调用notepad++、UE汇总(整理)
    [转]vivado管脚分配:PACKAGE_PIN or LOC
    [转]如何使用WinDriver为PCIe采集卡装驱动
    【Docker系列教程之六】Docker的前世今生
    【Docker系列教程之五】如何构建Dockerfile
    【Docker系列教程之四】Dockerfile入门
  • 原文地址:https://www.cnblogs.com/guidan/p/11213533.html
Copyright © 2011-2022 走看看