一、ES6基础语法
在学习vue组件之前,我们需要具备ES6基础语法的知识。
1、变量声明
原因
: 使用var声明变量存在作用范围混淆问题。
let
: 用来声明局部变量。
好处: 作用范围严谨,从代码声明处开始到代码块结束为止。
一般在声明基本变量时推荐使用let。
const
:用来声明js中常量。
好处: 一旦被赋值不能被修改。
一般在声明js中的对象、数组时推荐使用const。
2、箭头函数
在使用匿名函数 function(){}
作为参数的时候,推荐使用ES6中箭头函数 (参数,参数)=>{函数体}
注意:
1.当箭头函数没有参数或者参数大于1个时,参数必须加入();
2.当箭头函数只有一个参数时 () 可以省略不写;
3.当函数体中只有一行代码时函数体{} 可以省略不写;
4.箭头函数和匿名函数的最大区别:箭头函数没有自己的this,匿名函数存在自己的this
。
3、模板字符串
4、对象的定义
如果对象的属性名
和变量名
一致时,只需要写一个即可。
二、vue中的组件
- vue推荐的开发方式是
基于单页面的应用
(SPA:Single Page Application) - 什么是SPA? 日后项目中只有一个页面(index.html)
- 为什么vue推荐使用SPA的开发方式? 一个应用中只能存在一个vue实例
- 使用现有手段严格遵循SPA存在的问题? 使用单页面开发,代码越来越多不利于后续的维护;在一个页面中完成全部业务功能,导致当前页面每次加载速度缓慢
- 为了严格遵循SPA的开发方式,在vue中提供了组件(component)
组件的作用:用来减少vue实例对象中的代码量,日后在使用vue的开发过程中,可以根据 不同业务功能将页面划分为不同的多个组件,然后由多个组件去完成整个页面的布局,便于日后使用vue进行开发时页面管理,方便开发人员维护。
1、组件的使用
全局组件的注册和使用
//1.开发全局组件
Vue.component('login',{
template:'<div><h1>用户登录</h1></div>'
});
//2.使用全局组件 在Vue实例范围内
<login></login>
注意:
1. Vue.component用来开发全局组件 参数1: 组件的名称 参数2: 组件配置{} template:’ '用来书写组件的html代码 template中必须有且只有一个root元素
;
2. 使用时需要在Vue的作用范围内根据组件名使用全局组件;
3. 如果在注册组件过程中使用驼峰命名组件的方式,在使用组件时必须将驼峰的所有单词小写加入-线
进行使用;
局部组件注册和使用
通过将组件注册给对应Vue实例中一个components属性来完成组件注册,这种方式不会对Vue实例造成累加。
- 第一种开发方式
//局部组件登录模板声明
let login ={ //具体局部组件名称
template:'<div><h2>用户登录</h2></div>'
};
const app = new Vue({
el: "#app",
data: {},
methods: {},
components:{ //用来注册局部组件
login:login //注册局部组件
}
});
//局部组件使用 在Vue实例范围内
<login></login>
- 第二种开发方式
//1.声明局部组件模板 template 标签 注意:在Vue实例作用范围外声明
<template id="loginTemplate">
<h1>用户登录</h1>
</template>
//2.定义变量用来保存模板配置对象
let login ={ //具体局部组件名称
template:'#loginTemplate' //使用自定义template标签选择器即可
};
//3.注册组件
const app = new Vue({
el: "#app",
data: {},
methods: {},
components:{ //用来注册局部组件
login:login //注册局部组件,也可以直接使用login,
}
});
//4.局部组件使用 在Vue实例范围内
<login></login>
2、组件中定义数据和事件等
组件中定义属于组件的数据
//组件声明的配置对象
const login = {
template:'<div><h1>{{ msg }} </h1><ul><li v-for="item,index in lists">{{ index }}{{ item }}</li></ul></div>',
data(){ //使用data函数方式定义组件的数据 在templatehtml代码中通过插值表达式直接获取
return {
msg:"hello",
lists:['java','spring','springboot']
}//组件自己内部数据
}
}
组件中定义属于组件的方法
const login={
template:'<div><input type="button" value="点我触发组件中事件" @click="change"></div>',
data(){
return {
name:'xiaozhang'
};
},
methods:{
change(){
alert(this.name)
alert('触发事件');
}
}
}
1. 组件中定义事件和直接在Vue中定义事件基本一致 直接在组件内部对应的html代码上加入@事件名="函数名"方式即可;
2. 在组件内部使用methods属性用来定义对应的事件函数即可,事件函数中this指向的是当前组件的实例。
组件中定义属于组件的计算属性
const login = {
template:'<div><h1>{{ squareCount }}</h1></div>',
data(){ //使用data函数方式定义组件的数据 在templatehtml代码中通过插值表达式直接获取
return {
count: 2
}//组件自己内部数据
},
computed: { //组件的计算属性
squareCount(){
return this.count * this.count;
}
},
}
组件中使用属于组件的生命周期函数
//初始化阶段
beforeCreate(){
console.log("beforeCreate:", this.message);
},
created(){
console.log("created:", this.message);
},
beforeMount(){
//console.log("beforeMount:", document.getElementById("h2").innerText);
},
mounted(){
console.log("mounted:", document.getElementById("h2").innerText);
},
//运行阶段
beforeUpdate(){
console.log("beforeUpdate(vue中的数据):", this.count);
console.log("页面上的数据:", document.getElementById("h3").innerText);
},
updated(){
console.log("beforeUpdate(vue中的数据):", this.count);
console.log("页面上的数据:", document.getElementById("h3").innerText);
},
//销毁阶段
beforeDestroy(){
console.log("beforeDestroy:开始销毁");
},
destroyed(){
console.log("destroyed:销毁完成");
},
3、组件的数据传递
props的作用:用来给组件传递相应静态数据或者是动态数据。
- 通过在组件上声明静态数据传递给组件内部
<body>
<div id="app">
<!--使用登录组件-->
<login msg="我是登录组件" title="父组件向子组件传递静态数据"></login>
</div>
</body>
</html>
<script src="js/vue.js"></script>
<script>
//定义组件的配置对象
const login = {
template: `<div><h2>{{NewMsg}}=={{title}}</h2><reg count="1111"></reg></div>`,
data(){ //定义组件的数据
return {
NewMsg: this.msg,
};
},
props: ['msg','title'], //使用props接收数据,相当于向data中添加了一个数据
components: { //在组件中定义子组件
reg: {
template: `<div><h3>{{count}}</h3></div>`,
props: ['count']
}
}
};
const app = new Vue({
el: "#app",
data: {
msg: "父组件向子组件传递静态数据"
},
methods: {},
computed: {},
components: { //注册局部组件
login,
}
});
</script>
- 通过在组件上声明动态数据传递给组件内部
<body>
<div id="app">
<!--使用登录组件-->
<login :count="counter" :name="name"></login>
<input type="text" v-model="counter">
</div>
</body>
</html>
<script src="js/vue.js"></script>
<script>
const login = {
template: `<div><h2>{{count}}====={{name}}</h2></div>`,
props: ['count','name']
};
const app = new Vue({
el: "#app",
data: {
msg: "父组件向子组件传递动态数据",
counter: 0,
name: "我是一个组件哈哈哈!"
},
components: { //注册局部组件
login,
}
});
</script>
- prop的单向数据流
1. 所有的 prop 都使得其父子 prop 之间形成了一个单向下行绑定:父级 prop 的更新会向下流动到子组件中,但是反过来则不行。这样会防止从子组件意外改变父级组件的状态,从而导致你的应用的数据流向难以理解。
2. 额外的,每次父级组件发生更新时,子组件中所有的 prop 都将会刷新为最新的值。这意味着你不应该在一个子组件内部改变 prop。如果你这样做了,Vue 会在浏览器的控制台中发出警告。
<body>
<div id="app">
<!--使用登录组件-->
<login :count="counter"></login>
</div>
</body>
</html>
<script src="js/vue.js"></script>
<script>
const login = {
template: `<div><h2>{{count}}</h2> <button @click="increment">点我++</button> </div>`,
methods: {
increment(){
this.count++;
}
},
props: ['count']
};
const app = new Vue({
el: "#app",
data: {
msg: "父组件向子组件传递动态数据",
counter: 0,
},
components: { //注册局部组件
login,
}
});
</script>
可以使用如下方式避免vue发出的警告
<body>
<div id="app">
<!--使用登录组件-->
<login :count="counter"></login>
</div>
</body>
</html>
<script src="js/vue.js"></script>
<script>
const login = {
template: `<div><h2>{{aaCount}}</h2> <button @click="increment">点我++</button> </div>`,
data(){
return {
aaCount: this.count
}
},
methods: {
increment(){
this.aaCount++;
}
},
props: ['count']
};
const app = new Vue({
el: "#app",
data: {
msg: "父组件向子组件传递动态数据",
counter: 0,
},
methods: {
},
computed: {},
components: { //注册局部组件
login,
}
});
</script>
4、组件中的事件传递
向子组件中传递事件并在子组件中调用该事件
在子组件中调用传递过来的相关事件必须使用 this.$emit('函数名') 方式调用
可以理解成子组件向父组件传递数据。
<body>
<div id="app">
<!--使用登录组件-->
<login :message="msg" @aa="testParent"></login>
<h1>{{count}}</h1>
</div>
</body>
</html>
<script src="js/vue.js"></script>
<script>
const login = {
template: `<div><h1>{{message}}</h1> <button @click="testChild">点我</button> </div>`,
data(){
return {
count:222222
}
},
methods: {
testChild(){
console.log('我是子组件中的方法');
//this.$emit('aa',this.count);
this.$emit('aa',{id:this.count,name:"小陈",age:23});
}
},
props: ['message']
};
const app = new Vue({
el: "#app",
data: {
msg: "vue组件中的事件传递",
count:20
},
methods: {
testParent(user){
console.log('我是父组件中的方法');
this.count = user.id;
console.log(user.id);
console.log(user.name);
console.log(user.age);
}
},
components: { //注册局部组件
login,
}
});
</script>