Vue.js 是啥 ?
- Vue (读音 /vjuː/,类似于 view) 是一套用于构建用户界面的渐进式框架。
- Vue 的核心库只关注视图层,不仅易于上手,还便于与第三方库或既有项目整合。
- 当与现代化的工具链以及各种支持类库结合使用时,Vue 能够为复杂的单页应用提供驱动。
为啥要用 Vue.js ?
学过 jsp 与 php 的应该都知道,当前端页面要加载后台数据时,如发送 Ajax 请求,往往需要通过繁琐的修改 DOM 来更新数据。
有了 Vue.js,我们便可以轻轻松松地完成数据绑定工作,同时也避免大量的原生 javascript 或者是 jQuery 代码,给前端开发带来了很大的方便
除此之外,许多 UI 框架都会涉及到 Vue,因为其具有丰富的组件库
最后,Vue.js 是实现前后端分离的关键,其可以实现前端模块化与工程化开发
Vue.js 的模板语法为:{ { data }},其中的 data 为需要显示的数据的变量名(即在 Vue 实例的 data 中定义的 key 值)
在写 Vue 之前,需引入其 CDN:
<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/vue.js"></script>
第一个 Vue 程序如下:
<div id="app">
{
{message}}
div>
<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/vue.js">script>
<script>
var vm = new Vue({
el: "#app",
data: {
message: 'vue-01~~~',
}
});
script>
浏览器运行后会显示 js 中 Vue 实例对应的 data 的 message 值(这里为:vue-01~~~),我们无需与 HTML 直接交互,一个 Vue 应用可以挂载到一个 DOM 元素上,即 Vue 实例中 el 的 id 与 html 标签的 id 一一对应绑定,data 定义 Vue 应用的数据,如这里的 message,HTML 的 DOM 中只需通过模板(两个大括号)包裹 data 中定义的 key 即可显示对应的数据
掌握了 Vue.js 的模板语法后,我们首先掌握一些基础指令的使用,同时以下的基础指令也是经常要用到的
<div id="app">
<h1 v-if="date=='Yesterday'">昨天h1>
<h1 v-if="date=='Today'">今天h1>
<h1 v-else-if="date=='Tommrrow'">明天h1>
<h1 v-else>后天h1>
div>
<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/vue.js">script>
<script>
var vm = new Vue({
el: "#app",
data: {
date: 'Today'
}
});
script>
date 的值为 Toady,则最终显示的是文本是“今天”
<div id="app">
第{
{index}}个标签: {
{item.message}}
li>
div>
<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/vue.js">script>
<script>
var vm = new Vue({
el: "#app",
data: {
items: [
{
message: '昨天不够认真'},
{
message: '今天加油冲'},
{
message: '明天会更好'}
]
}
});
script>
v-for 标签类似于 for each 循环,在 javascript 中,方括号对应数组,大括号对应对象,需通过【对象.属性名】获取对象的属性值,
同时通过 index 参数,我们可以得到循环的索引,其默认从 0 开始
<div id="app">
通过 v-on 绑定事件,v-on:click 表示绑定的是点击事件,绑定的事件需在 Vue 实例的 methods 中声明,注意不要少了 methods 末尾的 s
表单通过 v-model 实现数据双向绑定,当表单的数据发生变化时,对应 Vue 实例中 data 中相应变量的值也会发生变化
我们可将 Vue 实例中的变量回显出来,以查看双向绑定的效果,具体实例如下:
<div id="app">
输入:
回显:{
{message}}
div>
<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/vue.js">script>
<script>
var vm = new Vue({
el: "#app",
data: {
message: ''
}
});
script>
<div id="app">
输入:
<div id="app">
单选:
<input type="radio" name="food" value="苹果" v-model="radioVal">苹果
<input type="radio" name="food" value="西瓜" v-model="radioVal">西瓜
<br>
回显:{
{radioVal}}
div>
<script src="https://cdn.jsdelivr.net/npm/vue@2.5.16/dist/vue.js">script>
<script>
var vm = new Vue({
el: "#app",
data: {
radioVal: ''
}
});
script>
<div id="app">
下拉框:
运行效果如下:
可以看到,通过双向绑定,可以很容易地实现回显效果,比用原生 javascript 写简直方便太多
组件 Component 是 Vue 中一个重要的概念。在前端模块化开发中,一个 web 页面是由一个个组件组合拼接而成的,我们可以很方便地对组件进行修改
通过定义组件,还可以实现自定义标签的效果
<div id="app">
diytag>
div>
<script src="https://cdn.jsdelivr.net/npm/vue@2.5.16/dist/vue.js">script>
<script>
Vue.component("diytag",{
props: ['mydata'],
template: '{
{mydata}} '
});
var vm = new Vue({
el: "#app",
data: {
items: ["1st", "2nd", "3rd"]
}
});
script>
其中,divtag 为组件名,props 为组件接收的参数,template 为组件的模板(即我们通过引入自定义标签即可显示模板中的内容)
运行效果如下:
Vue 中主要通过 Axios 与后台交互,其可以很方便的发送 Ajax 请求,同时对 data 中的变量的值进行更新
首先,引入 Axios 的 CDN
<script src="https://unpkg.com/axios/dist/axios.min.js"></script>
在当前目录下创建一个 data.json,用于模拟后端返回的 json 数据
data.json:
{
"name": "今天要学习",
"url": "https://www.baidu.com",
"age": 3,
"school": {
"xiaoxue": "小学",
"chuzhong": "初中",
"gaozhong": "高中"
},
"friends": [
{
"name": "xiaoming",
"age":1
},
{
"name": "xiaohong",
"age":2
},
{
"name": "xiaohua",
"age":3
}
]
}
页面内容:
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>DEMOtitle>
<style>
[v-clock] {
display: none;
}
style>
head>
<body>
<div id="app" v-clock>
<div>{
{info.name}}div>
<div>{
{info.url}}div>
<div>{
{info.school.xiaoxue}}div>
<div>{
{info.friends[0].name}}div>
点击跳转a>
div>
<script src="https://cdn.jsdelivr.net/npm/vue@2.5.21/dist/vue.js">script>
<script src="https://unpkg.com/axios/dist/axios.min.js">script>
<script>
var vm = new Vue({
el: "#app",
data() {
return {
info:{
name: null,
url: null,
age: null,
school: null,
friends: null
}
}
},
mounted() {
axios.get('data.json').then(response => (this.info = response.data));
}
});
script>
body>
注意:
这里是 data() ,而不是 data:
并且 data() 内部需含 return,在 return 内部声明 json 的键值对形式(即需要定义与 json 中的键名一致的变量)。这种方式可将数据直接返回。同时,结合钩子函数 mounted(当视图被加载时会先执行该方法),可以实现组件数据初始化的操作。
<div id="app" v-clock>
<div>function调用:{
{currentTime1()}}div>
<div>计算属性调用:{
{currentTime2}}div>
div>
<script src="https://cdn.jsdelivr.net/npm/vue@2.5.21/dist/vue.js">script>
<script src="https://unpkg.com/axios/dist/axios.min.js">script>
<script>
var vm = new Vue({
el: "#app",
data: {
message : 'hello'
},
methods: {
currentTime1: function() {
return Date.now();
}
},
computed: {
currentTime2: function() {
this.message;
return Date.now();
}
}
});
script>
计算属性用于返回计算结果,其在 computed 中定义,类似于 function,但在调用计算属性时末尾没有括号!
运行效果如下:
<div id="app">
<news>
news-title>
news-items>
news>
div>
<script src="https://cdn.jsdelivr.net/npm/vue@2.5.21/dist/vue.js">script>
<script src="https://unpkg.com/axios/dist/axios.min.js">script>
<script>
Vue.component("news",{
template:'\
\
\
\
\
'
});
Vue.component("news-title",{
props: ['title'],
template: '{
{title}}'
});
Vue.component("news-items",{
props: ['item'],
template: '{
{item}} '
});
var vm = new Vue({
el: "#app",
data: {
title: '插槽的使用',
items: ['标签1','标签2','标签3']
}
});
script>
运行效果如下:
插槽相当于一个模板占位符,可以在一个大的模板中引入插槽 slot,slot 可以当成是内部更小的 Component,使得页面的标签更为组件化、模块化,语义更为清晰。同样地,Component 还是通过 props 参数接收 Vue 实例中的 data 参数值
这里要实现一个点击子标签旁边的按钮进行删除的操作,显然我们需要为子标签(即 li)所在的 Component 绑定一个删除事件,而这个删除的函数 removeItem 是在 Vue 实例中定义的,我们如何能够在组件内部调用 Vue 实例中的 function 呢?
此时就可以用到自定义事件分发了。我们在页面的 HTML 部分通过 v-on 给插槽的元素绑定一个自定义事件,名为 remove,它被赋值为 Vue 实例的 removeItem 删除方法(页面标签可以获取到 Vue 实例中的属性方法)。
然后在对应的组件内部定义名为 remove 的自定义函数,在其内部通过:
this.$emit('自定义事件名',参数)
来调用对应页面中绑定的 Vue 实例中的 removeItem 方法,参数为 index。
简单来说,就是通过页面标签的事件进行一个连接,然后在组件内部通过 this.$emit() 进行调用
<div id="app">
<news>
news-title>
news-items>
news>
div>
<script src="https://cdn.jsdelivr.net/npm/vue@2.5.21/dist/vue.js">script>
<script src="https://unpkg.com/axios/dist/axios.min.js">script>
<script>
Vue.component("news",{
template:'\
\
\
\
\
'
});
Vue.component("news-title",{
props: ['title'],
template: '{
{title}}'
});
Vue.component("news-items",{
props: ['item'],
template: '{
{item}} ',
methods: {
remove: function(index) {
this.$emit('remove', index);
}
}
});
var vm = new Vue({
el: "#app",
data: {
title: '自定义事件分发',
items: ['标签1','标签2','标签3']
},
methods: {
removeItem: function(index) {
this.items.splice(index,1);
}
}
});
script>