可行性:复合 UI
- 是否可以使用标准的 vue 工具创建基于 vue 的复合 UI(微前端)?
对的,这是可能的。您看到的几乎所有独立的 Vue 组件(vue-select、vue-slider-component甚至完整的“集合”组件,例如vuetify、bootstrap-vue或vue-material)都是使用开发的可重用(可组合)组件的示例标准的 Vue 工具。
页面转换:路由
- 我们有不止一个页面,因此我们需要一个解决方案来从一侧导航到另一侧。我们如何实现页面转换?
vue-router是完成这项工作的工具。它由核心团队开发,因此期待紧密的集成和强大的功能支持。
事件总线
- 是否可以在 VueJS 组件之间建立事件总线?
每个 Vue 实例都实现了一个事件接口。这意味着要在两个 Vue 实例或组件之间进行通信,您可以使用自定义事件。你也可以使用 Vuex(见下文)。
双向通信
- 我们如何实现组件之间的双向通信?
将数据从父组件发送到子组件的最佳方式是使用props。脚步:
- 在孩子中声明
props
(数组或对象)
- 通过 将其传递给孩子
<child :name="variableOnParent">
。
请参阅下面的演示:
Vue.component('child-comp', {
props: ['message'], // declare the props
template: '<p>At child-comp, using props in the template: {{ message }}</p>',
mounted: function () {
console.log('The props are also available in JS:', this.message);
}
})
new Vue({
el: '#app',
data: {
variableAtParent: 'DATA FROM PARENT!'
}
})
<script src="https://unpkg.com/vue@2.5.13/dist/vue.min.js"></script>
<div id="app">
<p>At Parent: {{ variableAtParent }}</p>
<child-comp :message="variableAtParent"></child-comp>
</div>
您还可以获取子组件 ( s) 的引用并在它们上调用方法。ref
Vue.component('my-comp', {
template: "#my-comp-template",
props: ['name'],
methods: {
saveMyComp() {
console.log('Saved:', this.name);
}
}
})
new Vue({
el: '#app',
data: {
people: [{name: 'Bob'}, {name: 'Nelson'}, {name: 'Zed'}]
},
methods: {
saveChild(index) {
this.$refs.myComps[index].saveMyComp();
}
}
});
<script src="https://unpkg.com/vue@2.5.13/dist/vue.min.js"></script>
<div id="app">
<div v-for="(person, index) in people">
<button @click="saveChild(index)">saveMyComp</button>
<my-comp :name="person.name" ref="myComps"></my-comp>
</div>
</div>
<template id="my-comp-template">
<span> {{ name }} </span>
</template>
要从孩子到父母进行交流,您将使用事件。请参阅下面的演示。还有几个修饰符使这项任务更容易。
var parent = {
template: '<div><child :content.sync="localContent"></child><br>At parent: {{ localContent }}</div>',
props: ['content'],
data() {
return {
localContent: this.content
}
}
};
var child = {
template: '<div>At child: {{ content.value }}<button @click="change">change me</button></div>',
props: ['content'],
methods: {
change() {
this.$emit('update:content', {value: "Value changed !"})
}
}
};
Vue.component('child', child);
Vue.component('parent', parent);
new Vue({
el: '#app'
});
<script src="https://unpkg.com/vue@2.5.13/dist/vue.js"></script>
<div id="app">
<parent :content="{value:'hello parent'}"></parent>
</div>
Vuex
但是,不可避免的是,随着应用程序的增长,您将不得不使用更具可扩展性的方法。在这种情况下, Vuex是事实上的解决方案。粗略地说,当使用 Vuex 时,您不必将状态从父级传递到子级:所有这些都将从 Vuex 存储中获取它(某种“全局”反应变量)。这大大简化了应用程序的管理,值得一帖。
最后一点:如您所见,Vue 的一大优势是您可以轻松地原型化和测试功能。没有构建步骤,对原始 JS 的抽象很少。与其他框架相比,我想说这是一个重要的好处。