1、关于组件使用方法
ok废话不多说直接一个简单的组件实例带你快速使用组件。
//html代码
//单页面使用需要引入文件,这里引入的是cdn方式
<script src="https://cdn.jsdelivr.net/npm/vue" type="text/javascript"></script>
<body>
<div id="vue_practice">
<h2>组件的基本使用</h2>
<!-- 可用一个变量进行动态赋值。可直接赋值,值可以是数组、字符串、数组等等-->
<!-- 这里动态绑定的值只能是子组件里面props里申明的变量-->
<blog-post :post-title="post.title + ' by ' + post.author.name"></blog-post>
<blog-post :post-title="'字符串'"></blog-post>
<blog-post :post-title="{hhh:'ok'}"></blog-post>
<blog-post :post-title="[123,234]"></blog-post>
</div>
</body>
//子组件的建立
//组件名称一般使用驼峰命名(短横线也ok),父组件调用的时候使用短横线
Vue.component('blogPost', {
props: ['post-title'],//子组件向父组件传的值
template: '<i style="display:block;margin:20px">{{ postTitle }}</i>'//组件模版
})
//父组件调用
var vue_practice = new Vue({
el: "#vue_practice",
data: {
//组件赋值
post: {
title: '组件的基本使用',
author: {
name: 'Yan_an_n'
},
},
},
});
效果图如下:
2、父组件和子组件区分
最开始我常常分不清概念到底哪个是父组件、哪个是子组件,后来发现区分其实很容易
父组件:就是调用方,毕竟是爸爸,还是可以对儿子进行调教的嘛哈哈😄
子组件:那当然就是被调用方啦,但是被调用方也是有自己骨气的,不是自己申明的属性,父组件也别想使用
3、组件传值
- 父组件向字组件传值(props),传值方式是利用属性传值
1、子组件可利用props设置默认值、传值类型、及一些验证
//子组件的设置
Vue.component('child',{
props: {
//对象形式设置传值的更多属性
content: {
type: String,//传值类型
required: false, //设置是否必须传递
default: 'default value' //设置默认传递值 -- 无传递时传递的默认值
}
},
template: '<div>{{content}}</div>'//模版
})
2、还可设置限制传递字符串的长度等等,validator属性
Vue.component('child',{
props: {
content: {
type: String,
//对传入属性通过校验器要求它的长度必须大于5,若是传值大于5会报错
validator: function(value){
return value.length > 5
}
}
},
template: '<div>{{content}}</div>'
})
//父组件就利用v-bind属性值的方式将值传给子组件
//模版里面
<child :content="prac"></child>
//script里面
var vue_practice = new Vue({
el: "#vue_practice",
data: {
prac:'父组件传值',
},
methods:{
cli_num(a){
this.aa = a;
alert(this.aa);
}
}
}
- 子组件向父组件传值($emit),传值方式利用方法调用
//子组件申明
Vue.component('child',{
data:{
num:1
},
props: {
num:{
type: Number
}
},
template: '<div @click="to">{{content}}</div>',//模版
methods:{
to(){
this.num++;
this.$emit("has_num", this.num);
}
}
})
//使用方式@has_num即$emit使用方法
<child @has_num="cli_num" :num="aa"></child>
//父组件调用
//在方法里使用即可
var vue_practice = new Vue({
el: "#vue_practice",
data: {
aa:0
},
methods:{
cli_num(a){
this.aa = a;
alert(this.aa);
}
}
}
4、关于slot
就是在子组件设置一个插槽,而父组件就可随意在组件内部设置自己想要的内容,具体操作之后在补上
- 组件使用的时候加标签,调用组件的时候可以加任何东西,若是没加标签,调用组件内部价东西会被忽略
- slot使用的作用域,绑定的是父组件的数据
- slot可有默认值,同props设置一样,若是父组件没有传入内容则使用备用内容,否则用传入的数据即可
- 具名插槽,插槽有具体名称定义,其实没名称的slot,都默认为default,具名插槽得使用template去绑定才可以
- 具名插槽可使用缩写:v-slot:header 可以被重写为 #header
commanBanner组件
<div id="comman_banner">
<ul class="banner_list”>
<li v-for="list in bannerList" :key="list">
<a :href="list.url" target="_blank">{{list.name}}</a>
</li>
</ul>
<slot></slot>
<slot name=“title”></slot>
</div>
//组件调用
<comman-banner>
<i class="yu_icon_xinlogo"></I>
<!—具名插槽的使用!—>
<template v-slot:title>
<h1 class="title">Here might be a page title</h1>
</template>
</comman-banner>
- 作用域插槽:使用一个可以复用的模版替换已渲染元素,类似组件的props的用法
- 出现多个插槽,最好基于template去使用,否则作用域会混乱,而且一个组件里面只能有一个默认插槽否则也会混乱
<div id="left_banner”>
<!—其中leftBanner值是已知值!—>
<slot v-bind:left="leftBanner">
{{ leftBanner.lastName }}
</slot>
</div>
//用法1
<!—其中slotProps值是命名—>
<!—<template v-slot:default="slotProps”>!—>
<!—可以将default去掉!—>
<template v-slot="slotProps">
{{ slotProps.left.lastValue }}
</template>
//用法2,支持es6可以使用解构赋值
<template v-slot="{left:leftcontext}">
{{ leftcontext.lastValue }}
</template>
5、关于项目调用组件切记操作
1、首先需要引入组件例如
//XXXXX组件名字
import XXXXX from "@/xxx/xxxx/xxx";
2、需要对组件进行申明
export default {
components: { XXXXX, XXXXX, XXXXX },
}
例子均作者实操作过,简单使用组件还是够了的,之后会根据实际再补充。