父子组件通信
绝大部分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
组将通知事件总线发生了某事件,事件总线通知其他监听该是爱你的所有组件运行某个函数