1. Vue 生命周期
Vue 实例生命周期 ===> java 对象生命周期(初始化阶段 运行阶段 销毁阶段) 生命周期钩子 ====> 生命周期函数
Vue实例从创建到销毁过程中自动触发一些列函数 ====> Vue生命周期函数(钩子)
Vue生命周期总结
# Vue生命周期总结
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>vue的生命周期</title>
</head>
<body>
<div id="app">
<h2 id="h1">{{msg}}</h2>
<input type="text" id="h2" v-model="msg">
</div>
</body>
</html>
<script src="js/vue.js"></script>
<script>
let app = new Vue({
el:"#app" ,
data:{
msg:"vue的生命周期"
},
methods:{},
computed:{},
beforeCreate(){
console.log("beforeCreate :"+this.msg);
},
created(){
console.log("created :"+this.msg);
},
beforeMount(){
console.log("beforeMount :"+document.getElementById("h1").innerText);
},
mounted(){
console.log("mounted :"+document.getElementById("h1").innerText);
},
beforeUpdate(){
console.log("beforeUpdate data:"+this.msg);
console.log("beforeUpdate view:"+document.getElementById("h1").innerText);
},
updated(){
console.log("updated data:"+this.msg);
console.log("updated view:"+document.getElementById("h1").innerText);
},
beforeDestroy(){
console.log("=======beforeDestroy:开始销毁=======");
},
destroyed(){
console.log("destroyed:全部销毁");
}
})
</script>
2. Vue中组件(component)
2.1 组件作用
组件作用: 用来减少Vue实例对象中代码量,日后在使用Vue开发过程中,可以根据 不同业务功能将页面中划分不同的多个组件,然后由多个组件去完成整个页面的布局,便于日后使用Vue进行开发时页面管理,方便开发人员维护。
2.2 组件使用
2.2.1 全局组件注册
说明:全局组件注册给Vue实例,日后可以在任意Vue实例的范围内使用该组件
Vue.component('login',{
template:'<div><h1>用户登录</h1></div>'
});
<login></login>
# 注意:
- 1.Vue.component用来开发全局组件 参数1: 组件的名称 参数2: 组件配置{} template:''用来书写组件的html代码 template中必须有且只有一个root元素
- 2.使用时需要在Vue的作用范围内根据组件名使用全局组件
- 3.如果在注册组件过程中使用 驼峰命名组件的方式 在使用组件时 必须将驼峰的所有单词小写加入-线进行使用
2.2.2 局部组件注册
说明:通过将组件注册给对应Vue实例中一个components属性来完成组件注册,这种方式不会对Vue实例造成累加
let login ={
template:'<div><h2>用户登录</h2></div>'
};
const app = new Vue({
el: "#app",
data: {},
methods: {},
components:{
login:login
}
});
<login></login>
<template id="loginTemplate">
<h1>用户登录</h1>
</template>
let login ={
template:'#loginTemplate'
};
const app = new Vue({
el: "#app",
data: {},
methods: {},
components:{
login:login
}
});
<login></login>
2.3 Prop的使用
作用:props用来给组件传递相应静态数据或者是动态数据的
2.3.1 通过在组件上声明静态数据传递给组件内部
let login = {
template:"<div><h1>欢迎:{{ userName }} 年龄:{{ age }}</h1></div>",
props:['userName','age']
}
const app = new Vue({
el: "#app",
data: {},
methods: {},
components:{
login
}
});
<login user-name="小陈" age="23"></login>
# 总结:
1.使用组件时可以在组件上定义多个属性以及对应数据
2.在组件内部可以使用props数组生命多个定义在组件上的属性名 日后可以在组件中通过{{ 属性名 }} 方式获取组件中属性值
2.3.2 通过在组件上声明动态数据传递给组件内部
const login = {
template:'<div><h2>欢迎: {{ name }} 年龄:{{ age }}</h2></div>',
props:['name','age']
}
const app = new Vue({
el: "#app",
data: {
username:"小陈陈",
age:23
},
methods: {},
components:{
login
}
});
<login :name="username" :age="age"></login>
2.3.3 prop的单向数据流
单向数据流:所有的 prop 都使得其父子 prop 之间形成了一个单向下行绑定:父级 prop 的更新会向下流动到子组件中,但是反过来则不行。
-
所有的 prop 都使得其父子 prop 之间形成了一个单向下行绑定:父级 prop 的更新会向下流动到子组件中,但是反过来则不行。这样会防止从子组件意外改变父级组件的状态,从而导致你的应用的数据流向难以理解。 -
额外的,每次父级组件发生更新时,子组件中所有的 prop 都将会刷新为最新的值。这意味着你不应该在一个子组件内部改变 prop。如果你这样做了,Vue 会在浏览器的控制台中发出警告。—摘自官网
2.4 组件中定义数据和事件使用
1. 组件中定义属于组件的数据
const login = {
template:'<div><h1>{{ msg }} 百知教育</h1><ul><li v-for="item,index in lists">{{ index }}{{ item }}</li></ul></div>',
data(){
return {
msg:"hello",
lists:['java','spring','springboot']
}
}
}
2.组件中事件定义
const login={
template:'<div><input type="button" value="点我触发组件中事件" @click="change"></div>',
data(){
return {
name:'小陈'
};
},
methods:{
change(){
alert(this.name)
alert('触发事件');
}
}
}
# 总结
1.组件中定义事件和直接在Vue中定义事件基本一致 直接在组件内部对应的html代码上加入@事件名=函数名方式即可
2.在组件内部使用methods属性用来定义对应的事件函数即可,事件函数中this 指向的是当前组件的实例
2.5 向子组件中传递事件并在子组件中调用该事件
在子组件中调用传递过来的相关事件必须使用 this.$emit('函数名') 方式调用
const login = {
template:"<div><h1>百知教育 {{ uname }}</h1> <input type='button' value='点我' @click='change'></div>",
data(){
return {
uname:this.name
}
},
props:['name'],
methods:{
change(){
this.$emit('aaa');
}
}
}
const app = new Vue({
el: "#app",
data: {
username:"小陈"
},
methods: {
findAll(){
alert('Vue 实例中定义函数');
}
},
components:{
login,
}
});
<login @find="findAll"></login>
2.Vue中插槽Slot
插槽可以看作一个占位符,减少了我们组件的使用,增强组件的复用
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>04-vue组件中的事件传递</title>
</head>
<body>
<div id="app">
<h2>{{msg}}</h2>
<login></login>
<hr>
<login><span slot="bb">欢迎进入我的网站</span></login>
<hr>
<login><span slot="aa">欢迎进入我的网站 {{msg}}</span></login>
</div>
</body>
</html>
<script src="js/vue.js"></script>
<script>
const login = {
template:`<div><slot name="aa"></slot> <h3>用户登陆</h3> <slot name="bb"> </slot></div>` ,
data(){
return{
}
},
methods: {
}
} ;
const app = new Vue({
el:"#app" ,
data:{
msg:"插槽的使用(Slot)" ,
counter : 0 ,
},
methods:{
} ,
components:{
login,
}
})
</script>
3.Vue中路由 (Vue Router)
3.1 路由
路由:根据请求的路径按照一定的路由规则进行请求的转发从而帮助我们实现统一请求的管理
3.2 作用
用来在vue中实现组件之间的动态切换
3.3 使用路由
-
引入路由 <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script src="https://unpkg.com/vue-router/dist/vue-router.js"></script>
一定注意的是我们的vue-router依赖于vue,要在vue引入之后引入!!! -
创建组件对象
const login = {
template:'<h1>登录</h1>'
};
const register = {
template:'<h1>注册</h1>'
};
-
定义路由对象的规则
const router = new VueRouter({
routes:[
{path:'/login',component:login},
{path:'/register',component:register}
]
});
-
将路由对象注册到vue实例 const app = new Vue({
el: "#app",
data: {
username:"小陈",
},
methods: {},
router:router
});
-
在页面中显示路由的组件
<router-view></router-view>
-
根据连接切换路由 <a href="#/login">点我登录</a>
<a href="#/register">点我注册</a>
3.4 router-link使用
作用:用来替换我们在切换路由时使用a标签切换路由
好处:就是可以自动给路由路径加入#不需要手动加入
<router-link to="/login" tag="button">我要登录</router-link>
<router-link to="/register" tag="button">点我注册</router-link>
# 总结:
1.router-link 用来替换使用a标签实现路由切换 好处是不需要书写#号直接书写路由路径
2.router-link to属性用来书写路由路径 tag属性:用来将router-link渲染成指定的标签
3.5 默认路由
作用:用来在第一次进入界面是显示一个默认的组件
const router = new VueRouter({
routes:[
{path:'/',redirect:"/login"},
{path:'/login',component:login},
{path:'/reg',component:register},
{path:'*',component:notfound},
] ,
});
13.6 路由中参数传递
-
通过?号形式拼接参数 <router-link to="/login?id=21&name=zhangsan">我要登录</router-link>
-
组件中获取参数 const login = {
template:'<h1>用户登录</h1>',
data(){return {}},
methods:{},
created(){
console.log("=============>"+this.$route.query.id+"======>"+this.$route.query.name);
}
};
-
通过使用路径方式传递参数 <router-link to="/register/24/张三">我要注册</router-link>
var router = new VueRouter({
routes:[
{path:'/register/:id/:name',component:register}
]
});
-
组件中获取参数 const register = {
template:'<h1>用户注册{{ $route.params.name }}</h1>',
created(){
console.log("注册组件中id: "+this.$route.params.id+this.$route.params.name);
}
};
13.7 嵌套路由
-
声明最外层和内层路由 <template id="product">
<div>
<h1>商品管理</h1>
<router-link to="/product/add">商品添加</router-link>
<router-link to="/product/edit">商品编辑</router-link>
<router-view></router-view>
</div>
</template>
const product={
template:'#product'
};
const add = {
template:'<h4>商品添加</h4>'
};
const edit = {
template:'<h4>商品编辑</h4>'
};
-
创建路由对象含有嵌套路由 const router = new VueRouter({
routes:[
{
path:'/product',
component:product,
children:[
{path:'add',component: add},
{path:'edit',component: edit},
]
},
]
});
-
注册路由对象 const app = new Vue({
el: "#app",
data: {},
methods: {},
router,
});
-
测试路由 <router-link to="/product">商品管理</router-link>
<router-view></router-view>
|