当前位置: 首页 > news >正文

Vue.js之组件(component)

 

从结构上看,组件之于实例,就好比轮子之于汽车。从属性和方法来看,组件有实例的大部分方法,如果Vue实例是孙悟空,组件就好比实例的一个毫毛,变化多端却为Vue实例所用。

目录:

组件的注册

is的作用

event,props,solts

动态组件

 

组件的注册(差不多抄官网)

有两种方式注册Vue组件:全局注册和局部注册,就好像欧元和英镑的区别,前者可以在各Vue实例中使用,后者只能在注册他的Vue实例或者父组件中使用。如果在组件中使用组件,就形成了组件的嵌套,如果组件里嵌套的组件是自己,就形成组件的递归。

总之:组件由两部分构成,

  一部分是需要自定义的tag-name,以下面为例,tagname是<my-component>,

  另一部分是options对象,里面包含了该组件的模板,方法,props,data等细节

全局注册:

Vue.component('my-component', {
  // 选项
})

局部注册:

var options={template:....}//组件的选项对象
new Vue({
el:'#man',
components:{
'my-component',options
}
});

is的作用

将组件挂载到已存在元素上时,遇到某些元素,会发生尴尬的事情:如<ul><ol><table> ,<select>这些标签,他们只认识<li>,<tr>,<option>这些标签,想把<my-component>插进去,人家不认识,这时就要is发挥作用了:

 

<ul>
<my-component></my-component>
</ul>

上面这样浏览器不给面子,需要变成这样: 

<ul>
<li is='my-component'></li>
</ul>

 当使用单文件组件时,就当上面是废话,也就是说<ul>中可以有组件了。(见这里)动态组件也有一个is属性,用来切换不同的组件,我们下面再说

 

props,events,slots

下面说说我觉得组件中的三个重点:propeventsslots。当我看到组件这部分时,之前没有接触过mvvm类型的框架,所以到这里感觉是极限了,这时,找到熟悉的事物作类比是一个好办法。如果把组件比成一间房子,上面的三只就是房子用来和外界通信的门窗。

在开始之前:应该记住一张图和一句话:

这张图对应的意思是:父组件通过 props 向下传递数据给子组件,子组件通过 events 给父组件发送消息。

1.自定义事件

想象一个场景。2048游戏里面,两个子组件中的数据合并了,产生一个addscore事件,需要通知父组件容器,这时,就可以用自定义事件了:

//父组件中

<father v-on:addscore="addscore"></father>
function addscore(){
this.score++;
}

//子组件中

this.$emit('addscore');

注意 ,在子组件中,子组件只负责触发这个自定义事件,通过$emit方法来触发,而在父组件中则定义事件触发之后的回调函数。好吧,其实vue官方教程的两个button触发add事件看起来是个更好的例子。。。。

2.props

再想象一个场景,2048中,父组件中的data中有一个定义了所有card的值的数组,现在要把这些值传到每一个card中,这时就用到props:

//爹组件

//在模板中,为子组件写一个自定义属性card,用来把cardNum传给子组件
<children :card="card_num"></children>

data:{card_num:8}

//****子组件中******

<div>{{card}}</div>

在组件的props字段中加入子组件的自定义属性
{
data:....
computed:....
props:{card:null}
}

其实理解起来很简单,vue的子组件对父组件来说被包装成为一个类似于<children></children>的标签,正如你在父组件中看到的那样。但是vue为我们留了一个props属性,就像上帝给人类五官用来感受世界一样,组件用props和自定义事件用来和父组件传递消息。

 

 

这也是一种封装,对父组件隐藏了内部的实现,只留下了props作为接口。接口在现实世界也很常见,比如显示器对主机的接口,你不必管显示器的内部实现,只要知道接上主机就能显示信息了就行。

3.slots

如果你了解过es6的模板字符串,那么理解起这个来将毫不费劲。我当时可是被这个slots搞得稀里糊涂的。。。当然当时不知道模板引擎,也不知道模板字符串。slots就是在组件中插入内容的机制。

在<p>等原生的标签里插入内容很简单,就直接写就行了(说了一句废话),而在组件中写入内容就有讲究了,比如<children>我还是个宝宝</children>,由于组件的模板一般是一堆原生标签一起构成的,那么上面这么写,究竟应该把内容插到那个元素中就成了问题。于是就有了<slot></slot>元素。

solt元素就是用来接受父组件放到子组件的内容的。不知为什么,到了这里我会想起学习机上插游戏卡的例子。。。举个例子:

//学习机组件
<div>
  <h2>小霸王学习机</h2>
  <slot>
    内置魂斗罗
  </slot>
</div>

  

//小朋友父组件

<div>
  <h1>我要玩游戏</h1>
  <xue-xi-ji>
    <p>插入双截龙游戏卡</p>//插入的内容
  </xue-xi-ji>
</div>

 最后得到的就是小学生愉快的玩双截龙了

<div>
  <h1>我要玩游戏</h1>
-------------------------------组件区域——————————————
  <h2>小霸王学习机</h2>
————————slot区域——————————————
    <p>插入双截龙游戏卡</p>//插入的内容
</div>

当父组件不往子组件标签中添加任何字符时,子组件会显示默认内容,如果有的话,也就是说魂斗罗。。

 

具名slot是说组件中有大于一个地方需要插值时,需要给slot取个名字。就像电脑的接口,有usb的,也有接投影的HDMI接口,为的是将多条内容放到正确的地方。

 我们知道,在组件内部,this指向组件自己,那么组件的slot内容可以通过this.$slots获得被插入的vnode节点。

动态组件

动态组件就是为了适应页面的局部刷新而生的,举个我用过的例子:todolist在线小demo

 

当我点击写日记button时,页面会变成一个markdown编辑器界面。这就是动态组件。实现的代码如下

  <keep-alive>
  <compoment v-bind:is='currentview'></compoment>
  </keep-alive>

  

methods: {
            toggleview: function() {
                this.currentview = (this.currentview == 'todolist') ? 'write' : 'todolist';
            }
        },

当我点击上面的button时,触发toggleview方法,导致is绑定的组件名发生变化,如果当前是write组件,那么变成todolist组件。

那么<keep-alive>标签又有什么用呢?标签字面意思是活着。。就是当todolist组件由显示变成隐藏时,组件的数据状态会被保存下来而不是被完全destory,当组件由隐藏再次变为显示时,当前的状态得以保留。比方你在write组件中写一段md文档,然后切换回todolist组件,如果没有keep-alive组件,再切换回write组件时,之前编辑的东西就会丢失。

 

  

转载于:https://www.cnblogs.com/imgss/p/6184328.html

相关文章:

  • jforum架构和主要配置文件的说明
  • Axure--一个很好的原型设计软件
  • flex程序初始化顺序
  • [C/C++] C/C++中数字与字符串之间的转换
  • flex datagrid 设置超链接
  • 攻克vue路由
  • 如何设置光驱启动
  • 三个臭皮匠顶个诸葛亮的随机森林算法!
  • String类的几个方法
  • 捡石子---贪心算法(huffman)
  • HTML特殊字符编码对照表
  • Flex中ArrayCollection的复制(克隆)
  • mysql表的复制
  • 作用域与作用域链
  • 批量修改SQL数据库字段值
  • JS 中的深拷贝与浅拷贝
  • 【comparator, comparable】小总结
  • 【Redis学习笔记】2018-06-28 redis命令源码学习1
  • 30秒的PHP代码片段(1)数组 - Array
  • nginx(二):进阶配置介绍--rewrite用法,压缩,https虚拟主机等
  • Spark学习笔记之相关记录
  • 第十八天-企业应用架构模式-基本模式
  • 设计模式 开闭原则
  • 实现菜单下拉伸展折叠效果demo
  • 正则表达式
  • const的用法,特别是用在函数前面与后面的区别
  • Redis4.x新特性 -- 萌萌的MEMORY DOCTOR
  • 教程:使用iPhone相机和openCV来完成3D重建(第一部分) ...
  • ​第20课 在Android Native开发中加入新的C++类
  • ​虚拟化系列介绍(十)
  • !!Dom4j 学习笔记
  • # 安徽锐锋科技IDMS系统简介
  • #etcd#安装时出错
  • (C语言)strcpy与strcpy详解,与模拟实现
  • (Redis使用系列) SpringBoot 中对应2.0.x版本的Redis配置 一
  • (二)fiber的基本认识
  • (附源码)python旅游推荐系统 毕业设计 250623
  • (附源码)基于ssm的模具配件账单管理系统 毕业设计 081848
  • (附源码)计算机毕业设计ssm-Java网名推荐系统
  • (论文阅读11/100)Fast R-CNN
  • (免费领源码)Java#ssm#MySQL 创意商城03663-计算机毕业设计项目选题推荐
  • (转)C#开发微信门户及应用(1)--开始使用微信接口
  • (转)JVM内存分配 -Xms128m -Xmx512m -XX:PermSize=128m -XX:MaxPermSize=512m
  • (转)大型网站的系统架构
  • .net Application的目录
  • .net 获取url的方法
  • .net 提取注释生成API文档 帮助文档
  • .NET/C# 中设置当发生某个特定异常时进入断点(不借助 Visual Studio 的纯代码实现)
  • .NET版Word处理控件Aspose.words功能演示:在ASP.NET MVC中创建MS Word编辑器
  • .NET开发者必备的11款免费工具
  • .stream().map与.stream().flatMap的使用
  • .vimrc php,修改home目录下的.vimrc文件,vim配置php高亮显示
  • [ NOI 2001 ] 食物链
  • [ 云计算 | AWS 实践 ] 基于 Amazon S3 协议搭建个人云存储服务
  • [20150629]简单的加密连接.txt