组件(Component)是 Vue.js 最强大的功能之一。组件可以扩展 HTML 元素,封装可重用的代码。在较高层面上,组件是自定义元素,Vue.js 的编译器为它添加特殊功能。在有些情况下,组件也可以是原生 HTML 元素的形式,以 is 特性扩展。
本篇资料是小编参考官方文档的基础上整理的一篇更加细致的说明,代码更多更全,非常适合新手学习。
官方文档:
组件——杂项详细介绍如下所示:
①组件和v-for
简单来说,就是组件被多次复用;
例如表格里的某一行,又例如电商的商品橱窗展示(单个橱窗),都可以成为可以被复用的组件;
只要编写其中一个作为组件,然后使数据来源成为一个数组(或对象,但个人觉得最好是数组),通过v-for的遍历,组件的每个实例,都可以获取这个数组中的一项,从而生成全部的组件。
而数据传输,由于复用,所以需要使用props,将遍历结果i,和props绑定的数据绑定起来,绑定方法同普通的形式,在模板中绑定。
示例代码:
<div> <button @click="toknowchildren">点击让子组件显示</button> <table> <tr> <td>索引</td> <td>ID</td> <td>说明</td> </tr> <tr is="the-tr" v-for="i in items" v-bind:id="i" :index="$index"></tr> </table> </div> <script> var vm = new Vue({ el: '#app', data: { items: [1, 2, 3, 4] }, methods: { toknowchildren: function () { //切换组件显示 console.log(this.$children); } }, components: { theTr: { //第一个子组件 template: "<tr>" + "<td>{{index}}</td>" + "<td>{{id}}</td>" + "<td>这里是子组件</td>" + "</tr>", props: ['id','index'] } } }); </script>
说明:
【1】记得将要传递的数据放在props里!
【2】将index和索引$index绑定起来,因为索引从0开始,因此索引所在列是从0开始;id是和遍历items的i绑定在一起的,因此id从1开始。
【3】可以在父组件中,通过this.$children来获取子组件(但是比较麻烦,特别是组件多的时候,比较难定位);
②编写可复用的组件:
简单来说,一次性组件(只用在这里,不会被复用的)跟其他组件紧密耦合是可以的,但是,可复用的组件应当定义一个清晰的公开接口。(不然别人怎么用?)
可复用的组件,基本都是要和外部交互的,而一个组件和外部公开的交互接口有:
【1】props:允许外部环境数据传递给组件;
【2】事件:允许组件触发外部环境的action,就是说通过在挂载点添加v-on指令,让子组件的events触发时,同时触发父组件的methods;
【3】slot:分发,允许将父组件的内容插入到子组件的视图结构中。
如代码:
<div> <p>这是第一个父组件</p> <widget :the-value="test" @some="todo"> <span>【第一个父组件插入的内容】</span> </widget> </div> <div> <p>这是第二个父组件</p> <widget @some="todo"> </widget> </div> <script> Vue.component("widget", { template: "<button @click='dosomething'><slot></slot>这是一个复用的组件,点击他{{theValue}}</button>", methods: { dosomething: function () { this.$emit("some"); } }, events: { some: function () { console.log("widget click"); } }, props: ['theValue'] }) var vm = new Vue({ el: '#app', data: { test: "test" }, methods: { todo: function () { console.log("这是第一个父组件") } } }); var vm_other = new Vue({ el: '#app2', data: { name: "first" }, methods: { todo: function () { console.log("这是另外一个父组件") } } }); </script>
说明:
【1】在第一个父组件中使用了分发slot,使用了props来传递值(将test的值传到子组件的theValue之中);
【2】在两个组件中,子组件在点击后,调用methods里的dosomething方法,然后执行了events里的some事件。又通过挂载点的@some=”todo”,将子组件的some事件和父组件的todo方法绑定在一起。
因此,点击子组件后,最终会执行父组件的todo方法。
【3】更改父组件中,被传递到子组件的值,会同步更改子组件的值(即二者会数据绑定);
③异步组件:
按照我的理解,简单来说,一个大型应用,他有多个组件,但有些组件无需立即加载,因此被分拆成多个组件(比如说需要立即加载的,不需要立即加载的);
需要立即加载的,显然放在同一个文件中比较好(或者同一批一起请求);
而不需要立即加载的,可以放在其他文件中,但需要的时候,再ajax向服务器请求;
这些后续请求的呢,就是异步组件;
做到这种异步功能的,就是Vue.js的功能——允许将组件定义为一个工厂函数,动态解析组件的定义。
可以配合webpack使用。
至于如何具体使用,我还不太明白,教程中写的不清,先搁置等需要的时候来研究。
链接:
④资源命名的约定:
简单来说,html标签(比如div和DIV是一样的)和特性(比如要写成v-on这样的指令而不是vOn)是不区分大小写的。