版权声明:出处http://blog.csdn.net/qq20004604

 

目录(?)[+]

 

本篇资料来于官方文档:

http://cn.vuejs.org/guide/components.html#u6742_u9879

本文是在官方文档的基础上,更加细致的说明,代码更多更全。

简单来说,更适合新手阅读

(三十)组件——杂项

①组件和v-for

简单来说,就是组件被多次复用;

例如表格里的某一行,又例如电商的商品橱窗展示(单个橱窗),都可以成为可以被复用的组件;

只要编写其中一个作为组件,然后使数据来源成为一个数组(或对象,但个人觉得最好是数组),通过v-for的遍历,组件的每个实例,都可以获取这个数组中的一项,从而生成全部的组件。

而数据传输,由于复用,所以需要使用props,将遍历结果i,和props绑定的数据绑定起来,绑定方法同普通的形式,在模板中绑定。

示例代码:

  1. <div id="app">
  2. <button @click="toknowchildren">点击让子组件显示</button>
  3. <table>
  4. <tr>
  5. <td>索引</td>
  6. <td>ID</td>
  7. <td>说明</td>
  8. </tr>
  9. <tr is="the-tr" v-for="i in items" v-bind:id="i" :index="$index"></tr>
  10. </table>
  11. </div>
  12. <script>
  13. var vm = new Vue({
  14. el: '#app',
  15. data: {
  16. items: [1, 2, 3, 4]
  17. },
  18. methods: {
  19. toknowchildren: function () {   //切换组件显示
  20. console.log(this.$children);
  21. }
  22. },
  23. components: {
  24. theTr: { //第一个子组件
  25. template: "<tr>" +
  26. "<td>{{index}}</td>" +
  27. "<td>{{id}}</td>" +
  28. "<td>这里是子组件</td>" +
  29. "</tr>",
  30. props: ['id','index']
  31. }
  32. }
  33. });
  34. </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:分发,允许将父组件的内容插入到子组件的视图结构中。

如代码:

  1. <div id="app">
  2. <p>这是第一个父组件</p>
  3. <widget
  4. :the-value="test"
  5. @some="todo">
  6. <span>【第一个父组件插入的内容】</span>
  7. </widget>
  8. </div>
  9. <div id="app2">
  10. <p>这是第二个父组件</p>
  11. <widget @some="todo">
  12. </widget>
  13. </div>
  14. <script>
  15. Vue.component("widget", {
  16. template: "<button @click='dosomething'><slot></slot>这是一个复用的组件,点击他{{theValue}}</button>",
  17. methods: {
  18. dosomething: function () {
  19. this.$emit("some");
  20. }
  21. },
  22. events: {
  23. some: function () {
  24. console.log("widget click");
  25. }
  26. },
  27. props: ['theValue']
  28. })
  29. var vm = new Vue({
  30. el: '#app',
  31. data: {
  32. test: "test"
  33. },
  34. methods: {
  35. todo: function () {
  36. console.log("这是第一个父组件")
  37. }
  38. }
  39. });
  40. var vm_other = new Vue({
  41. el: '#app2',
  42. data: {
  43. name: "first"
  44. },
  45. methods: {
  46. todo: function () {
  47. console.log("这是另外一个父组件")
  48. }
  49. }
  50. });
  51. </script>

说明:

【1】在第一个父组件中使用了分发slot,使用了props来传递值(将test的值传到子组件的theValue之中);

【2】在两个组件中,子组件在点击后,调用methods里的dosomething方法,然后执行了events里的some事件。又通过挂载点的@some=”todo”,将子组件的some事件和父组件的todo方法绑定在一起。

因此,点击子组件后,最终会执行父组件的todo方法。

【3】更改父组件中,被传递到子组件的值,会同步更改子组件的值(即二者会数据绑定);

③异步组件:

按照我的理解,简单来说,一个大型应用,他有多个组件,但有些组件无需立即加载,因此被分拆成多个组件(比如说需要立即加载的,不需要立即加载的);

需要立即加载的,显然放在同一个文件中比较好(或者同一批一起请求);

而不需要立即加载的,可以放在其他文件中,但需要的时候,再ajax向服务器请求;

这些后续请求的呢,就是异步组件;

做到这种异步功能的,就是Vue.js的功能——允许将组件定义为一个工厂函数,动态解析组件的定义。

可以配合webpack使用。

至于如何具体使用,我还不太明白,教程中写的不清,先搁置等需要的时候来研究。

链接:

http://cn.vuejs.org/guide/components.html#u5F02_u6B65_u7EC4_u4EF6

④资源命名的约定:

简单来说,html标签(比如div和DIV是一样的)和特性(比如要写成v-on这样的指令而不是vOn)是不区分大小写的。

而资源名往往是写成驼峰式(比如camelCase驼峰式),或者单词首字母都大写的形式(比如PascalCase,我不知道该怎么称呼这个,不过这样写很少的说)。

Vue.component("myTemplate", {
    //......略
})

Vue.js可以自动识别这个并转换,

<my-template></my-template>

以上那个模板可以自动替换这个标签。

⑤递归组件:

简单来说,递归组件就是组件在自己里内嵌自己的模板。

组件想要递归,需要name属性,而Vue.component自带name属性。

大概样子是这样的,

  1. <div id="app">
  2. <my-template></my-template>
  3. </div>
  4. <script>
  5. Vue.component("myTemplate", {
  6. template: "<p><my-template></my-template></p>"
  7. })

这种是无限递归,肯定是不行的。因此,需要控制他递归的层数,例如通过数据来控制递归,当数据为空时,则停止递归。

示例代码如下:

  1. <ul id="app">
  2. <li>
  3. {{b}}
  4. </li>
  5. <my-template v-if="a" :a="a.a" :b="a.b"></my-template>
  6. </ul>
  7. <script>
  8. Vue.component("myTemplate", {
  9. template: '<ul><li>{{b}}</li><my-template v-if="a" :a="a.a" :b="a.b"></my-template></ul>',
  10. props: ["a", "b"]
  11. })
  12. var data = {
  13. a: {
  14. a: {
  15. a: 0,
  16. b: 3
  17. },
  18. b: 2
  19. },
  20. b: 1
  21. }
  22. var vm = new Vue({
  23. el: '#app',
  24. data: data,
  25. methods: {
  26. todo: function () {
  27. this.test += "!";
  28. console.log(this.test);
  29. }
  30. }
  31. });
  32. </script>

说明:

【1】向下传递时,通过props传递a的值和b的值,其中a的值作为递归后组件的a和b的值的数据来源;

然后判断传递到递归后的组件的a的值是否存在,如果存在则继续递归;

如果a的值不存在,则停止递归。

⑥片断实例:

简单来说,所谓片断实例,就是组件的模板不是处于一个根节点之下:

片断实例代码:

  1. Vue.component("myTemplate", {
  2. template: '<div>1</div>' +
  3. '<div>2</div>',
  4. })

非片断实例:

  1. Vue.component("myTemplate", {
  2. template: '<div>' +
  3. '<div>1</div>' +
  4. '<div>2</div>' +
  5. '</div>',
  6. })

片断实例的以下特性被忽略:

【1】组件元素上的非流程控制指令(例如写在挂载点上的,由父组件控制的v-show指令之类,但注意,v-if属于流程控制指令);

【2】非props特性(注意,props不会被忽略,另外props是写在挂载点上的);

【3】过渡(就是transition这个属性,将被忽略);

更多的参照官方文档:

http://cn.vuejs.org/guide/components.html#u7247_u65AD_u5B9E_u4F8B

⑦内联模板

参照:http://cn.vuejs.org/guide/components.html#u5185_u8054_u6A21_u677F

反正我试了下失败了,google也没搜到相关的内容,┑( ̄Д  ̄)┍

————————组件的基本知识到这里结束————————————

Vuejs——(13)组件——杂项的更多相关文章

  1. vuejs动态组件给子组件传递数据

    vuejs动态组件给子组件传递数据 通过子组件定义时候的props可以支持父组件给子组件传递数据,这些定义的props在子组件的标签中使用绑定属性即可,但是如果使用的是<component> ...

  2. vuejs递归组件

    vuejs学习--递归组件   前言 学习vue有一段时间了,最近使用vue做了一套后台管理系统,其中使用最多就是递归组件,也因为自己对官方文档的不熟悉使得自己踩了不少坑,今天写出来和大家一起分享. ...

  3. React(0.13) 组件的组合使用

    <html> <head> <title>组件的组合调用</title> <script src="build_0.13/react.m ...

  4. 基于第三方vuejs库组件做适配性个性开发

    相信大家在使用vuejs时候会用到很多的第三方库,能够找到适合自己的库并且加以使用可以大大加快进度,减少bug.但是很多时候会出现这样一个尴尬的境地: 基线的第三方组件并不能很好地满足我们自己地需求, ...

  5. vuejs开发组件分享之H5图片上传、压缩及拍照旋转的问题处理

    一.前言 三年.net开发转前端已经四个月了,前端主要用webpack+vue,由于后端转过来的,前端不够系统,希望分享下开发心得与园友一起学习. 图片的上传之前都是用的插件(ajaxupload), ...

  6. avalon2学习教程13组件使用

    avalon2最引以为豪的东西是,终于有一套强大的类Web Component的组件系统.这个组件系统媲美于React的JSX,并且能更好地控制子组件的传参. avalon自诞生以来,就一直探索如何优 ...

  7. vuejs子组件向父组件传递数据

    子组件通过$emit方法向父组件发送数据,子组件在父组件的模板中,通过自定义事件接收到数据,并通过自定义函数操作数据 <!DOCTYPE html> <html lang=" ...

  8. VueJs(8)---组件(注册组件)

    组件(注册组件) 一.介绍 组件系统是Vue.js其中一个重要的概念,它提供了一种抽象,让我们可以使用独立可复用的小组件来构建大型应用,任意类型的应用界面都可以抽象为一个组件树 那么什么是组件呢? 组 ...

  9. VueJs(9)---组件(父子通讯)

    组件(父子通讯) 一.概括 在一个组件内定义另一个组件,称之为父子组件. 但是要注意的是:1.子组件只能在父组件内部使用(写在父组件tempalte中); 2.默认情况下,子组件无法访问父组件上的数据 ...

随机推荐

  1. java面试题收集

    http://www.cnblogs.com/yhason/archive/2012/06/07/2540743.html 2,java常见面试题 http://www.cnblogs.com/yha ...

  2. mapper.xml文件,sql语句参数为list

    <insert id="insertPjCustomAttribute" parameterType="com.devops.server.model.PjCust ...

  3. 去“BAT”这样面试,拿到offer的几率是80%(转)

    一.概述面试,难还是不难?取决于面试者的底蕴(气场+技能).心态和认知及沟通技巧.面试其实可以理解为一场聊天和谈判,在这过程中有心理.思想上的碰撞和博弈.其实你只需要搞清楚一个逻辑:“面试官为什么会这 ...

  4. lastIndexOf() 找出指定元素出现的所有位置(返回的是下标数组)---lastIndexOf() 这个方法是倒叙查找,正序的是indexOf()

    var indices = []; var array = ['a', 'b', 'a', 'c', 'a', 'd']; var element = 'a'; var idx = array.las ...

  5. TensorFlow Android Camera Demo 使用android studio编译安装和解决Execution failed for task ':buildNativeBazel'报错

    可以参考官网:https://github.com/tensorflow/tensorflow/tree/master/tensorflow/examples/android#android-stud ...

  6. [leetcode]29. Divide Two Integers两整数相除

      Given two integers dividend and divisor, divide two integers without using multiplication, divisio ...

  7. python的基本用法(四)文件操作使用

    #读文件,文件必须存在才能读f=open('操作文件',encoding='utf-8')res =f.read()print(res)f.close()#写文件fw=open('操作文件',mode ...

  8. Ubuntu 18.04学习笔记

    命令行快捷键 https://blog.csdn.net/wanlhr/article/details/80926804 Ubuntu18.04使用vi命令修改文件并保存 vi /opt/teamvi ...

  9. adb pull 文件夹到电脑

    正常来讲是支持文件夹的. 但实际执行的时候发现: pull: building file list...0 files pulled. 0 files skipped. 其实出现这个提示,归根到底还是 ...

  10. centos 7 命令行模式和桌面版之间的切换

    CentOS7图形界面与命令行界面切换 在图形界面使用 ctrl+alt+F2切换到dos界面 dos界面 ctrl+alt+F2切换回图形界面 在命令上 输入 init 命令 切换到dos界面 输入 ...