如果希望组件相互通信或共享数据,则需要
emit
从一个组件到父组件并通过道具向下传递的事件,或使用某种状态管理模型(如Vuex),其中每个组件都可以监听存储。
看看这个代码沙盒:
https://codesandbox.io/s/8144oy7xy2
应用程序.vue
<template>
<div id="app">
<child-input @input="updateName" />
<child-output :value="name" />
</div>
</template>
<script>
import ChildInput from "@/components/ChildInput.vue";
import ChildOutput from "@/components/ChildOutput.vue";
export default {
name: "App",
components: {
ChildInput,
ChildOutput
},
data() {
return {
name: ""
};
},
methods: {
updateName(e) {
this.name = e.target.value;
}
}
};
</script>
ChildInput.vue
<template>
<input type="text" @input="changeHandler">
</template>
<script>
export default {
name: "ChildInput",
methods: {
changeHandler(e) {
this.$emit("input", e);
}
}
};
</script>
ChildOutput.vue
<template>
<p>{{ value }}</p>
</template>
<script>
export default {
name: "ChildOutput",
props: {
value: {
type: String,
default: ""
}
}
};
</script>
发生什么事?
这个
ChildInput
组件是一个文本字段,在其内部的每次更改时,都会触发一个事件(使用
this.$emit()
通过了整个比赛
向上的
).
当这场火灾发生时,
App
正在侦听更改,该更改将触发更新名称数据属性的方法。
因为
name
是一个反应性数据属性,作为
ChildOutput
组件,屏幕将重新呈现并用写入的文本进行更新。
也不是
儿童输入
也不是
儿童产出
互相了解。是父进程监听传递给它的事件,然后传递新的道具。
这种工作方式很好,也很容易理解,但我强烈建议您查看Vuex,因为当您超越琐碎的任务时,这种方法可能会变得混乱和复杂。