摘要:使用组件全局定义组件,第一个参数是组件名,的值是组件的内容这是个待办项实例化是必须的,要把使用组件的区域交给管理局部注册组件局部注册组件全局注册往往是不够理想的。
目录
首发日期:2019-01-26
【官方的话】组件系统是 Vue 的另一个重要概念,因为它是一种抽象,允许我们使用小型、独立和通常可复用的组件构建大型应用。仔细想想,几乎任意类型的应用界面都可以抽象为一个组件树:
小菜鸟的话:定义组件就好像定义了一堆“带名字”的模板,比如说可能会有叫做“顶部菜单栏”的组件,我们可以多次复用这个“顶部菜单栏”而省去了大量重复的代码。
代码效果:
组件注册就是“定义模板”,只有注册了的组件,Vue才能够了解怎么渲染。
全局注册往往是不够理想的。比如,如果你使用一个像 webpack 这样的构建系统,全局注册所有的组件意味着即便你已经不再使用一个组件了,它仍然会被包含在你最终的构建结果中。这造成了用户下载的 JavaScript 的无谓的增加。
在这些情况下,你可以通过一个普通的 JavaScript 对象来定义组件:
上面的全局注册说了允许在组件中使用其他组件,但注意局部注册的组件要声明使用其他组件才能够嵌套其他组件。例如,如果你希望 ComponentA 在 ComponentB 中可用,则你需要这样写:
组件名可以使用类my-component-name(kebab-case (短横线分隔命名))或MyComponentName的格式(PascalCase 首字母大写命名法),使用组件的时候可以
或
,但在有些时候首字母大写命名法定义组件的是不行的,所以通常推荐使用
【当你使用首字母大写命名法来定义组件的时候,不能直接在body中直接写组件名,而要求写在template中,如下例】。
每个组件必须只有一个根元素!!
所以下面是不合法的:
如果你确实要有多个元素,那么要有一个根元素包裹它们:
组件也是一个实例,所以组件也可以定义我们之前在根实例中定义的内容:data,methods,created,components等等。
但一个组件的 data 选项必须是一个函数,因此每个实例可以维护一份被返回对象的独立的拷贝
在一些html元素中只允许某些元素的存在,例如tbody元素中要求有tr,而不可以有其他的元素(有的话会被提到外面)。下面是一个元素被提到外面的例子【而ul并没有太严格,所以我们在前面的todo-list的例子中能够演示成功】
下图可以看的出来div被提到table外面了:
这是为什么呢?目前来说,我们在页面中其实是先经过html渲染再经过vue渲染的(后面项目话后是整体渲染成功再展示的),当html渲染时,它就发现了tr里面有一个“非法元素”,所以它就把我们自定义的组件提到了table外面。
解决方案:
使用tr元素,元素里面有属性is,is的值是我们要使用的组件名
但不会在一下情况中出错:
在上面定义的组件中使用的数据都是固定的数据,通常我们都希望模板能根据我们传入的数据来显示。
(子组件的意思是当前组件的直接子组件,在目前的单个html文件为例时,你可以仅认为是当前页面的非嵌套组件。后面讲到多个组件的合作时由于多个组件之间的嵌套,就形成了组件的父子、祖孙、兄弟关系)
要给子组件传递数据主要有两个步骤
演示代码如下:
代码效果:很明显的,我们的值成功传给子组件了。
$emit()
可以有多个参数,第一个参数是触发的事件的名称,后面的参数都是随着这个事件向外抛出的参数。演示代码如下:
【小tips:上面有多重字符串的使用,普通的双引号和单引号已经不足以嵌套使用了,在外层可以使用反引号` ` `【esc下面那个键】来包裹,它也可以达到字符串包裹的效果,特别的是它支持多行字符串。】
祖孙组件传数据、兄弟组件传数据都属于非父子组件之间的传值。
使用bus传输数据的步骤:
Vue.prototype.bus = new Vue()
this.bus.$emit(change,当前组件的数据)
this.bus.$on(change,一个用于赋值的函数)
下面的代码是点击某个组件发生数据变化时,另一个组件的数据也发生变化:
【有个建议,建议写属性名的时候都使用kebab-case (短横线分隔命名) 命名,因为这个的兼容效果最好】
HTML 中的特性名是大小写不敏感的,所以浏览器会把所有大写字符解释为小写字符。如果你在props中使用了驼峰命名法,那你在定义属性的时候需要使用kebab-case (短横线分隔命名) 命名才能正确传输数据【因为短横线后面的字符可以识别成大写,从而能够匹配到】。
如果在属性中也使用驼峰命名法命名属性的时候会报这样的错:Prop "mycontent" is passed to component , but the declared prop name is "myContent". Note that HTML attributes are case-insensitive and camelCased props need to use their kebab-case equivalents when using in-DOM templates. You should probably use "my-content" instead of "myContent"
同样的,如果在组件的template属性中使用驼峰命名法的属性,那么这个限制就不存在了。
有时候需要使用第三方的组件的时候,所以会需要传输数据给这个组件来渲染。但如何限制传入的数据的类型呢?
格式:
props: {
// 数据名:数据类型
title: String,
likes: Number,
...
}
如果传入的类型不对,那么会报Invalid prop: type check failed for prop "xxx". Expected String with value "xxx", got Number with value xxx.
的错误。
如果允许多种值,可以定义一个数组:
props: {
content: [String,Number]
}
我们也可以给props中的数据设置默认值,如果使用default设置值,那么没有传某个数据时默认使用这个数据。
props: {
content: {
type:[String,Number],
default:'我的默认值'
}
}
如果使用default给数组或对象类型的数据赋默认值,那么要定义成一个函数。
如果要求某个数据必须传给子组件,那么可以为它设置required。
格式:
props: {
content: {
type: String,
required: true
}
}
如果没传,会报Missing required prop: "xxx"
的错。
如果想要更精确的校验,可以使用validator,里面是一个函数,函数的第一个参数就是传入的值,当函数内返回true时,这个值才会校验通过。
以下的代码是要求传入的字符串长度大于6位的校验:
Vue.component('child', {
props: {
content: {
type: String,
validator: function(value) {
return (value.length > 6)
}
}
}
如果验证不通过,会报Invalid prop: custom validator check failed for prop "xxx"
的错。
用下面的代码来说一个问题:
demo
上面的代码你会发现点击了按钮却没有调用函数。
而下面的按钮按了会打出child。
demo
下面的代码是使用了emit来达到同样效果的代码:
demo
元素当做不可见的包裹元素,让成组的元素能够统一被渲染出来。
元素当做不可见的包裹元素
Title
Paragraph 1
Paragraph 2
- {{ item.msg }}
插槽也可以分发多份数据。使用指定的插槽名就可以获取指定的插槽数据。
如果没有数据传过来,那么插槽可以定义一个默认的数据用来显示。
{{props.index}}
如果改变了is属性的值,那么渲染的组件就会发生变化。下面是上图的演示代码:
下面以上面的动态组件切换为例:
如果给上面的登录组件都加上一个created用来显示渲染次数的话,我们就可以看到是不是每次切换都会重新渲染。
如果加了keep-alive之后不再重复输出,那么就说明组件被缓存了。
1.在元素中使用ref属性给元素起一个有标识意义的名字。
2.this.(refs可以获取当前组件实例的所有使用了ref的元素,`this.)refs.名字`代表指定的元素。
3.然后你可以进行dom操作了。
1
refs也可以用在组件上,可以获取组件的数据(但这时候的ref获取的不是一个dom对象,而是一个vue实例对象,所以不能获取innerText这类dom属性)。
如果说前面讲的都是基础,必须要掌握的话,那么动画效果是锦上添花,可有可无(对于我这些不追求动画效果就不显得重要了),所以这里就不讲了,这里仅仅是为了显示vue能有实现动画效果的功能。
有兴趣的可以看一下官网:
vue官网动画效果直通车
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/1262.html
摘要:比如把示例中的数据在页面中用显示出来与输入框的数据绑定表单输入框有这个值,在表单输入框里使用会把表单输入框与实例的数据进行智能绑定为什么说智能,因为有些输入框的数据是属性,有些不是。目录上篇内容回顾:数据绑定表单输入框绑定单行文本输入框多行文本输入框复选框checkbox单选框radio选择框select数据绑定的修饰符.lazy.number.trim样式绑定class绑定对象语法:数组语...
摘要:如果我们作为一个后端开发者想掌握一个前端框架,是一个好选择,因为它足够的易学。是语言的下一代标准。数据方法生命周期钩子函数其他有些内容比较重要,留到后面讲定义数据定义数据定义了数据,那么就可以在管理的区域中使用的获取数据的语法来获取数据。目录 前言: iview组件库示例 element组件库示例 ...
摘要:一步,两步,三步四步五步,就这样到达了人生的巅峰传统前端生态初级不使用打包中间处理工具,手工处理图片等资源掌握以下知识点基础结构,基础样式,基础语法框架,系列插件框架,等基础插件,等其他移动端适配,浏览器兼容,浏览器调试等恭喜完成新手村修 一步,两步,三步四步五步,就这样到达了人生的巅峰~ 传统前端生态-初级 不使用打包、中间处理工具,手工处理js、css、图片等资源 掌握以下知识点:...
阅读 713·2023-04-25 19:43
阅读 3907·2021-11-30 14:52
阅读 3784·2021-11-30 14:52
阅读 3852·2021-11-29 11:00
阅读 3783·2021-11-29 11:00
阅读 3869·2021-11-29 11:00
阅读 3557·2021-11-29 11:00
阅读 6105·2021-11-29 11:00