最近使用Vue之后一直用iView作为UI库。每次看到整齐划一的样式都不免概叹开源社区真好,让我省了多少时间呀。虽然产品某些奇葩的要求不能通过这些UI库实现,但是基于这些UI库的二次开发难度也不大,毕竟从1到2远比从0到1难。感谢无私奉献的开发者们。
以下记录自己Vue组件的实践过程。此篇不包括打包编译。
基础:组件之间通信
1. Vue的父子组件通信一般用props就能传过去。但是仅限于父传到子组件。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| // 父组件 <template> <div> <hello-form :name="name"></hello-form> </div> </template> <script> export default { data () { return { name: 'child-component' } } } </script>
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| // 子组件 <template> <div>{{ newStr }}</div> </template> <script> const str = 'This is '; export default { data () { return {
} }, props: ['name'], computed: { newStr: function () { return `${str}${name}` } } } </script>
|
2. 如果希望子组件的数据传到父组件,可以用emit
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| // 父组件 <template> <div> <hello-form :type="type" @onchange="getComponentData"></hello-form> </div> </template> <script> export default { data () { return { type: 'form' } }, methods: { getComponentData (data) { console.log(data); } } } </script>
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| // 子组件 <template> <div> <input type="text" v-model="name"> <button @click="getData()">确认</button> </div> </template> <script> export default { data () { return { name: } }, methods: { getData () { this.$emit('onchange', this.name); } } } </script>
|
当点击子组件的确认按钮时,getData方法触发了这个组件的onchange事件。而name就作为这个事件的传递参数传递到了getComponentData方法中,父组件就得到了子组件的name。
3. 如果希望两个没有关联的子组件之间进行数据通信,可以用Vuex(在此不展开讲),或者简单点,用一个全局的bus
1 2 3
| import Vue from 'vue' export var bus = new Vue();
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| // child_1 <template> <div> <span>子组件1</span> <input v-model="emitData"></input> </div> </el-form-item> </template> <script> import { bus } from '../bus.js' export default { data () { return { emitData: '', } }, watch: { emitData: function (newVal, oldVal) { bus.$emit('emitData', this.emitData); } } } </script>
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| // child_2 <template> <div> <span>子组件1</span> <input v-model="emitData"></input> </div> </template> <script type="text/javascript"> import { bus } from '../bus.js' export default { data () { return { emitData: '', } }, props: [], mounted: function () { bus.$on('emitData', (text) => this.emitData = text); } } </script>
|
当child_1的emitData改变时,child_2中的emitData也会跟着改变。通过bus.$emit和bus.$on就完成了两个不相关的组件之间的数据传递。子组件与父组件之间也可以以这种方式通信。
OK!准备工作完成了,可以开始写组件了。