钩子函数
beforeCreate和created的使用//创建前和创建后
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<script src="../vue.js"></script>
</head>
<body>
<div id="app">{{msg}}</div>
<script>
var vm=new Vue({
el:'#app',
data:{
msg:'张三'
},
beforeCreate(){
console.log('实例创建之前');
console.log(this.$data.msg);
},
created(){
console.log('实例创建之后');
console.log(this.$data.msg)
}
})
</script>
</body>
</html>
页面挂载
挂载点el存在
beforeMount和mounted//挂载前和挂载后
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<script src="../vue.js"></script>
</head>
<body>
<div id="app">{{msg}}</div>
</body>
<script>
var vm=new Vue({
el:'#app',
data:{
msg:'张三'
},
beforeMount(){
console.log('挂载之前')
console.log(this.$el.innerHTML)
},
mounted(){
console.log('挂载之后')
console.log(this.$el.innerHTML)
}
})
</script>
</html>
数据更新
挂载完成后数据变化,执行beforeUpdate和updated
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<script src="../vue.js"></script>
</head>
<body>
<div id="app">
<div v-if="isShow" ref="self">test</div>
<button @click="isShow=!isShow">更新</button>
</div>
<script>
var vm=new Vue({
el:'#app',
data:{
isShow:false
},
beforeUpdate(){
console.log('更新之前')
console.log(this.$refs.self)
},
updated(){
console.log('更新之后')
console.log(this.$refs.self)
}
})
</script>
</body>
</html>
实例销毁
beforeDestroy和destroyed//销毁前和销毁后
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<script src="../vue.js"></script>
</head>
<body>
<div id="app">
<div ref="self">test</div>
</div>
<script>
var vm=new Vue({
el:'#app',
data:{
msg:'张三'
},
beforeDestroy(){
console.log('之前')
console.log(this.$refs.self)
console.log(this.msg)
console.log(vm)
},
destroyed(){
console.log('销毁之后')
console.log(this.$refs.self)
console.log(this.msg)
console.log(vm)
}
})
</script>
</body>
</html>
自定义组件
Vue.directive
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<script src='../vue.js'></script>
</head>
<body>
<div id="app">
<input type="text" v-focus="true">
</div>
<script>
Vue.directive('focus',{
inserted(el,binding){
if(binding.value){
el.focus()
}
}
})
var vm=new Vue({ el :'#app'})
</script>
</body>
</html>
Vue.use安装插件
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<script src="../vue.js"></script>
</head>
<body>
<div id="app" v-my-directive>
</div>
<script>
//定义自定义插件对象
let MyPlugin={}
//编写插件的install方法
MyPlugin.install=function(Vue,options){
console.log(options)
//在插件中为vue添加自定义指令
Vue.directive('my-directive',{
bind(el,binding){
//为指令v-my-directive绑定的DOM元素设置style样式
el.style='width:100px;height:100px;background-color:#ccc'
}
})
}
Vue.use(MyPlugin,{someOption:true})
var vm=new Vue({
el:'#app'
})
</script>
</body>
</html>
Vue.extend构造器扩展
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<script src="../vue.js"></script>
</head>
<body>
<div id="app1">app1:{{title}}</div>
<div id="app2">app2:{{title}}</div>
<script>
var Vue2=Vue.extend({
data(){
return {title:'hello'}
}
})
var vm1=new Vue({el:'#app1'})
var vm2=new Vue2({el:'#app2'})
</script>
</body>
</html>
Vue.set响应式对象添加属性
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<script src="../vue.js"></script>
</head>
<body>
<div id="app">
<div>{{a}}</div>
<div>{{obj.b}}</div>
</div>
<script>
var vm = new Vue({
el: '#app',
data: {
a: 'woshi',
obj: {},
},
})
Vue.set(vm.obj, 'b', '我是新加进来的')
</script>
</body>
</html>
Vue.mixin全局注册混入
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<script src="../vue.js"></script>
</head>
<body>
<div id="app"></div>
<script>
Vue.mixin({
created(){
var myOption = this.$options.myOption
if(myOption){
console.log(myOption.toUpperCase())
}
}
})
var vm=new Vue({myOption:'hello vue!'})
</script>
</body>
</html>
vm.$props接受从上级组件向下传递的数据
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<script src="../vue.js"></script>
</head>
<body>
<div id="app">
<!-- 父组件 -->
<my-parent></my-parent>
</div>
<template id="parent">
<div>
<h3>手机信息搜索</h3>
手机品牌:<input type="text" v-model="brand">
<!-- 子组件 -->
<my-child v-bind:name="brand"></my-child>
</div>
</template>
<!-- 子组件模板 -->
<template id="child">
<ul>
<li>手机品牌:{{show.brand}}</li>
<li>手机型号:{{show.type}}</li>
<li>市场价格:{{show.price}}</li>
</ul>
</template>
<script>
Vue.component('my-parent',{
template:'#parent',
data(){
return{
brand:''
}
}
})
Vue.component('my-child',{
template:'#child',
data(){
return{
content:[
{
brand:'华为',type:'mate20',price:'20000'
},
{
brand:'vivo',type:'z3',price:'1999'
},
{
brand:'一加',type:'OnePlus7',price:'2999'
},
{
brand:'三星',type:'S8',price:'3299'
},
{
brand:'苹果',type:'iPhonex',price:'4000'
},
],
show:{brand:'',type:'',price:''}
}
},
props:['name'],
watch:{
name(){
if(this.$props.name){
var found=false
this.content.forEach((value,index)=>{
if(value.brand==this.$props.name){
found=value
}
})
this.show=found ? found:{brand:'',type:'',price:''}
}
else{
return
}
}
}
})
var vm=new Vue({
el:'#app',
data:{}
})
</script>
</body>
</html>
vm.$options传入选项
数组 对象 函数
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<script src="../vue.js"></script>
</head>
<body>
<div id="app">
<p>{{base}}</p>
<p>{{noBase}}</p>
</div>
<script>
var vm=new Vue({
el:'#app',
customOption:'我是自定义数据',
data:{
base:'我是基础数据'
},
created(){
this.noBase=this.$options.customOption
}
})
</script>
</body>
</html>
vm.$el访问vm实例使用的根DOM元素
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<script src="../vue.js"></script>
</head>
<body>
<div id="app">
<p>我是根标签结构</p>
</div>
<script>
var vm=new Vue({
el:'#app'
})
vm.$el.innerHTML='<div>我是替换后的div标签</div>'
</script>
</body>
</html>
vm.$children访问实例的直接子组件
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<script src="../vue.js"></script>
</head>
<body>
<div id="app">
<button @click="child">查看子组件</button>
<my-component></my-component>
</div>
<script>
Vue.component('my-component',{template:'<div>myComponent</div>'})
var vm=new Vue({
el:'#app',
methods:{
child(){
console.log(this.$children)
}
}
})
</script>
</body>
</html>
vm.$root访问组件树的根Vue实例
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<script src="../vue.js"></script>
</head>
<body>
<div id="app">
<my-component></my-component>
</div>
<script>
Vue.component('my-component', {
template: '<button @click="root">查看根实例</button>',
methods:{
root(){
console.log(this.$root)
console.log(this.$root==vm.$root)
}
}
})
var vm=new Vue({el:'#app'})
</script>
</body>
</html>
vm.$slots访问定义在组件内部的template模板
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<script src="../vue.js"></script>
</head>
<body>
<div id="app">
<my-component>你好</my-component>
</div>
<template id="first">
<div>
<slot></slot>
</div>
</template>
<script>
Vue.component('my-component',{template:'#first'})
var vm=new Vue({el:'#app'})
</script>
</body>
</html>
若有多个插槽
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<script src="../vue.js"></script>
</head>
<body>
<div id="app">
<my-component>你好
<template v-slot:second>
<div>内部结构</div>
</template>
</my-component>
</div>
<template id="first">
<div>
<slot></slot>
<slot name="second"></slot>
</p>
</template>
<script>
Vue.component('my-component', { template:'#first' })
var vm = new Vue({ el: '#app' })
console.log(vm.$children[0].$slots.second[0].children[0].text)
</script>
</body>
</html>
vm.$attrs获取组件属性,不包括class,style,以及被声明prop的属性
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<script src="../vue.js"></script>
</head>
<body>
<div id="app">
<my-component id="test"></my-component>
</div>
<script>
Vue.component('my-component',{template:'<button @click="showAttrs">查看属性</button>',
methods:{
showAttrs(){
console.log(this.$attrs)
}
}
})
var vm=new Vue({el:'#app'})
</script>
</body>
</html>
全局配置,关闭提示信息
引入vue.js情况下
Vue.config.productionTip=false
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<script src="../vue.js"></script>
</head>
<body>
<script>
Vue.config.productionTip=false
</script>
</body>
</html>
silent取消vue日志和警告
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<script src="../vue.js"></script>
</head>
<body>
<div id="app">
{{msg}}
</div>
<script>
Vue.config.silent = true
var vm=new Vue({el:'#app'})
</script>
</body>
</html>
devtools不允许调试
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<script src="../vue.js"></script>
</head>
<body>
<script>Vue.config.devtools=false</script>
</body>
</html>
组件进阶
mixins是分发组件可复用功能的方式
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<script src="../vue.js"></script>
</head>
<body>
<script>
// 定义myMixin对象
var myMixin={
created(){
this.hello()
},
methods:{
hello(){
console.log('hello from mixin!')
}
}
}
var Component=Vue.extend({
mixins:[myMixin]
})
var component=new Component()
</script>
</body>
</html>
数据冲突,组数据优先
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<script src="../vue.js"></script>
</head>
<body>
<script>
var mixin = {
data() {
return { message: 'hello' }
}
}
var vm=new Vue({
mixins:[mixin],
data:{
message:'goodbye'
},
created(){
console.log(this.$data.message)
}
})
</script>
</body>
</html>
自己的钩子函数先调用
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<script src="../vue.js"></script>
</head>
<body>
<script>
var mixin={
created(){
console.log('gouzi')
}
}
var vm=new Vue({
mixins:[mixin],
created(){
console.log('组件函数')
}
})
</script>
</body>
</html>
render实现虚拟DOM操作
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<script src="../vue.js"></script>
</head>
<body>
<div id="app">
<my-component>成功渲染</my-component>
</div>
<script>
Vue.component('my-component',{
render(createElement){
return createElement('p',{
style:{
color:'red',
fontsize:'16px',
backgroundColor:'#eee'
}
},this.$slots.default)
}
})
var vm=new Vue({el:'#app'})
</script>
</body>
</html>
createElement创建虚拟节点
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<script src="../vue.js"></script>
</head>
<body>
<div id="app">
<my-component>
<template v-slot:header>
<div style="background-color: #ccc;height: 50px;">
这里是导航栏</div>
</template>
<template v-slot:content>
<div style="background-color: #ddd;height: 50px;">
这里是图书展示信息</div>
</template>
<template v-slot:footer>
<div style="background-color: #eee;height: 50px;">
这里是底部信息</div>
</template>
</my-component>
</div>
<script>
Vue.component('my-component', {
render(createElement) {
return createElement(
'div', [createElement('header', this.$slots.header),
createElement('content', this.$slots.content), createElement('footer', this.$slots.footer)])
}
})
var vm=new Vue({el:'#app'})
</script>
</body>
</html>
明天加油!!!!!!