组件
存在问题:
1.依赖关系混乱 不好维护
2.代码复用率不高
组件的定义:
实现应用中局部功能代码和资源的集合
模块:
1.理解:向外提供特定功能的js 一般就是个js文件
2.为什么:js文件很多很复杂
3.作用:复用js 简化js的编写 提高js运行效率
组件:
1.理解:用来实现局部功能效果的代码集合(html/css/js/image...)
2.为什么:一个界面的功能很复杂
3.作用:复用代码,简化项目编码,提高运行效率
模块化:
当应用中的js都以模块来编写的,那这个应用就是一个模块化的应用
组件化:
当应用中的功能都是多组件的方式来编写 ,那这个应用就是一个组件化的应用
非单文件组件:
一个文件中包含有n个组件
单文件组件:
一个文件中只有1个组件
1.创建组件:
Vue.extend(options)创建,其中options和new Vue(options)
template + data
2.注册组件: 2种方式 局部 全局
new Vue({
el: "#demo",
components: {
school,
student,
},
});
Vue.component("student", student);
3.使用组件:
编写组件标签 <school></school>
<div id="demo">
<school></school>
<student></student>
</div>
<script type="text/javascript">
Vue.config.productionTip = false;
const school = Vue.extend({
template: `
<div class="demo">
<h2>学校名称:{{schoolName}}</h2>
<h2>学校地址:{{address}}</h2>
<button @click="click">点击提示学校名</button>
</div>
`,
data() {
return {
schoolName: "尚硅谷",
address: "北京",
};
},
methods: {
click() {
alert(this.schoolName);
},
},
});
const student = Vue.extend({
template: `
<div>
<h2>学生姓名:{{studentName}}</h2>
<h2>学生年龄:{{age}}</h2>
</div>
`,
data() {
return {
studentName: "小杨",
age: 18,
};
},
});
Vue.component("student", student);
new Vue({
el: "#demo",
components: {
school,
},
});
</script>
1.单个单词的组件名:
school 小写
School 首字母大写
2.多个单词的组件名:
'my-school':demo -> k-case的命名
'MySchool':demo -> 脚手架模式的时候才行不然会报错
3.组件标签:
<school></school>
<school/> 脚手架模式下才行否则会导致后续组件无法渲染
4.简写注册组件
const school = Vue.extend(options) -> const school = options
<div id="demo">
<app></app>
</div>
<script type="text/javascript">
Vue.config.productionTip = false;
const student = Vue.extend({
template: `
<div>
<h2>学生姓名:{{studentName}}</h2>
<h2>学生年龄:{{age}}</h2>
</div>
`,
data() {
return {
studentName: "小杨",
age: 18,
};
},
});
const school = Vue.extend({
template: `
<div class="demo">
<h2>学校名称:{{schoolName}}</h2>
<h2>学校地址:{{address}}</h2>
<student></student>
</div>
`,
data() {
return {
schoolName: "尚硅谷",
address: "北京",
};
},
components: {
student,
},
});
const app = Vue.extend({
template:`
<school></school>
`,
components: {
school,
},
});
new Vue({
el: "#demo",
components: {
app,
},
});
</script>
单文件组件
- index.html 容器
- main.js 大哥 入口文件 vm new Vue({}) 一切的开始
- App.vue 作为一个汇总
- School.vue
- Student.vue
- 查找文件顺序 index.html -> vue.js -> main.js -> app.vue -> School.vue & Student.vue
index.html 容器
但是这里引用的文件会报错因为浏览器不能直接执行js 识别不了import
<body>
<div id="root">
</div>
<script src="../js/vue.js"></script>
<script src="./main.js"></script>
</body>
</html>
main.js 汇总文件 初始化vm 引入App汇总组件
import App from './App.vue'
new Vue({
el:'#root',
template:`<App></App>`,
components:{App},
})
App.vue 汇总School跟Student
<template>
<div>
<School></School>
<Student></Student>
</div>
</template>
<script>
import School from './School'
import Student from './Student'
export default {
name:'App',
components:{
School,
Student,
}
}
</script>
<style>
</style>
School.vue
<template>
<div class="demo">
<h2>学校名称:{{ name }}</h2>
<h2>学校地址:{{ address }}</h2>
<button @click="showName">点我提示学校名</button>
</div>
</template>
<script>
export default {
name: 'School',
data() {
return {
name: '尚硅谷',
address: '北京昌平'
}
},
methods: {
showName() {
alert(this.name)
}
},
}
</script>
<style>
.demo {
background-color: orange;
}
</style>
Student.vue
<template>
<div>
<h2>学生姓名:{{name}}</h2>
<h2>学生年龄:{{age}}</h2>
</div>
</template>
<script>
export default {
name:'Student',
data(){
return {
name:'张三',
age:18
}
}
}
</script>
ES6模块化 暴露和引用 export & import
export const school = Vue.extend({
data() {
return {
name: '尚硅谷',
address: '北京昌平'
}
},
methods: {
showName() {
alert(this.name)
}
},
})
const school = Vue.extend({
data() {
return {
name: '尚硅谷',
address: '北京昌平'
}
},
methods: {
showName() {
alert(this.name)
}
},
})
export {school}
const school = Vue.extend({
data() {
return {
name: '尚硅谷',
address: '北京昌平'
}
},
methods: {
showName() {
alert(this.name)
}
},
})
export default school
props 组件传参
1.简单写法
props:['name','age','sex']
2.限制props的数据类型
props:{
name:String,
age:Number,
sex:String
}
3.限制props的数据类型 + 初始化默认值 + 必要性限制
props:{
name:{
type:String,
required:true
},
age:{
type:Number,
default:99
},
sex: {
type: String,
required:true
}
}
/*App.vue*/
<template>
<div>
<Student ref="student" name="新名字" sex="新性别" :age="18+1" />
</div>
</template>
props:{
name:{
type:String,
required:true
},
age:{
type:Number,
default:99
},
sex: {
type: String,
required:true
}
}
