目录
Vue组件化
Vue全局组件
创建全局组件
注册全局组件
Vue局部组件
解决template下编写HTML代码没有提示问题
组件中使用methods
组件中使用data
component标签
切换组件动画
keep-alive标签
slot标签
匿名插槽
具名插槽
v-slot:(#)
作用域插槽
v-slot:(#)补充
父子组件
父子组件数据传递和多级传递
父子组件方法传递和多级传递
父子组件数据传递和多级传递补充
兄弟组件数据传递补充:bus通信
组件渲染方式
方式一
方式二
需要先创建组件构造器,然后注册已经创建好的组件,最后才能使用。使用时直接使用注册的组件名称,例如下面中可以直接使用
通过var Compo=Vue.extend({template:''})创建全局组件,template:后直接跟组件的HTML代码即可。注意template中只能有一个根元素,多个元素只会显示一条。
通过Vue.component('name',Compo)注册已经创建好的组件,第一个参数为指定已经创建好的名称,第二个参数为已经创建好的组件构造器。注意第二个参数还可以为一个对象obj,系统会调用Vue.extend(obj),将返回结果再传入其中(Vue.component('name',{template:})可以将创建和注册全局组件变成一步)。注意如果在注册的命名时使用了驼峰命名,那么使用组件时需要将大写变为小写字母并且在之前加上-,例如Vue.component('myName',Compo),使用时为
不需要注册,直接在实例中的component属性中定义即可,例如new Vue({el:'#app',data:{},components:{'name':{template:''}}}),局部组件和全局组件重名时只有局部组件生效。
组件中只能使用组件中定义的methods而不是Vue实例中的methods,即需要给Vue.extend中传入的对象添加methods属性,在methods指向的对象中定义方法,这些方法才能在组件中使用,例如{template:'
',methods:{fun(){}}},这样便可已在在该组件中使用fun函数(可以在template中使用),局部组件也是同理,在methods中使用this加属性名的方法拿到的数据是组件中定义的data函数返回对象的数据。组件中同样也只能使用组件中定义的data而不是Vue实例中的data,和methods不同的是,组件中定义的data需要是一个函数,该函数返回的对象可以理解为data,例如{template:'
',data(){return {abc:123}}},在template中便可以用插值语法{ {abc}}来显示123。这样的好处是复用多个组件时,每个组件都会运行一遍data函数,并将其与当前组件绑定起来,使每个组件的数据相互独立,避免了多个组件公有一份数据。用于切换组件,该标签上有is属性,我们通过v-bind:给is属性绑定不同的属性名,便会将该标签替换为属性名对应相同的组件名的标签(也可以使用v-if和v-else实现替换组件功能)。
在Vue中通过transition标签包裹component标签进行切换组件的动画,这时现有组件消失和新组件的进入动画是同时进行的,要想改变进行的次序,则在transition标签上添加mode属性,分别可以取'in-out'和'out-in'两值,'in-out'代表新元素先进行过度,完成之后当前元素离开,另一个相反。
用于在切换组件的之前缓存数据,当切换回来时候,还会有相同的数据。使用方法:将该标签包裹component标签即可。示例:比如component切换的组件中有复选框,切换前选中了,如果切换后再次切换回来,加了该标签后仍然会显示勾选状态。
用于在组件标签中动态添加内容(默认是不能添加的)。通过将slot标签写入组件的template中,此时我们使用该组件,如果在组件标签中添加了内容,那么该内容将会替换template中的slot标签全部内容,如果没有添加内容,那么会显示slot中的内容。注意当template中的slot标签有多个时,会将在组件标签中的全部内容内容复制多份分别替换。
用于当有多个slot标签时,在组件标签中动态添加内容时能替换指定的slot标签。当slot标签上添加了name属性时便为具名插槽(例如name='one'),这时组件标签中动态添加的内容便不会替换该slot标签,要想替换该内容需要在组件标签添加的元素中加入slot属性等于相应的名称(例如slot='one'便会替换name='one'的slot标签),那么该内容才会去替换(不会叠加,指定多条slot='name',这些内容将全部替换)。
用于解决具名插槽中多个元素需要给每个元素添加slot(slot='one')属性。该指令需要搭配template标签,在template标签上添加属性v-slot:one,这样便会将template中的内容替换slot标签中name='one'的标签。v-slot:可以简写为#。
用于解决父组件标签中填充内容无法使用子组件的数据问题。通过在子组件slot标签上添加属性例如v-bind:son='sondata',其中sondata为子组件中的数据,son为传递的数据名,在父组件的标签中的template标签上添加属性slot-scope='abc',便可以在template标签下使用{ {abc.son}},代替sondata数据。
v-slot:也可以解决父组件标签中填充内容无法使用子组件的数据问题。例如通过v-slot:default='abc',表示接收匿名插槽传递的数据,如果插槽有name='one'属性,则将default替换为one即可,同上便可以在template标签下使用{ {abc.son}}。
理解:Vue实例其实可以看做为一个父组件,实例中定义的局部组件,可以看做它中的子组件。同理,例如全局自定义组件,我们可以在传入的对象中添加components属性来定义子组件即var ff=Vue.extend({template:'
默认情况下是不能互相直接使用数据,但是我们可以通过下面方法由父组件向子组件传递数据:
同样不能互相直接使用方法,通过下面方法实现父组件向子组件传递方法:
注意在组件标签上使用v-model例如v-model=username相当于:value=username和@input=函数,即我们在prop数组中可以直接用value接收,也可以通过this.$emit('input','pyf'),将数据'pyf'传给父组件中的username。
由于上例方法传递中fatherfun函数体中的this.拿到的数据是父组件的数据,那么我们也可以变相的实现子组件向父组件传递数据:
父子组件传递传递数据补充:可以通过Vue实例属性中的$ref拿到组件标签中的任何方法和数据直接修改(不方便查找数据出错,故不推荐)
定义2个全局组件bro1,bro2,在Vue实例对象vm1中实现bro1向bro2传递数据:这时需要借助新建的空Vue实例vm2,在bro2组件的组件已挂载生命周期方法mounted()中定义vm2上自定义事件vmBus即vm2.$on('vmBus',function(){}),然后在bro1的方法中通过vm2.$emit.('vmBus',data1,..,datan)触发事件并传递bro1中的数据。
在Vue控制区域使用组件标签渲染。
在实例Vue对象中通过render属性对应的方法渲染(Vue生命周期中会自动调用该方法),渲染方式会替换整个Vue的控制区域,例如new Vue({el:'#app',data:{},render:function(fun){let html=fun('one');return html;}}),系统会给render指向的函数传一个函数名,该函数接收一个组件名的参数(已注册的组件名),可以生成对应组件的模板,最后将return的内容渲染到页面上去。