vue组件之间的通信方式

父子组件通信

绝大部分vue本身提送的通信方式,都是父子组件通信

prop

最常见的组件通信方式之一,由父组件传递到子组件

event

最常见的组件通信方式之一,当子组件发生了某些事,可以通过event通知父组件。

style和class

示例

父组件:

<template>
  <div id="app">
    <HelloWord
      style="color:red"
      class="hello"
      msg="Welcome to Your Vue.js App"
     />
  </div>
</template>

<script>
import HelloWord from './components/HelloWord.vue';

export default {
  components: {
    HelloWord,
  },
};
</script>

子组件:

<template>
  <div class="word" style="text-align:center">
    <h1>{{msg}}</h1>
  </div>
</template>

<script>
export default{
  name: "Helloward",
  props: {
   msg: String,
  },
};
</script>

attributed

如果父组件传递了一些属性到子组件,但子组件并没有声明这些属性,则他们称之为attributed,这些属性会直接附着在子组件的根元素上

不包括style和class,他们会被特殊处理

父组件:

<template>
  <div id="app">
    <!-- 除msg外,其他均为attribute -->
    <HelloWorld
      data-a = "1"
      data-b = "2"
      msg="Welcome to Your Vue.js App"
     />
    </div>
</template>

<script>
import HelloWorld form './components/HelloWorld.vue';

export default {
  components: {
    HelloWorld,
  },
},
</script>

子组件:

<template>
  <div>
    <h1>{{msg}}</h1>
  </div>
</template>

<script>
export default {
  name: "HelloWorld",
  props: 
    msg: String,
  },
  created() {
    console.log(this.$attrs); //得到data-a="1", data-b="2"
  },
};
</script>

渲染结果:

<div id="app">
  <div data-a="1" data-b="2">
    <h1>Welcome to Your Vue.js App</h1>
  </div>
</div>

子组件可以通过inheritAttrs: false配置,禁止将attribute附着在子组件的根元素上,但不影响通过$attrs获取

natvie修饰符

在注册事件时,父组件可以通过native修饰符,将事件注册到子组件的根元素上

父组件:

<tenplate>
  <div id="app">
    <HelloWorld @click.native="handleClick" />
  </div>
</template>

<script>
import HelloWorld from "./components/HelloWorld.vue";

export default {
  components: {
    HelloWorld,
  },
  methods: {
    handleClick() {
      console.log(1);
    },
  },
};
</script>

子组件:

<template>
  <div>
    <h1>Hello World</h1>
  </div>
</template>

渲染效果:

<div id="app">
  <!-- 点击div,会输出1-->
  <div>
    <h1>Hello World</h1>
  </div>
<div>

$listeners

子组件可以通过$listeners获取父组件传递过来的所有事件处理函数

v-model

sync修饰符

和v-model的作用类似,用于双向绑定,不同点在于v-model只能针对一个数据进行双向绑定,而sync修饰符没有限制

子组件:

<template>
  <div>
    <p>
       <button @click="$emit( `update: numl`, numl - 1)">-</button>
        {{numl}}
       <button @click="$emit( `update: numl`, numl + 1)">+</button>
    </p>
    <p>
       <button @click="$emit(`update:num2`, num2 - 1)">-</button>
       {{num2}}
       <button @click="$emit(`update:num2`, num2 + 1)">+</button>
    </p>
 </div>
</template>

<script>
export default {
  props: ["num1", "num2"],
};
</script>

$parent和$children

在组件内部,可以通过$parent和$children属性,分别得到当前组件的父组件和子组件实例

$slots和$scopedSlots

ref

父组件可以通过ref获取到子组件的实例

跨组件通信

provide和inject

示例

//父级组件提供'foo'
var provider = {
  provide: {
    foo: 'bar'
  },
  //...
}

//子组件注入'foo'
var Child = {
  inject: ['foo'],
  created() {
    console.log(this.foo) // => "bar"
  }
  //...
}

详见:https://cn.vuejs.org/v2/api/?#provide-inject

router

如果一个组件改变了地址栏,所有监听地址栏的组件都会作出相应反应

最常见的场景就是通过点击router-link组件改变了地址,router-view组件就渲染其他内容

vuex

适用于大型项目的数据仓库

store模式

适用于中小型项目的数据仓库

//store.js
const store = {
 loginUser: ...,
 setting: ...,
}

//compA
const compA = {
  data(){
    return {
      loginUser: store.loginUser
    }
   }
}

//compB
const compB = {
  data() {
    setting: store.setting,
    loginUser: store.loginUser
   
  }
 }
}

eventbus

组将通知事件总线发生了某事件,事件总线通知其他监听该是爱你的所有组件运行某个函数

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值