Vue是一套用于构建用户界面的渐进式框架。
渐进式的含义:主张最少。
每个框架都不可避免会有自己的一些特点,从而会对使用者有一定的要求,这些要求就是主张,主张有强有弱,它的强势程度会影响在业务开发中的使用方式。
本章节参考Vue官网教学视频,为个人学习总结。附官方教程 Vue.js教程
1.Vue的安装与部署
引入Vue.js,对于制作原型或学习,你可以这样使用最新版本:
<script src="https://unpkg.com/vue@next"></script>
对于生产环境,我们推荐链接到一个明确的版本号和构建文件,以避免新版本造成的不可预期的破坏。
Vue下载安装地址
2、Vue的实例及生命周期
Vue的实例及生命周期
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
<script src="vue.js" type="text/javascript" charset="utf-8"></script>
</head>
<body>
<div id="app">
{{msg}}
</div>
<script type="text/javascript">
var vm = new Vue({
el : "#app",
data : {
msg : "hi vue",
},
//在实例初始化之后,数据观测 (data observer) 和 event/watcher 事件配置之前被调用。
beforeCreate:function(){
console.log('beforeCreate');
},
/* 在实例创建完成后被立即调用。
在这一步,实例已完成以下的配置:数据观测 (data observer),属性和方法的运算,watch/event 事件回调。
然而,挂载阶段还没开始,$el 属性目前不可见。 */
created :function(){
console.log('created');
},
//在挂载开始之前被调用:相关的渲染函数首次被调用
beforeMount : function(){
console.log('beforeMount');
},
//el 被新创建的 vm.$el 替换, 挂在成功
mounted : function(){
console.log('mounted');
},
//数据更新时调用
beforeUpdate : function(){
console.log('beforeUpdate');
},
//组件 DOM 已经更新, 组件更新完毕
updated : function(){
console.log('updated');
}
});
setTimeout(function(){
vm.msg = "change ......";
}, 3000);
</script>
</body>
</html>
3、Vue的组件化开发
1.组件是可复用的 Vue 实例
,且带有一个名字。
2.因为组件是可复用的 Vue 实例,所以它们与 new Vue 接收相同的选项,例如 data、computed、watch、methods 以及生命周期钩子等。仅有的例外是像 el 这样根实例特有的选项。
3.组件的data选项必须是一个函数,这是组件定义的规范,是为了让每个实例可以维护一份被返回对象的独立的拷贝。
data: function () {
return {
count: 0
}
}
实例:定义一个全局的组件并给它绑定值
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
</head>
<body>
<div id="app">
<qingjiang v-for="(item,index) in items" v-bind:p="item"></qingjiang>
</div>
</body>
<!-- 1.导入Vue.js -->
<script src="vue/开发版/vue.js"></script>
<script>
Vue.component("qingjiang",{
props:["p"],
template:"<li>{{p}}</li>"
})
var vm = new Vue({
el:"#app",
data:{
items:["java","Linux","前端"]
}
})
</script>
</html>
4、Slot插槽
官方文档
插槽能够存放的内容:插槽内可以包含任何模板代码,包括 HTML,甚至是组件
。
插槽的作用:
1.做后备内容,如下例当没有给插槽提供任何内容的时候模版会渲染后备的内容Submit。
<button type="submit">
<slot>Submit</slot>
</button>
2.具名插槽,顾名思义即给slot添加一个name的属性,这样可以在我们使用时避免混乱,且更具辨识度。
使用案例:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
</head>
<body>
<div id="app">
<page>
<template v-slot:header>
<h1>Here might be a page title</h1>
</template>
</page>
</div>
</body>
<!-- 1.导入Vue.js -->
<script src="vue/开发版/vue.js"></script>
<script src="https://unpkg.com/axios/dist/axios.min.js"></script>
<script>
Vue.component("page",{
template:`
<div class="container">
<header>
<slot name="header">Header插槽</slot>
</header>
<main>
<slot></slot>
</main>
<footer>
<slot name="footer"></slot>
</footer>
</div>
`
})
var vm = new Vue({
el:"#app"
})
</script>
</html>
使用具名插槽需要注意两点:
- v-slot 只能添加在 <template> 上。
- 一个不带 name 的 <slot> 插槽会带有隐含的名字“default”。.
3.作用域插槽(使用较少)
了解,插槽是不能直接访问父组件的属性。那么如何才能访问父组件的属性元素。
以下是一个具名插槽的获取父组件作用域属性的案例
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
</head>
<!-- 1.导入Vue.js -->
<script src="vue/开发版/vue.js"></script>
<script src="https://unpkg.com/axios/dist/axios.min.js"></script>
<body>
<div id="app">
<child :lists="nameList">
<template v-slot:list="slotProps">
{{slotProps}}
</template>
</child>
</div>
</body>
<script>
Vue.component('child',{
props:['lists'],
template:`
<div>
<ul>
<slot name="list" :bbbbb="lists" aaa="123456"></slot>
</ul>
</div>
`
})
let vm = new Vue({
el:'#app',
data:{
nameList:[
{id:1,name:'孙悟空'},
{id:2,name:'猪八戒'},
{id:3,name:'沙和尚'},
{id:4,name:'唐僧'},
{id:5,name:'小白龙'},
]
}
})
</script>
</html>
案例中组件的定义如下,组件中插槽定义了多个属性,name插槽的名称,:bbbb="lists"表示给自定义属性bbbb绑定组件的props属性lists。aaa="123456"则是一个普通的属性。
Vue.component('child',{
props:['lists'],
template:`
<div>
<ul>
<slot name="list" :bbbbb="lists" aaa="123456"></slot>
</ul>
</div>
`
})
我们通过属性绑定将需要的数据绑定到了插槽上,就可以通过以下方式在调用绑定的数据了。{{slotProps}}就是我们绑定在插槽上的属性键键值对。
<child :lists="nameList">
<template v-slot:list="slotProps">
{{slotProps}}
</template>
</child>
4.插槽的缩写
我们可以把参数之前的所有内容 (v-slot:) 替换为字符 #
。例如 v-slot:header 可以被重写为 #header。但是要注意使用这种方式要注意一定要明确插槽名,如默认的default插槽名必须也要写成#default这种形式。
5、 组件自定义事件内容分发
组件如何操作Vue实例的数据,注意组件与实例的是不相干的。需要使用$emit,本例中实现了在组件中操作Vue实例的作用域。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<!--view层 模板-->
<div id="app">
<todo>
<todo-title slot="todo-title" :title="title"></todo-title>
<todo-items slot="todo-items" v-for="(item,index) in todoItems" :item="item" :index="index" v-on:remove="removeItems(index)"></todo-items>
</todo>
</div>
</body>
<!--导入Vue.js-->
<script src="https://cdn.jsdelivr.net/npm/vue@2.5.21/dist/vue.min.js"></script>
<script src="https://unpkg.com/axios/dist/axios.min.js"></script>
<script>
//slot 插槽
Vue.component("todo",{
template:
"<div>" +
"<slot name='todo-title'></slot>" +
"<ul>" +
"<slot name='todo-items'></slot>" +
"</ul>" +
"</div>"
});
Vue.component("todo-title",{
props:['title'],
template:"<div>{{title}}</div>"
})
Vue.component('todo-items',{
props:['item','index'],
template:'<li>{{index}}------{{item}} <button @click="remove">删除</button></li>',
methods:{
remove:function (index) {
this.$emit('remove',index);//用于触发remove方法绑定的方法,可用于间接操作VUe模型中的数据。
}
}
})
var vm = new Vue({
el:"#app",
data:{
title:"教学内容",
todoItems:['狂神说Java','狂神说前端','狂神说Linux']
},
methods:{
removeItems:function (index) {
alert("removeItem方法")
console.log("删除了"+this.todoItems[index]+"OK");
this.todoItems.splice(index,1);//一次删除一个元素
}
}
})
</script>
</html>
以下是$emit的官方解释。
6、Vue的重定向与参数传递
路由的参数传递
路由配置
{
//路由路径
path: '/content/:id',
name:"con",
//跳转的组件
component:Content,
props: true
}
如何传递参数
<router-link :to="{name:'con',params:{id:1}}">内容页</router-link>
接收参数的页面
<template>
<div>
<h1>内容页</h1>
{{id}}
</div>
</template>
<script>
export default {
props:['id'],
name: "Content"
}
</script>
路由的重定向
{
path:'/main',
name:'main',
component: Main
},{
path: '/path',
redirect:'/main'
}
7、axios异步通信
什么是Axios?
Axios是一个开源的可以用在浏览器端和NodeJS的异步通信框架,它的主要作用是实现AJAX异步通信,其功能特点如下:
- 从浏览器中创建XMLHttpRequests
- 从node.js创建http请求
- 支持Promise API(JS中链式编程)
- 拦截请求和响应数据
- 取消请求
- 自动转换JSON数据
- 客户端支持防御 XSRF (跨站请求伪造)
案例:通过axios获取数据并绑定值
数据文件a.json
{
"name":"狂神说Java",
"url":"https://..",
"page":1,
"isNonProfit":true,
"address":{
"street":"含光",
"city":"陕西",
"country":"中国"
},
"links":[
{
"name":"bilibili",
"url":"https://space.bili..."
},
{
"name":"狂神说Java",
"url":"https://space.bili..."
},
{
"name":"百度",
"url":"https://space.bili..."
}
]
}
获取a.json内的数据并将它们绑定到组件中。
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
</head>
<body>
<div id="app">
<div>{{info.name}}</div>
<div>{{info.address.city}}</div>
<a v-bind:href="info.url">点我</a>
</div>
</body>
<!-- 1.导入Vue.js -->
<script src="vue/开发版/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,
address:{
country:null,
city:null,
street:null
},
url:null
}
}
},
mounted(){//钩子函数
axios
.get("a.json")
.then(response => (this.info =response.data));
}
})
</script>
</html>
8、Vue Cli
什么是vue-cli?
vue-cli是官方提供的一个脚手架,用于快速生成一个vue的项目模板;
预先定义好的目录结构及基础代码,就好比咱们在创建Maven项目时可以选择创建一个骨架项目,这个骨架项目就是脚手架,我们的开发更加的快速;
主要功能:
- 统一的目录结构
- 本地调试
- 热部署
- 单元测试
- 集成打包上线
安装vue -cli
要求安装了Nodejs [下载地址](http://nodejs.cn/download/)与cnpm淘宝镜像
输入命令cnpm install vue -cli -g,安装成功后可查看以下目录。
使用vue -cli模版创建Vue项目