所有demo均可以在技术胖博客找到,他的博客写得非常好,也经常更新一些新的知识,有兴趣的小伙伴可以移步去他的博客。链接:web前端技术
1.vue.directive自定义指令
<!DOCTYPE html>
<html>
<head>
<title>vue.directive自定义指令</title>
</head>
<body>
<h1>vue.directive自定义指令</h1>
<hr>
<div id="app">
<div>定义一些属于自己的指令</div>
<div v-jspang="red">{{count}}</div>
<button @click="addCount">add</button>
</div>
<button onclick="unbind()">解绑</button>
<script type="text/javascript" src="../assets/js/vue.js"></script>
<script>
function unbind(){
app.$destroy()
}
// el: 指令所绑定的元素,可以用来直接操作DOM。
// binding: 一个对象,包含指令的很多信息。
// vnode: Vue编译生成的虚拟节点
Vue.directive('jspang',{
bind:function(el,binding){//被绑定
el.style = 'color:'+binding.value
console.log('1 - bind');
},
inserted:function(){//绑定到节点
console.log('2 - inserted');
},
update:function(){//组件更新
console.log('3 - update');
},
componentUpdated:function(){//组件更新完成
console.log('4 - componentUpdated');
},
unbind:function(){//解绑
console.log('5 - unbind');
}
})
// bind:只调用一次,指令第一次绑定到元素时调用,用这个钩子函数可以定义一个绑定时执行一次的初始化动作。
// inserted:被绑定元素插入父节点时调用(父节点存在即可调用,不必存在于document中)。
// update:被绑定于元素所在的模板更新时调用,而无论绑定值是否变化。通过比较更新前后的绑定值,可以忽略不必要的模板更新。
// componentUpdated:被绑定元素所在模板完成一次更新周期时调用。
// unbind:只调用一次,指令与元素解绑时调用。
var app = new Vue({
el:"#app",
data:{
count: 10,
red:'red'
},
methods:{
addCount(){
this.count++;
}
}
})
</script>
</body>
</html>
2.Vue.extend构造器的延伸
<!DOCTYPE html>
<html>
<head>
<title>Vue.extend构造器的延伸</title>
</head>
<body>
<h1>Vue.extend构造器的延伸</h1>
<hr>
<div id="app">
<div>当在模板中遇到该组件名称作为标签的自定义元素时,会自动调用“扩展实例构造器”来生产组件实例,并挂载到自定义元素上</div>
<author></author>
</div>
<script type="text/javascript" src="../assets/js/vue.js"></script>
<script type="text/javascript">
var authorExtend = Vue.extend({
template:"<p><a :href='authorURL'>{{authoName}}</a></p>",
data:function(){
return{
authoName: ' 小镇青年,心怀远方 ',
authorURL:'https://blog.csdn.net/sinat_34531165/'
}
}
})
new authorExtend().$mount('author')
</script>
<script>
var app = new Vue({
el:"#app",
data:{
message:"你好,世界!"
}
})
</script>
</body>
</html>
3.Vue.set全局操作
<!DOCTYPE html>
<html>
<head>
<title>Vue.set全局操作</title>
</head>
<body>
<h1>Vue.set全局操作</h1>
<hr>
<div id="app">
<div>Vue.set 的作用就是在构造器外部操作构造器内部的数据、属性或者方法。</div>
<div>{{count}}</div>
<button @click="vueAdd">Vue对象的方法添加</button>
</div>
<button onclick="vueSet()">Vue.set改变</button>
<button onclick="add()">直接操作外部数据</button>
<script type="text/javascript" src="../assets/js/vue.js"></script>
<script type="text/javascript">
</script>
<script>
var outData = {
count:0
}
function vueSet(){
Vue.set(outData,'count',0)
}
function add(){
outData.count++;
}
var app = new Vue({
el:"#app",
data:outData,
methods:{
vueAdd(){
this.count++;
}
}
})
</script>
</body>
</html>
由于Javascript的限制,Vue不能自动检测以下变动的数组。当你利用索引直接设置一个项时,vue不会为我们自动更新。当
你修改数组的长度时,vue不会为我们自动更新。
4.Vue.set番外篇
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<script type="text/javascript" src="../assets/js/vue.js"></script>
<title>Vue.set 全局操作</title>
</head>
<body>
<h1>Vue.set 全局操作</h1>
<hr>
<div id="app">
<div>
由于Javascript的限制,Vue不能自动检测以下变动的数组。当你利用索引直接设置一个项时,vue不会为我们自动更新。当你修改数组的长度时,vue不会为我们自动更新。
</div>
<div>{{count}}</div>
<ul>
<li v-for="item in arr">{{item}}</li>
<button @click="pushArr()">内部更改</button>
</ul>
</div>
<button onclick="add()">外部添加</button>
<button onclick="addSet()">v.set外部添加</button>
<script type="text/javascript">
var outData = {
count:0,
arr:['aaa','bbb','ccc']
}
function add(){
//如果注释掉这行 则下行不会被监听到
// outData.count++;
app.arr[1] = 'ddcccd';
console.log('我已经执行了');
}
function addSet(){
let i = outData.count++;
Vue.set(app.arr,1,i)
}
var app = new Vue({
el:"#app",
data:outData,
methods:{
pushArr(){
app.arr[1] = 'ddd';
console.log('我已经执行了')
}
}
})
</script>
</body>
</html>
5.Vue 的生命周期
<!DOCTYPE html>
<html>
<head>
<title>Vue 的生命周期</title>
</head>
<body>
<h1>Vue 的生命周期</h1>
<hr>
<div id="app">
<div>{{count}}</div>
<button @click="add">add</button>
</div>
<button onclick="app.$destroy()">销毁 解绑</button>
<script type="text/javascript" src="../assets/js/vue.js"></script>
<script>
var app = new Vue({
el:"#app",
data:{
count:0
},
methods:{
add(){
this.count++;
}
},
beforeCreate(){
console.log("1-beforeCreate 初始化之后");
},
created(){
console.log("2-created 创建完成");
},
beforeMount(){
console.log("3-beforeMount 挂载之前");
},
mounted(){
console.log("4-mounted 被创建");
},
beforeUpdate(){
console.log("5-beforUpdeta 数据更新之前")
},
updated(){
console.log("6-updated 数据更新之后")
},
activated(){
console.log("7-activated")
},
deactivated(){
console.log("8-activated")
},
beforeDestroy(){
console.log("8-beforeDestroy 销毁之前")
},
destroyed(){
console.log("8-destroyed 销毁之后")
}
})
</script>
</body>
</html>
6.Template 制作模版
<!DOCTYPE html>
<html>
<head>
<title>Template 制作模版</title>
</head>
<body>
<h1>Template 制作模版</h1>
<hr>
<div id="app">{{message}}</div>
<script type="text/javascript" src="../assets/js/vue.js"></script>
<script>
var app = new Vue({
el:"#app",
data:{
message:"你好,世界!"
},
template:`
<div style="color:red;">直接在构造器里的template选项后边编写。这种写法比较直观,但是如果模板html代码太多,不建议这么写。</div>
`
})
</script>
</body>
</html>
<!DOCTYPE html>
<html>
<head>
<title>Template 制作模版</title>
</head>
<body>
<h1>Template 制作模版</h1>
<hr>
<div id="app">{{message}}</div>
<template id="demo2">
<h2 style="color:red;">template标签里的模板</h2>
</template>
<script type="text/javascript" src="../assets/js/vue.js"></script>
<script>
var app = new Vue({
el:"#app",
data:{
message:"你好,世界!"
},
template:"#demo2"
})
</script>
</body>
</html>
<!DOCTYPE html>
<html>
<head>
<title>Template 写在script标签里的模板</title>
</head>
<body>
<h1>Template 写在script标签里的模板</h1>
<hr>
<div id="app">{{message}}</div>
<script type="x-template" id="demo3">
<h2 style="color:red;">Template 写在script标签里的模板,这种写模板的方法,可以让模板文件从外部引入。</h2>
</script>
<script type="text/javascript" src="../assets/js/vue.js"></script>
<script>
var app = new Vue({
el:"#app",
data:{
message:"你好,世界!"
},
template:"#demo3"
})
</script>
</body>
</html>
7.Component 初识组件
<!DOCTYPE html>
<html>
<head>
<title>Component 初识组件</title>
</head>
<body>
<h1>Component 初识组件</h1>
<hr>
<div>前言(废话):component组件是Vue学习的重点、重点、重点,重要的事情说三遍。所以你必须学好Vue component。其实组件就是制作自定义的标签,这些标签在HTML中是没有的。比如:,那我们就开始学习这种技巧吧</div>
<hr>
<div id="app">
{{message}}
<jspang></jspang>
<panda></panda>
<div>组件注册的是一个标签,而指令注册的是已有标签里的一个属性。在实际开发中我们还是用组件比较多,指令用的比较少。因为指令看起来封装的没那么好,这只是个人观点。</div>
</div>
<script type="text/javascript" src="../assets/js/vue.js"></script>
<script>
// 注册全局组件
Vue.component('jspang',{
template:`
<div style="color:red;">全局化注册的jspang标签</div>
`
})
var app = new Vue({
el:"#app",
data:{
message:"你好,世界!"
},
components:{
'panda':{
template:`
<div style="color:blue;">局部注册组件局部,构造器里的components 是加s的,而全局注册是不加s的。</div>
`
}
}
})
</script>
</body>
</html>
8.Component 组件props 属性设置
<!DOCTYPE html>
<html>
<head>
<title>Component 组件props 属性设置</title>
</head>
<body>
<h1>Component 组件props 属性设置</h1>
<hr>
<div id="app">
<panda :formhere="message"></panda>
</div>
<script type="text/javascript" src="../assets/js/vue.js"></script>
<script>
var app = new Vue({
el:"#app",
data:{
message:"你好,世界!"
},
components:{
panda:{
template:`<div style="color:red;">Panda from {{formhere}}</div>`,
props:["formhere"]
}
}
})
</script>
</body>
</html>
9.Component 父子组件关系
<!DOCTYPE html>
<html>
<head>
<title>Component 父子组件关系</title>
</head>
<body>
<h1>Component 父子组件关系</h1>
<hr>
<div id="app">
<div v-text="message"></div>
<div>mes:{{message}}</div>
<father></father>
</div>
<script type="text/javascript" src="../assets/js/vue.js"></script>
<script>
var son = {
template:`
<div style="color:#ffc107;">
外部构造器 son,子组件必须写在父组件前面,否则会报错
</div>
`
}
var father = {
template:`
<div>
<div>外部构造器 Father</div>
<son></son>
</div>
`,
components:{
"son":son
}
}
var app = new Vue({
el:"#app",
data:{
message:"你好,世界!"
},
components:{
"father":father
}
})
</script>
</body>
</html>
10.Component 标签
<!DOCTYPE html>
<html>
<head>
<title>Component 标签</title>
</head>
<body>
<h1>Component 标签</h1>
<hr>
<div>Vue框架自定义的标签,它的用途就是可以动态绑定我们的组件,根据数据的不同更换不同的组件</div>
<div id="app">
{{message}}
<component-a></component-a>
<component-b></component-b>
<component-c></component-c>
<hr>
<component :is="who"></component>
<button @click="changeComponent">动态切换组件</button>
</div>
<script type="text/javascript" src="../assets/js/vue.js"></script>
<script>
var componentA = {
template:`<div style="color:red;">我是componentA</div>`
}
var componentB = {
template:`<div style="color:green;">我是componentB</div>`
}
var componentC = {
template:`<div style="color:pink;">我是componentC</div>`
}
var app = new Vue({
el:"#app",
data:{
message:"你好,世界!",
who: 'componentA'
},
components:{
"componentA":componentA,
"componentB":componentB,
"componentC":componentC
},
methods:{
changeComponent(){
if (this.who == 'componentA') {
this.who = 'componentB'
}else if(this.who == 'componentB'){
this.who = 'componentC'
}else if(this.who == 'componentC'){
this.who = 'componentA'
}
}
}
})
</script>
</body>
</html>