组件注册

全局组件:

全局组件创建第一种方法:

js:
// 定义一个名为 button-counter 的新组件
Vue.component('button-counter', {data: function () {return {count: 0}},// 使用这种方法注册组件时,内容必须在同一个根元素下,否则会报错template: '<button v-on:click="count++">You clicked me {{ count }} times.</button>'
})
// 定义一个名为 mybutton2 的新组件
Vue.component('mybutton2',{template:'<button>click me</button>'
})
var ex1 = new Vue({ el: '#components-demo' })
html:
<div id="components-demo"><button-counter></button-counter><mybutton2></mybutton2>
</div>

这个例子中,一定要注意先定义组件然后在创建vue实例,这也是创建组件的第一种方式。否则既不会报错,页面也没有显示。
全局组件特点:

  • 全局组件可以多次复用
  • 多个全局组件在注册之后可以用在任何新创建的 Vue 根实例 (new Vue) 的模板中
  • 如果用到data,必须写成函数的形式例如data:function() {return {原本data中应该放着的内容}},,否则它的数据可能会被共享,一改全改
  • 因为组件是可复用的 Vue 实例,所以它们与 new Vue 接收相同的选项,例如 data、computed、watch、methods 以及生命周期钩子等。仅有的例外是像 el 这样根实例特有的选项
  • 组件的起名有讲究:在js中你可以用“…-…”或驼峰法命名,但是HTML里支持第一种,若js中用了第二种,则HTML在大写位置前插入“-”并将大写字母改为小写(这个坑一度让我以为起名是种玄学,时好时坏)
  • 使用这种方法注册组件时,内容(template里的HTML)必须在同一个根元素下,否则会报错

全局组件创建第二种方法: 还可以使用extend,如下例:

var com1 = Vue.extend({template:'<button>click me</button>'})
Vue.component('myP',com1)
//或者简化为
Vue.component('myP',Vue.extend({template:'<button>click me</button>'}))
// 引用时的标签就是<my-p></my-p>
  • 全局组件创建第三种方法:在HTML被控制的元素之外创建template标签
HTML:<template id="tst"><div>A custom </div></template>
js:Vue.component('test1',{template:'#tst'})var em1 = new Vue({el:"#example1",// data:{// }})
  • 全局组件可以在任何一个vue实例中使用,就算你和我new多少个实例都可以通用这些组件。

局部组件:

局部组件的两种创建形式:2019/5/16

html:
<div id="example2"><com-a></com-a><com-b></com-b></div>
js:
var ComponentA = { /* ... */ }
var ComponentB = { /* ... */ }
var ComponentC = { /* ... */ }
var em2 = new Vue({el:"#example2",data:{msg:'haha',cnt:0},....可以加若干vue内部指令components:{//com-a,com-b就是自定义元素的名字//组件名称:组件模版对象//可以只写 组件对象自变量,就是默认名称和对象同名'com-a':componentA,/*或者直接写componentA内部代码片段*/'com-b':componentB}....可以加若干生命周期函数})
html:<div id="example3"><login></login></div>
js:
var em3 = new Vue({el:"#example3",components:{//com-a,com-b就是自定义元素的名字login:{template:'<h1>可口可乐</h1>'}}})

或者:

html:<div id="example3"><login></login></div>template:
<template id="lizi"><h1>可口可乐</h1>
</template>
js:
var em3 = new Vue({el:"#example3",components:{//com-a,com-b就是自定义元素的名字login:{template:'#lizi'}}})

上述所有方法中的template部分都可以在js,html这些标签外写 ,把需要的HTML内容写入其中,然后JS中template:后直接加"#XXX"亦可以,像局部组件第二个例子里一样

  • 其实描述的有些复杂了,总的来说,全局使用的都是Vue.component来定义组件,局部都是使用components属性来定义组件,记住这点就可以把前面的知识点捋清楚了!另外,给组件 只是为了可以用标签的方式引用这些组件而已。

组件切换2019/5/18

第一种方式(使用v-if,v-else)

html:
<div id="example4"><a href="" @click.prevent="flag = true">登录</a><a href="" @click.prevent="flag = false">注册</a><login v-if="flag"></login><register v-else="flag"></register></div>
js://组件切换Vue.component('login',{template:'<h2> 登录</h2>'})Vue.component('register',{template:'<h2> 注册</h2>'})var em4 = new Vue({el:'#example4',data:{flag:true}})

缺陷: 由于v-if,v-else的局限性,切换组件的个数没法太多

第二种方式(使用component:is="…")

  • vue提供了component标签来展示对应名称的组件,component是一个占位符, :is 属性可以用来指定要展示的组件的名称,引号里的内容被解析为表达式,若要表达出字符串的意思需要内嵌另一种引号
html:
<div id="example4"><a href="" @click.prevent="name='login'">登录</a><a href="" @click.prevent="name='register'">注册</a><component :is='name'></component><!-- 如果仅仅想表达名为login的组件则写为:is="'login'",就是刚刚说的内嵌另一种引号的意思 --></div>js://组件切换Vue.component('login',{template:'<h2> 登录</h2>'})Vue.component('register',{template:'<h2> 注册</h2>'})var em4 = new Vue({el:'#example4',data:{name:'login'// 默认为登录}})

组件切换动画:

  • 相当简单,与上一步的变化只有把component标签用transition包起来,加上 mode属性(设置切换方式)和适当的css即可
css:<style>.v-enter,.v-leave-to{opacity: 0;transform: translateX(200px);}.v-enter-active,.v-leave-active{transition: all 0.5s ease;}</style>
html:<div id="example4"><a href="" @click.prevent="name='login'">登录</a><a href="" @click.prevent="name='register'">注册</a><transition mode='out-in'><component :is='name'></component></transition></div>  js://组件切换Vue.component('login',{template:'<h2> 登录</h2>'})Vue.component('register',{template:'<h2> 注册</h2>'})var em4 = new Vue({el:'#example4',data:{name:'login'}})

组建传值

组件传值时,我们会用到prop这个东西,到这里我们依然要一定小心HTML的特性就是大小写不敏感,浏览器会把所有的大写字符解析成小写,还总是不报错也不提醒,我已经在这里栽过两跤,每次改bug都耗去了大量的时间和精力,因此放在前面特此提醒。这意味着当你使用 DOM 中的模板时,camelCase (驼峰命名法) 的 prop 名需要使用其等价的 kebab-case (短横线分隔命名) 命名,我觉得更好的方法是避免使用驼峰法!!!

Prop类型

我们可以以字符串数组的形式列出prop,但是更推荐的格式是以对象的方式来列出,这不仅为你的组件提供了文档,还会在它们遇到错误的类型时从浏览器的 JavaScript 控制台提示用户。

接下来我们来看Vue常用的三种传值方式————

父组件把data传给子组件

<body><div id='ex1'><com1 v-bind:parentmsg='msg'></com1></div>
<script src="https://cdn.jsdelivr.net/npm/vue"></script>
<script>var vm = new Vue({el:'#ex1',data:{msg:'父组件的值'},methods:{},components:{com1:{template:'<h1>子组件的值和  {{parentmsg}}</h1>',props:['parentmsg']}}})
</script>

解析上例 :

  1. 如果在子组件中直接访问父组件data或methods的值的话,默认是无法访问成功的
  2. 子组件如果自己有data的话,它并不是父组件传来的,而是其自身私有的,它是又可读又可写的
  3. 而子组件中props中的数据都是父组件传给子组件的,它只是可读的
  4. 父组件传来的东西,必须先在props数组中进行定义以后才能使用,如props:['parentmsg'],props是一个数组,可以传多个值,它是只读的
  5. 父组件在引用子组件时,通过v-bind的形式,将需要的传递给子组件的数据,以属性绑定的形式供子组件使用,如:<com1 v-bind:parentmsg='msg'></com1>

父组件把methods传给子组件

<body><div id='ex1'><com2 v-on:thefunction="show"></com2></div><template id="fun"><div>//只能有一个根喔<h2>宝宝是个自组件</h2><input type="button" value="click" @click="myclick"></div></template>
<script src="https://cdn.jsdelivr.net/npm/vue"></script>
<script>var com2 = {//定义一个字面量类型的组件模版对象template:'#fun',methods:{myclick(){console.log('ok');// 用$emit触发父组件的方法this.$emit('thefunction',123)//触发调用}}}var vm = new Vue({el:'#ex1',methods:{show(data){console.log('父组件的show方法'+data)}        },components:{com2}})
</script>

解析上例 :

  1. 第一步,定义一个名为com2子组件,其父组件(Vue实例)中有方法show
  2. 父组件向子组件传递方法使用的是事件绑定机制,如例子中的<com2 v-on:thefunction="show"></com2>接下来我们的子组件就能通过某些方式来调用传进去的方法了
  3. 当子组件有自己的myclick方法,通过this.$emit('thefunction',123)就可以触发调用父组件的方法
  4. 若父组件的方法有参数列表,我们可以在this.$emit('thefunction',123,参数....)后继续追加参数列表

vue之组件注册,组件切换,组件传值相关推荐

  1. YunshiCalendar组件农历日历切换组件

    YunshiCalendar组件农历日历切换组件 1. 版本0.1.0 2. 安装 npm install yunshui-calendar 3 使用 ` import YunshiCalendar ...

  2. 组件命名方式||局部组件注册:局部组件只能在注册他的父组件中使用

    组件命名方式 组件注册注意事项                 如果使用驼峰式命名组件,那么在使用组件的时候,只能在字符串模板中用驼峰的方式使用组件,但是                 在普通的标签 ...

  3. 组件注册——@ComponentScan自动扫描组件指定扫描规则

    包扫描.只要标注了@Controller.@Service.@Repository,@Component IOCTest.java package com.atguigu.test;import or ...

  4. 组件注册-@Scope-设置组件作用域

    package com.debuggg.test1.main3;import org.springframework.context.annotation.Bean; import org.sprin ...

  5. vue的组件/data的参数/组件传值/插槽/侦听器/生命周期钩子函数

    目录 组件结构 组件的命名规则: 组件的data参数 <font color='red'> 组件的父子传值prop(通信) <font color='red'>组件的子--&g ...

  6. Vue第二天学习总结—— Vue全家桶之组件化开发(组件化开发思想、组件注册、Vue调试工具用法、组件间数据交互传递、组件插槽、基于组件的案例——购物车)

    (一) 组件化开发思想 1. 现实中的组件化思想体现 组件化即是对某些可以进行复用的功能进行封装的标准化工作 标准:要想组件能够成功组合在一起,每个组件必须要有标准 分治:将不同的功能封装到不同的组件 ...

  7. vue怎么调用子元素的方法_vue 父组件中调用子组件函数的方法

    vue 父组件中调用子组件函数的方法 在父组件中调用子组件的方法: 1.给子组件定义一个ref属性.eg:ref="childItem" 2.在子组件的methods中声明一个函数 ...

  8. Vue(组件化编程:非单文件组件、单文件组件)

    一.组件化编程 1. 对比传统编写与组件化编程(下面两个解释图对比可以直观了解) 传统组件编写:不同的HTML引入不同的样式和行为文件 组件方式编写:组件单独,复用率高(前提组件拆分十分细致) 理解为 ...

  9. Vue3(撩课学院)笔记02-创建组件,全局组件,局部组件,父子组件,组件标签化,组件的data数据共享,组件间通讯,props,父传子$ref,子传父$parent

    1.创建一个组件 首先要创建一个根组件进行挂载 再创建一个子组件,完成子组件的逻辑 子组件主要使用template模板来完成布局和逻辑 把子组件通过根组件.component的方法挂载到根组件上 &l ...

最新文章

  1. 什么是集电极开路(OC)?什么是漏极开路(OD)?为什么必须要在OC门输出的IO口上加上拉电阻?
  2. npm打包前端项目太慢问题分析以及暂时解决方案
  3. Xtreme8.0 - Kabloom dp
  4. 计算机硬件配置和软件有哪些,BIM软件对电脑硬件配置有什么要求?
  5. java 双重检查锁定_Java双重检查锁定
  6. 测试用例设计与管理思路整理
  7. 互联网内卷之谁也别想好!
  8. 软件需求工程与UML建模——第九组第六周工作总结
  9. Vuebnb 一个用 vue.js + Laravel 构建的全栈应用
  10. 发电机机房设计规范_柴油发电机的容量怎么选择!发电机机房如何合理设计?来涨知识!...
  11. ASP.NET Treeview控件中对Checkbox的联级选择
  12. Xshell6、Xftp6【官方免费版】下载
  13. 测试用例设计方法-场景法详解
  14. 微信消息推送神器【一封传话】介绍,让消息推送更简单
  15. 羊了个羊, 听说这游戏很难
  16. 考研 | 一战南大软院险进复试后失利被刷,调剂国科大杭高院荣幸上岸
  17. 关于电压跟随器的那些事
  18. php中html页面时间戳直接转换成具体日期的写法
  19. 阿里云服务器搭建使用教程(四)域名使用及备案
  20. WM6.1中文系统实现日文显示和输入

热门文章

  1. 【学习笔记】【PS】基础学习篇(持续更新中...)
  2. NodeJS操作数据库
  3. 2021蓝旭工作室暑期第五次培训课-数据库设计文档
  4. c语言判断顺序链表是否为空,数据结构之线性表(五)——单链表(2 初始化,判断空表,销毁,清空,求表长)...
  5. Android的数据存储方式,如数据库的基本操作和三级缓存实现--
  6. 解决sougo输入法在Ubuntu下汉字输入出现数字代码的问题
  7. Element 表单检验不通过解决思路
  8. Oracle高人写的Oracle运行原理性文章(zt)
  9. 辅助治疗帕金森病机器人的可行性研究
  10. PCIE Resizable BAR