自定义指令总结:
一:定义语法:
(1)局部指令:
new Vue({
directives{指令名,配置对象}
})
或
new Vue({
directives{指令名,回调函数}
})
(2)全局对象
Vue.directives(指令名,配置对象)
或
Vue.directives(指令名,回调函数)
二:配置对象中常用的三个回调
(1)bind:指令与元素成功绑定时的调用
(2)inserted:指令所在元素被插入页面时的调用
(3)update:指令所在模板结构被重新解析时调用
三:备注
1.指令定义时不加v-,但使用时要加v-
2.指令名如果是多个单词,要使用kebab-case命名方式,不要用驼峰
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>自定义指令</title>
<script type="text/javascript" src="../js/vue.js"></script>
</head>
<body>
<!--
自定义指令总结:
一:定义语法:
(1)局部指令:
new Vue({
directives{指令名,配置对象}
})
或
new Vue({
directives{指令名,回调函数}
})
(2)全局对象
Vue.directives(指令名,配置对象)
或
Vue.directives(指令名,回调函数)
二:配置对象中常用的三个回调
(1)bind:指令与元素成功绑定时的调用
(2)inserted:指令所在元素被插入页面时的调用
(3)update:指令所在模板结构被重新解析时调用
三:备注
1.指令定义时不加v-,但使用时要加v-
2.指令名如果是多个单词,要使用kebab-case命名方式,不要用驼峰
-->
<div id="root">
<h2>当前n值是:<span v-text="n"></span></h2>
<h2>方法十倍后的n值是:<span v-big="n"></span></h2>
<button @click="n++">点我n+1</button>
<hr>
<input type="text" v-fbind:value="n">
</div>
</body>
<script type="text/javascript">
Vue.config.productionTip=false
new Vue({
el:"#root",
data:{
n:1,
},
directives:{
//big函数何时会被调用 1.指令与元素成功绑定时(一上来) 2.指令所在模板被重新解析时
big(element,binding){
// console.log('big')
element.innerText=binding.value*10
},
fbind:{
//指令与元素成功绑定时
bind(element,binding){
element.value=binding.value
},
//指令所在元素被插入页面时
inserted(element,binding){
element.focus()
},
//指令所在模板被重新解析时
update(element,binding){
element.value=binding.value
element.focus()
}
}
}
})
</script>
</html>
生命周期:
1.又名:生命周期回调函数,生命周期函数,生命周期钩子
2.是什么:Vue在关键时刻帮我们调用的一些特殊名称的函数
3.生命周期函数名字不可更改,但是函数的具体内容是程序员根据需求编写的
4.生命周期函数中的this指向的是vm或组件实例函数
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>引出生命周期</title>
<script type="text/javascript" src="../js/vue.js"></script>
</head>
<body>
<!--
生命周期:
1.又名:生命周期回调函数,生命周期函数,生命周期钩子
2.是什么:Vue在关键时刻帮我们调用的一些特殊名称的函数
3.生命周期函数名字不可更改,但是函数的具体内容是程序员根据需求编写的
4.生命周期函数中的this指向的是vm或组件实例函数
-->
<div id="root">
<h2 :style="{opacity}">欢迎学习Vue</h2>
</div>
</body>
<script type="text/javascript">
Vue.config.productionTip=false
new Vue({
el:"#root",
data:{
opacity:1
},
methods: {
},
//Vue完成模板的解析并把初始的真实DOM元素放如页面(完成挂载)调用mounted
mounted(){
console.log('mounted')
setInterval(()=>{
this.opacity -=0.01
if(this.opacity <=0) this.opacity=1
},16)
}
})
</script>
</html>
生命周期流程图
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>分析生命周期</title>
<script type="text/javascript" src="../js/vue.js"></script>
</head>
<body>
<div id="root">
<h2 v-text="n"></h2>
<h2>当前的n值是:{{n}}</h2>
<button @click="add">点我n+1</button>
<button @click="bye">点我销毁vm</button>
</div>
</body>
<script type="text/javascript">
Vue.config.productionTip=false
new Vue({
el:"#root",
data:{
n:1
},
methods: {
add(){
console.log('add')
this.n++
},
bye(){
console.log('bye')
this.$destroy()
}
},
watch:{
n(){
console.log('n变了')
}
},
beforeCreate() {
console.log('beforeCreate')
},
created() {
console.log('created')
},
beforeMount() {
console.log('beforeMount')
},
mounted() {
console.log('mounted')
},
beforeUpdate() {
console.log('beforeUpdate')
},
updated() {
console.log('update')
},
beforeDestroy() {
console.log('bedoreDestroy')
},
destroyed() {
console.log('destroyed')
},
})
</script>
</html>
常用的生命周期钩子:
1.mounted:发生ajax请求,启动定时器,绑定自定义事件,订阅消息等【初始化操作】
2.beforeDestroy:清除定时器,解绑自定义事件,取消订阅消息等【首位工作】
关于销毁Vue实例
1.销毁后借助Vue开发者工具看不到任何信息
2.销毁后自定义事件会失效,但原生DOM事件仍然有效
3.一般不会在bedoreDestroy操作数据,因为即便操作数据,也不会再触发更新流程
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>引出生命周期</title>
<script type="text/javascript" src="../js/vue.js"></script>
</head>
<body>
<!--
常用的生命周期钩子:
1.mounted:发生ajax请求,启动定时器,绑定自定义事件,订阅消息等【初始化操作】
2.beforeDestroy:清除定时器,解绑自定义事件,取消订阅消息等【首位工作】
关于销毁Vue实例
1.销毁后借助Vue开发者工具看不到任何信息
2.销毁后自定义事件会失效,但原生DOM事件仍然有效
3.一般不会在bedoreDestroy操作数据,因为即便操作数据,也不会再触发更新流程
-->
<div id="root">
<h2 :style="{opacity}">欢迎学习Vue</h2>
<button @click="opacity=1">透明度设置为一</button>
<button @click="stop">点我停止变换</button>
</div>
</body>
<script type="text/javascript">
Vue.config.productionTip=false
new Vue({
el:"#root",
data:{
opacity:1
},
methods: {
stop(){
// clearInterval(this.timer)
this.$destroy()
}
},
mounted(){
console.log('mounted')
this.timer=setInterval(()=>{
this.opacity -=0.01
if(this.opacity <=0) this.opacity=1
},16)
},
beforeDestroy() {
console.log('vm干掉')
clearInterval(this.timer)
},
})
</script>
</html>
组件
Vue使用组件的三大步骤:
1.定义组件(创建组件)
2.注册组件
3.使用组件(写组件标签)
1.如何定义一个组件?
使用Vue.extend(options)创建,其中options和new Vue(options)传入的哪个options几乎一样,但是也有区别
区别如下:
1.el不要写,为什么? --最终组件都要经过一个vm的管理,由vm中的el绝对服务哪个容器
2.data必须写成函数,为什么? --避免组件被复用,数据存在引用关系
备注:使用template可以配置组件结构
2.如何注册组件?
1.局部注册:考new Vue的时候传入components选项
2.全局注册:考Vue.component('组件名',组件)
3.编写组件标签
<school></school>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>基本使用</title>
<script type="text/javascript" src="../js/vue.js"></script>
</head>
<body>
<div id="root">
<xuexiao></xuexiao>
<hr>
<xuesheng></xuesheng>
</div>
<div id="root2">
<student></student>
<hello></hello>
</div>
</body>
<script type="text/javascript">
Vue.config.productionTip=false
//第一步,创建school组件
const school=Vue.extend({
//组件定义时,不需要写el配置项,因为最终所有的组件都会被一个vm管理,由vm决定服务于哪个容器
template:`
<div>
<h2>学校名称:{{schoolName}}</h2>
<h2>学校地址:{{adress}}</h2>
<button @click="showName">点我提示学校名</button>
</div>
`,
data(){
return{
schoolName:'尚硅谷',
adress:'北京昌平',
}
},
methods: {
showName(){
alert(1)
}
},
})
//创建student组件
const student=Vue.extend({
template:`
<div>
<h2>学生姓名:{{studentName}}</h2>
<h2>学生年龄:{{age}}</h2>
</div>`,
data(){
return{
studentName:'张三',
age:18
}
}
})
//
const hello =Vue.extend({
template:`
<div>你好啊</div>
`,
data(){
return{
name:'tom'
}
}
})
//全局注册
Vue.component('hello',hello)
//创建vm
new Vue({
el:"#root",
//第二步,组件注册(局部注册)
components:{
xuexiao:school,
xuesheng:student
}
})
new Vue({
el:'#root2',
components:{
student
}
})
</script>
</html>