Vue-组件开发(上)
1.什么是组件化开发
组件化开发指的是:根据封装的思想,把页面上可重用的UI结构封装为组件,从而方便项目的开发和维护
2.Vue中的组件化开发
组件就是对UI结构的复用 vue是一个支持组件化开发的前端框架 vue中规定:组件的后缀名为 .vue 在我们通过Vue-cli创建的项目里面,有一个App.vue文件,该文件的本质上就是一个Vue的组件。
3.Vue组件的三个组成部分
每个 .vue 组件都由3部分组成,分别是:
- template -> 组件的模板结构
- script -> 组件的JavaScript行为
- style -> 组件的样式
<template>
<div class="box">
<h3>{{username}}</h3>
</div>
</template>
<script>
export default{
data(){
return {
username:'zh'
}
}
}
</script>
<style>
.box{
background-color: aquamarine;
}
</style>
3.1在组件中定义methods方法
methods方法的定义与在html文件里面定义的一样,与data方法
<template>
<div class="box">
<h3>{{username}}</h3>
<button @click="btn">点击修改</button>
</div>
</template>
<script>
export default{
data(){
return {
username:'zh'
}
},
methods: {
btn(){
this.username='zhanghan'
console.log(this);
}
},
}
</script>
<style>
.box{
background-color: aquamarine;
}
</style>
3.2 在Vue组件中启用less语法
如果在组件里面对样式的修改需要用到less语法,只需要在
<template>
<div class="box">
<h3>{{username}}</h3>
<button @click="btn">点击修改</button>
</div>
</template>
<script>
export default{
data(){
return {
username:'zh'
}
},
methods: {
btn(){
this.username='zhanghan'
console.log(this);
}
},
watch:{
},
computed:{
},
filters:{
}
}
</script>
<style lang="less">
.box{
background-color: aquamarine;
h3 {
color: red;
}
}
</style>
4.组件之间的父子关系
组件在被封装好之后,彼此之间是相互独立的,不存在父子关系
在使用组件的时候,根据彼此的嵌套关系,形成了父子关系、兄弟关系
4.1使用组件的三个步骤
当我们想要再APP.vue文件中用到Left.vue和Right.vue组件,则需要按照下面步骤来进行: 步骤一:使用import语法导入需要的组件 步骤二:使用components节点注册组件 **步骤三:**以标签形式使用刚才注册的组件 我们在步骤一导入组件名字的时候可以是任意名字,但是要和components里面注册时要同步你在步骤一里面接收的组件名字
<template>
<div class="#app-container">
<h1>App 根组件</h1>
<hr/>
<div class="box">
<!-- 渲染 Left Right 组件 -->
<Left></Left>
<Right></Right>
</div>
</div>
</template>
<script>
import Left from '@/components/Left.vue'
import Right from '@/components/Right.vue'
export default {
components: {
Left,
Right
},
}
</script>
<style lang="less">
.app-container{
padding: 1px 20px 20px;
background-color: #efefef;
}
.box{
float: left;
}
</style>
4.2私有组件和全局组件
私有组件 当我们在components下注册组件后,该组件称为私有子组件,当我们其他的组件想去使用该组件便都需要去注册该组件 例如: 在组件A的components节点下,注册了组件F 则组件F只能用在组件A中,不能被用在组件C中。 因此我们需要利用全局组件来方便我们多次的使用 全局组件 在Vue项目里的main.js入口文件中,通过**Vue.component()**方法,可以注册全局组件,语法格式:
import Count from '@/components/Count.vue'
Vue.component('MyCount',Count)
当我们注册好后,只需要在需要的组件页面内通过标签的方式就可以直接利用该组件
<template>
<div class="box2">
<span>Left组件</span>
<hr/>
<MyCount></MyCount>
</div>
</template>
<script>
export default{
}
</script>
<style lang="less">
.box2{
width: 400px;
height: 200px;
background-color: red;
}
</style>
5.组件里面的 props
props是组件的自定义属性,在封装通用组件的时候,合理的使用props可以极大地提高组件的复用性 语法格式:
export default{
props:['自定义属性A','自定义属性B'...],
data(){
return {
}
}
}
案例:自定义按钮点击的初始值 利用Left.vue使用全局组件Count.vue,通过按钮使自定义的初始值增加
<!-- Count 组件 -->
<template>
<div>
<h5>Count 组件</h5>
<p>count 的值为:{{init+count}}</p>
<!-- 当methods:{ }里面的事件函数执行语句只有一行时,我们可以在methods里面直接省略 -->
<button @click="count +=1">按钮</button>
</div>
</template>
<script>
export default {
props:['init'],
data() {
return {
count:0
};
},
};
</script>
<!-- Left 组件 -->
<template>
<div class="box2">
<span>Left组件</span>
<hr/>
<!-- 正常传入的的初始值为一个字符串 我们如果需要转换成数值 则需要加上 : -->
<!-- 我们都知道 v-bind 里面写的是JS 所以我们输出的是一个数字 9 如果不加 v-bind 则输出一个字符串 "9" -->
<MyCount :init="9"></MyCount>
</div>
</template>
<script>
export default{
}
</script>
<style lang="less">
.box2{
width: 400px;
height: 200px;
background-color: rgb(255, 191, 0);
}
</style>
因此我们发现props里面的数据也可以拿到页面中去渲染数据 注意:在我们没有使用v-bind之前所绑定的值是一个字符串,当我们使用了v-bind后" "内的语句将会变成JS脚本语句
5.1props 是只读的
Vue规定:组件中封装的自定义属性是只读的,我们不能直接修改props的值,否则会直接报错
我们在上述的案例中实际上是希望count的数值进行增长,但是我们在调试工具里发现最终结果并不是count的值 如果我们想修改props的值,可以把props的值转存到data中,因为data中的值是可读可写的 因此我们可以将上述案例作出修改
<!--只需要修改 Count 组件-->
<template>
<div>
<h5>Count 组件</h5>
<p>count 的值为:{{count}}</p>
<!-- 当methods:{ }里面的事件函数执行语句只有一行时,我们可以在methods里面直接省略 -->
<button @click="count +=1">按钮</button>
<button @click="show">打印this</button>
</div>
</template>
<script>
export default {
props:['init'],
data() {
return {
count:this.init
};
},
methods: {
show(){
console.log(this);
}
},
};
</script>
5.2 props的default默认值
在声明自定义属性时,可以通过default来定义属性的默认值 示例代码:
export default {
props:{
init:{
default:0
}
}
}
我们可以将上述案例在稍作调整 当我们的Left.vue的MyCount组件定义了init的初始值,default将会被覆盖 当Right.vue没有定义初始值,default将生效
<template>
<div>
<h5>Count 组件</h5>
<p>count 的值为:{{count}}</p>
<!-- 当methods:{ }里面的事件函数执行语句只有一行时,我们可以在methods里面直接省略 -->
<button @click="count +=1">按钮</button>
<button @click="show">打印this</button>
</div>
</template>
<script>
export default {
props:{
init:{
default:0
}
},
data() {
return {
count:this.init
};
},
methods: {
show(){
console.log(this);
}
},
};
</script>
5.3 props的type值类型
在声明自定义属性时,可以通过type来定义属性的值类型。示例代码如下:
export default{
props:{
inti:{
default:0,
type:Number
}
}
}
5.4 props的required必填项
required必填项是专门用来校验我们的自定义属性的默认值类型 语法格式:
export default{
props:{
inti:{
default:0,
type:Number,
required:true
}
}
}
就比如我们在Left.vue里面MyCount组件标签里面的 init 初始值没有利用v-bind绑定,则他的默认值将会是变成字符串,如果我们在Count.vue全局组件里面的将默认值设置为Number,此时终端将会报错
总结
我们之所以用到props是为了提高组件的复用性,当我们封装了一个共享组件时,每一个组件在使用这个组件时都希望能够传入自己的初始值,因此我们此时可以用到props,在porps里面定义一个init属性,用户可以自定义的去定义init的初始值来传入到props里面的init
|