按照传统,首先输出hello world.
1.数据绑定
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>hello world</title>
<script src="https://cdn.staticfile.org/vue/2.4.2/vue.min.js"></script>
</head>
<body>
<div id="app">
<p>{{ message }}</p>
<p v-bind:title="message">边境牧羊犬</p>
</div>
<script>
var vm = new Vue({
el: '#app',
data: {
message: 'Hello world.'
}
})
</script>
</body>
</html>
内置指令v-bind为标签绑定title属性。
打开控制台,输入vm.message="hello vue",页面就会刷新成hello vue,之前渲染完成后如需再次修改视图,就只能通过获取DOM的方法进行修改,手动维持数据和视图的一致,现在只需要改数据就可以,代码更加简洁易懂、提升效率。这就是vue的基础特性数据绑定。
2.双向数据绑定
v-model指令可以对表单元素进行双向数据绑定,在修改表单元素值的同时,实例vm中对应的属性值也同时更新。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>hello world</title>
<script src="https://cdn.staticfile.org/vue/2.4.2/vue.min.js"></script>
</head>
<body>
<div id="app">
<!--text-->
<input type="text" v-model="message">
<span>你输入的是:{{message}}</span>
<br>
<!--radio-->
<label><input type="radio" value="male" v-model="gender">男</label>
<label><input type="radio" value="female" v-model="gender">女</label>
<p>{{message}}</p>
<!--checkbox-->
<input type="checkbox" v-model="checked">
<span>checked:{{checked}}</span>
<br>
<!--多个勾选框-->
<label><input type="checkbox" value="1" v-model="multiChecked">1</label>
<label><input type="checkbox" value="2" v-model="multiChecked">2</label>
<label><input type="checkbox" value="3" v-model="multiChecked">3</label>
<p>MultiChecked:{{multiChecked.join('|')}}</p>
<!--select-->
<select v-model="selected">
<option selected>A</option>
<option>B</option>
<option>C</option>
</select>
<span>Selected:{{selected}}</span>
<br>
<br>
<select v-model="multiSelected" multiple>
<option selected>A</option>
<option>B</option>
<option>C</option>
</select>
<span>MultiSelected:{{multiSelected.join('|')}}</span>
</div>
<script>
var vm = new Vue({
el: '#app',
data: {
message:'',
gender:'',
checked:'',
multiChecked:[],
selected:'',
multiSelected:[],
a:'checked',
b:'checked',
}
});
</script>
</body>
</html>
3.模板渲染
早期的web项目一般都是服务器进程从数据库获取数据后,利用后端模板引擎,将数据加载进来生成HTML,再传到用户浏览器解析成可见的页面。而前端渲染则是在浏览器中进行,利用js把数据和HTML模板进行组合。前后端渲染互有优缺点,需要根据业务需要选择技术方案。
前端渲染的优点:
①业务分离,只需要后端提供数据接口,前端开发也不需要部署对应的后端环境,通过代理服务器工具就能远程获取后端数据开发。
②计算量转移,原本需要后端渲染的事情交给前端,减轻服务器压力。
后端渲染优点:
①搜索引擎舒服滴很。
②首页加载时间短,我们基于angular做的系统,那个加载中的圈圈看着闹心。
vue.js 2.0已经支持服务器端渲染,例如基于React 的服务器端渲染应用框架 Next.js的服务器端渲染。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>hello world</title>
<script src="https://cdn.staticfile.org/vue/2.4.2/vue.min.js"></script>
</head>
<body>
<div id="app">
<ul>
<li v-for="item in items">
<h3>{{item.title}}</h3>
<p>{{item.description}}</p>
</li>
</ul>
</div>
<script>
var vm = new Vue({
el: '#app',
data: {
items:[
{title:'《唐诗三百首》',description:'劝君更进一杯酒,西出阳关无故人'},
{title:'《诗经》',description:'窈窕淑女,君子好逑'},
{title:'《宋词》',description:'稻花香里说丰年,听取蛙声一片'},
{title:'《元曲》',description:'快使用双节棍,哼哼哈嘿'}
]
}
});
</script>
</body>
</html>
items为data中的属性名,item为别名,可以通过item来获取当前数组遍历的每个元素。
4.事件绑定
vue.js提供了内置指令v-on指令用来监听DOM事件,通常直接在模板内使用,不用通过js方式获取DOMM元素,然后绑定事件。
绑定methods函数:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>hello world</title>
<script src="https://cdn.staticfile.org/vue/2.4.2/vue.min.js"></script>
</head>
<body>
<div id="app">
<button v-on:click="say">打招呼</button>
</div>
<script>
var vm = new Vue({
el: '#app',
data: {
msg:'hello Moses',
},
methods:{
say:function(){
alert(this.msg);
}
}
});
</script>
</body>
</html>
5.自定义指令
和js中的变量一样,分全局变量和局部变量,自定义指令也分全局注册和局部注册。
通过Vue.derective(id,definition)方法注册一个指令,封装对DOM元素的重复处理行为,提高代码复用率。
全局注册指令:[Vue.directive(id,definition)方法]
// 注册一个全局自定义指令 `v-focus`
Vue.directive('focus', {
// 当被绑定的元素插入到 DOM 中时……
inserted: function (el) {
// 聚焦元素
el.focus()
}
})
这里只是注册了指令,并没有赋予这个指令功能,指令要接受参数id和定义对象,id是指令的唯一标志,定义对象则是指令的相关属性和钩子函数,例如可以传入代码中的definition定义对象,主要是三个钩子函数:bind、update和unbind。
全局指令用法:
<div v-focus> </div>
局部自定义指令:
directives: {
focus: {
// 指令的定义
inserted: function (el) {
el.focus()
}
}
}
局部自定义指令用法:(只能在组件内调用)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>hello world</title>
<script src="https://cdn.staticfile.org/vue/2.4.2/vue.min.js"></script>
</head>
<body>
<div id="container">
<p>{{msg}}</p>
<button @click="handleClick">点 我</button>
<h1 v-if="count < 8" v-change="count">it is a custom directive</h1>
</div>
<script>
//directive
new Vue({
el: '#container',
data: {
msg: 'Hello Vue',
count: 0
},
methods: {
handleClick: function () {
//按钮单击,count自增
this.count++;
}
},
directives: {
change: {
bind: function (el, bindings) {
console.log('指令已经绑定到元素了');
console.log(el);
console.log(bindings);
//准备将传递来的参数
// 显示在调用该指令的元素的innerHTML
el.innerHTML = bindings.value;
},
update: function (el, bindings) {
console.log('指令的数据有所变化');
console.log(el);
console.log(bindings);
el.innerHTML = bindings.value;
if (bindings.value == 8) {
console.log(' it is a test');
}
},
unbind: function () {
console.log('解除绑定了');
}
}
}
})
</script>
</body>
</html>
指令除了以上的钩子函数外,还有一些其他选项,params:定义对象可以接受一个数组、定义实例写回数据twoWay、允许自定义指令接受内联语句、terminal阻止遍历、priority指定指令优先级。
6.动画效果【过渡系统】
过渡系统是vue.js为DOM动画效果提供的一个特性,TA能在元素从DOM中插入或者移除的时候触发css过渡和动画,DOM元素发生变化时为其添加特定的class类名,从而产生过渡效果。也可以通过暴露钩子函数和配合JavaScript动画库实现动画效果,如下:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>hello world</title>
<script src="https://cdn.staticfile.org/vue/2.4.2/vue.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/tween.js@16.3.4"></script>
</head>
<body>
<div id="example-8">
<input v-model.number="firstNumber" type="number" step="20"> +
<input v-model.number="secondNumber" type="number" step="20"> =
{{ result }}
<p>
<animated-integer v-bind:value="firstNumber"></animated-integer> +
<animated-integer v-bind:value="secondNumber"></animated-integer> =
<animated-integer v-bind:value="result"></animated-integer>
</p>
</div>
<script>
Vue.component('animated-integer', {
template: '<span>{{ tweeningValue }}</span>',
props: {
value: {
type: Number,
required: true
}
},
data: function () {
return {
tweeningValue: 0
}
},
watch: {
value: function (newValue, oldValue) {
this.tween(oldValue, newValue)
}
},
mounted: function () {
this.tween(0, this.value)
},
methods: {
tween: function (startValue, endValue) {
var vm = this
function animate () {
if (TWEEN.update()) {
requestAnimationFrame(animate)
}
}
new TWEEN.Tween({ tweeningValue: startValue })
.to({ tweeningValue: endValue }, 500)
.onUpdate(function () {
vm.tweeningValue = this.tweeningValue.toFixed(0)
})
.start()
animate()
}
}
})
// 所有的复杂度都已经从 Vue 的主实例中移除!
new Vue({
el: '#example-8',
data: {
firstNumber: 20,
secondNumber: 40
},
computed: {
result: function () {
return this.firstNumber + this.secondNumber
}
}
})
</script>
</body>
</html>
持续更新中~