一:环境搭建
1.安装node.js
2.cnpm 下载包
地址:http://npm.taobao.org/
安装cnpm:
npm install -g cnpm --registry=https://registry.npm.taobao.org
3.搭建vue的开发环境:
https://cn.vuejs.org/v2/guide/installation.html
1、必须要安装nodejs
2、搭建vue的开发环境 ,安装vue的脚手架工具 官方命令行工具
npm install --global vue-cli / cnpm install --global vue-cli (此命令只需要执行一次)
3、创建项目 必须cd到对应的一个项目里面
vue init webpack vue-demo01
cd vue-demo01
cnpm install / npm install 如果创建项目的时候没有报错,这一步可以省略。如果报错了 cd到项目里面运行 cnpm install / npm install
npm run dev
4、另一种创建项目的方式 (推荐) 安装文件比较简洁
vue init webpack-simple vuedemo02
cd vuedemo02
cnpm install / npm install
npm run dev
二:运行说明
1、cd 到demo里面
如:cd vuedemo
2、安装依赖:
cnpm install
3、运行项目
npm run dev
三:基本代码
{{msg}}---双大括号是插值表达式,小胡子语法。
el:'#app'---表示Vue实例控制页面上那个区域。
data:{ }---存放el中需要用到的数据
methods:{}---方法,定义当前实例所有可用的方法
四:Vue指令
1:v-cloak---解决在网络延迟时插值表达式闪烁问题
用法:
{{msg}}
2: v-text---默认没有闪烁问题,会覆盖元素中原本的内容
用法:
被v-text覆盖的内容
3: v-html---双大括号的方式会将数据解释为纯文本,而非HTML。为了输出真正的HTML,可以用v-html指令。它等同于JS的innerHtml属性
1212112
4: v-bind---绑定属性的指令,简写为 :要绑定的属性。只能实现单向绑定,从M自动绑定到V
5:v-on---事件绑定机制,简写为 @
6:v-model---实现表单元素和Model数据双向绑定,只能运用在表单元素中。input(radio, text, address, email....) select checkbox textarea
7:v-for---循环数组
循环普通数组
{{item}}
循环对象数组
Id:{{ user.id }} --- 名字:{{ user.name }} --- 索引:{{i}}
循环遍历对象身上的属性
迭代数字
这是第 {{ count }} 次循环
Key属性使用---循环时,key属性只能使用number和string,须使用 v-bind 属性绑定的形式,指定 key 的值
{{item.id}} --- {{item.name}}
8. v-if---每次都会重新删除或者创建元素,有更高的切换消耗
这是用v-if控制的元素
9. v-show---每次不会重新进行DOM的删除和创建操作,只是切换了元素的 display:none 样式
这是用v-show控制的元素
如果元素涉及到频繁的切换,最好不要使用 v-if, 而是推荐使用 v-show
如果元素可能永远也不会被显示出来被用户看到,则推荐使用 v-if
五:事件修饰符
.stop --停止--阻止冒泡
.prevent --阻止--阻止默认行为
.capture --捕获--实现捕获触发事件机制
.self--自己--实现只有点击当前元素时候,才会触发事件处理函数
.once--一次--只触发一次事件函数
六:Vue中样式
1.普通样式
一
2.传递一个数组,注意: 这里的 class 需要使用 v-bind 做数据绑定
传递一个数组
3.数组中使用三元表达式
数组中使用三元表达式
4.数组中嵌套对象
数组中嵌套对象
5.直接使用对象
直接使用对象
直接使用对象
6.使用内联样式
直接在元素上通过 `:style` 的形式,书写样式对象
这是一个善良的p
这是一个p
var vm = new Vue({
el: '#app',
data: {
flag: true,
classObj: { red: true, thin: true, italic: false, active: false }
},
methods: {}
});
.red {color: red; }
.thin {font-weight: 200;}
.italic {font-style: italic; }
.active {letter-spacing: 0.5em; }
七:键盘修饰符以及自定义键盘修饰符
通过Vue.config.keyCodes.名称 = 按键值来自定义案件修饰符的别名:
Vue.config.keyCodes.f2 = 113;
八:过滤器定义
Vue.filter('过滤器的名称', function(){})
过滤器中的 function ,第一个参数,已经被规定死了,永远都是 过滤器 管道符前面 传递过来的数据
Vue.filter('过滤器的名称', function (data) {
return data + '123'
})
过滤器调用时候的格式 {{ name | 过滤器的名称 }}
私有过滤器:
1. HTML元素:
```
```
2. 私有 `filters` 定义方式:
```
filters: { // 私有局部过滤器,只能在 当前 VM 对象所控制的 View 区域进行使用
dataFormat(input, pattern = "") { // 在参数列表中 通过 pattern="" 来指定形参默认值,防止报错
var dt = new Date(input);
// 获取年月日
var y = dt.getFullYear();
var m = (dt.getMonth() + 1).toString().padStart(2, '0');
var d = dt.getDate().toString().padStart(2, '0');
// 如果 传递进来的字符串类型,转为小写之后,等于 yyyy-mm-dd,那么就返回 年-月-日
// 否则,就返回 年-月-日 时:分:秒
if (pattern.toLowerCase() === 'yyyy-mm-dd') {
return `${y}-${m}-${d}`;
} else {
// 获取时分秒
var hh = dt.getHours().toString().padStart(2, '0');
var mm = dt.getMinutes().toString().padStart(2, '0');
var ss = dt.getSeconds().toString().padStart(2, '0');
return `${y}-${m}-${d} ${hh}:${mm}:${ss}`;
}
}
}
```
### 全局过滤器
```
// 定义一个全局过滤器
Vue.filter('dataFormat', function (input, pattern = '') {
var dt = new Date(input);
// 获取年月日
var y = dt.getFullYear();
var m = (dt.getMonth() + 1).toString().padStart(2, '0');
var d = dt.getDate().toString().padStart(2, '0');
// 如果 传递进来的字符串类型,转为小写之后,等于 yyyy-mm-dd,那么就返回 年-月-日
// 否则,就返回 年-月-日 时:分:秒
if (pattern.toLowerCase() === 'yyyy-mm-dd') {
return `${y}-${m}-${d}`;
} else {
// 获取时分秒
var hh = dt.getHours().toString().padStart(2, '0');
var mm = dt.getMinutes().toString().padStart(2, '0');
var ss = dt.getSeconds().toString().padStart(2, '0');
return `${y}-${m}-${d} ${hh}:${mm}:${ss}`;
}
});
```
> 注意:当有局部和全局两个名称相同的过滤器时候,会以就近原则进行调用,即:局部过滤器优先于全局过滤器被调用!
九:生命周期函数
// 开始创建 Vue 实例,得到 ViewModel
var vm = new Vue({
el: '#app',
data: {
msg: 'ok'
},
methods: {
show() {
console.log('执行了show方法')
}
},
beforeCreate() { 创建前// 这是我们遇到的第一个生命周期函数,表示实例完全被创建出来之前,会执行它
// console.log(this.msg)
// this.show()
//刚初始化一个vue空的实例对象,这时候,这个对象身上,只有默认的一些生命周期函数和默认事件,其他东西都未创建
// 注意: 在 beforeCreate 生命周期函数执行的时候,data 和 methods 中的 数据都还没有没初始化
},
created() { 创建// 这是遇到的第二个生命周期函数
// console.log(this.msg)
// this.show()
// 在 created 中,data 和 methods 都已经被初始化好了!
// 如果要调用 methods 中的方法,或者操作 data 中的数据,最早,只能在 created 中操作
},
beforeMount() { 即将挂载// 这是遇到的第3个生命周期函数,表示模板已经在内存中编译完成了,但是尚未把模板渲染到页面中,此时,页面还是旧的。
// console.log(document.getElementById('h3').innerText)
// 在 beforeMount 执行的时候,页面中的元素,还没有被真正替换过来,只是之前写的一些模板字符串
},
mounted() { 挂载// 这是遇到的第4个生命周期函数,表示,内存中的模板,已经真实的挂载到了页面中,用户已经可以看到渲染好的页面了
// console.log(document.getElementById('h3').innerText)
// 注意: mounted 是 实例创建期间的最后一个生命周期函数,当执行完 mounted 就表示,实例已经被完全创建好了,此时,如果没有其它操作的话,这个实例,就静静的 躺在我们的内存中,一动不动
//肉果要通过某些插件操作页面上的DOM节点,最早要在mounted中进行。只要执行力mounted,就表示整个Vue实例已经初始化完毕,
//此时,组件已经脱离了创建阶段,进入到运行阶段。
},
// 接下来的是运行中的两个事件
beforeUpdate() { 更新前// 这时候,表示 我们的界面还没有被更新【数据被更新了吗? 数据肯定被更新了】
/* console.log('界面上元素的内容:' + document.getElementById('h3').innerText)
console.log('data 中的 msg 数据是:' + this.msg) */
// 得出结论: 当执行 beforeUpdate 的时候,页面中的显示的数据,还是旧的,此时 data 数据是最新的,页面尚未和 最新的数据保持同步
},
updated() { 更新
console.log('界面上元素的内容:' + document.getElementById('h3').innerText)
console.log('data 中的 msg 数据是:' + this.msg)
// updated 事件执行的时候,页面和 data 数据已经保持同步了,都是最新的
},
beforeDestroy(){ 销毁前
/* 当执行beforeDest钩子函数的时候,Vue实例就已经从运行阶段,进入到销毁阶段;
当执行beforeDe的时候,实例身上所有data和所有methods,以及过滤器,指令...都处于可用状态,此时,还没有真正执行销毁过程 */
},
destroyed(){ 完全销毁
/* 当执行到destroyed函数的时候,组件已经完全销毁了,此时组件中所有的数据,方法,指令,过滤器,都已经不可用了。 */
}
});
十:使用vue-resource请求数据的步骤
1.安装vue-resource模块,加上--save
npm install vue-resource --save / cnpm install vue-resource --save
2.在main.js引入vue-resource
import VueResource from 'vue-resource';
3.在main.js引入Vue.use(VueResource);
Vue.use(VueResource);
4.在组件里面直接使用
this.$http.get(地址).then(function(){
})
首页组件
-
{{item.title}}
export default{
data(){
return {
msg:'我是一个首页组件msg',
flag:true,
list:[]
}
},
methods:{
getData(){
//请求数据
var api='http://www.phonegap100.com/appapi.php?a=getPortalList&catid=20&page=1';
this.$http.get(api).then((response)=>{
console.log(response);
//注意this指向
this.list=response.body.result;
},function(err){
console.log(err);
})
}
},
mounted(){ /*生命周期函数*/
this.getData();
}
}
十一:使用vue-axios请求数据
1.安装vue-axios
cnpm install axios --save
2.哪里使用哪里引入
import Axios from 'axios'
import Axios from 'axios';
export default{
data(){
return {
list:[]
}
},
methods:{
getData(){
var api='http://www.phonegap100.com/appapi.php?a=getPortalList&catid=20&page=1';
Axios.get(api).then((response)=>{
this.list=response.data.result;
}).catch((error)=>{
console.log(error);
})
}
},
mounted(){ /*生命周期函数*/
this.getData();
}
}
十二:组件使用
1.在script标签内引入组件
2. 在components内挂载组件
3.在模板中使用组件
//引入组件
import Home from './components/Home.vue';
import News from './components/News.vue';
export default {
data () {
return {
msg:'你好vue'
}
},
components:{ /*前面的组件名称不能和html标签一样*/
'v-home':Home, //挂载组件
'v-news':News
}
}
十三:父组件给子组件传值 父组件给子组件传方法
1. 父组件调用字组件时候,绑定动态属性
2.在子组件里面通过props接收父组件传过来的数据
props:['title']
父组件代码:
首页组件
import Header from './Header.vue';
export default{
data(){
return {
msg:'我是一个home组件',
title:'首页111'
}
},
components:{
'v-header':Header
},
methods:{
run(data){
alert('我是Home组件的run方法'+data);
}
}
}
子组件代码:
我是头部组件--{{title}}---{{homemsg}}
export default{
data(){
return{
msg:'子组件的msg'
}
},
methods:{
getParent(){
this.home.run()
}
},
props:['title','homemsg','run','home']
}
十四:路由使用
1.安装
npm install vue-router --save / cnpm install vue-router --save
2、引入并 Vue.use(VueRouter) (main.js)
import VueRouter from 'vue-router'
Vue.use(VueRouter)
3、配置路由 下面四个在main.js里面
1、创建组件 引入组件
2、定义路由 (建议复制s)
const routes = [
{ path: '/home', component: Home },
{ path: '/news', component: News },
{ path: '*', redirect: '/home' }
]
3、实例化VueRouter
const router = new VueRouter({
routes // (缩写)相当于 routes: routes
})
4、挂载
new Vue({
el: '#app',
router,
render: h => h(App)
})
5 、根组件的模板里面放上这句话
6、路由跳转
7.1.this.$router.go(val) => 在history记录中前进或者后退val步,当val为0时刷新当前页面。
2.this.$router.push(path) => 在history栈中添加一条新的记录。
十五:动画
1.使用transition元素,把需要被动画控制的元素包裹起来
被控制元素
2.自定义两组样式,来控制 transition 内部的元素实现动画
/* v-enter 【这是一个时间点】 是进入之前,元素的起始状态,此时还没有开始进入 */
/* v-leave-to 【这是一个时间点】 是动画离开之后,离开的终止状态,此时,元素 动画已经结束了 */
.v-enter,
.v-leave-to {
opacity: 0;
transform: translateX(150px);
}
/* v-enter-active 【入场动画的时间段】 */
/* v-leave-active 【离场动画的时间段】 */
.v-enter-active,
.v-leave-active{
transition: all 0.8s ease;
}
3.修改动画v-前缀 transition加入name属性
被控制元素
样式里面v-改完自定义名字
.my-enter,.my-leave-to{opacity: 0;}
.my-enter-active,.my-leave-active{transition: all 0.8s ease;}
4.使用animate库实现动画,用npm安装看api
leave-active-class="animated bounceOut"> 这是一个H3
5.动画钩子函数
+1:定义 transition 组件以及三个钩子函数:
@before-enter="beforeEnter" @enter="enter" @after-enter="afterEnter">
+2. 定义三个 methods 钩子方法
methods: {
// 注意: 动画钩子函数的第一个参数:el,表示 要执行动画的那个DOM元素,是个原生的 JS DOM对象
// 大家可以认为 , el 是通过 document.getElementById('') 方式获取到的原生JS DOM对象
beforeEnter(el){
// beforeEnter 表示动画入场之前,此时,动画尚未开始,可以 在 beforeEnter 中,设置元素开始动画之前的起始样式
// 设置小球开始动画之前的,起始位置
el.style.transform = "translate(0, 0)"
},
enter(el, done){
// 这句话,没有实际的作用,但是,如果不写,出不来动画效果;
// 可以认为 el.offsetWidth 会强制动画刷新
el.offsetWidth
// enter 表示动画 开始之后的样式,这里,可以设置小球完成动画之后的,结束状态
el.style.transform = "translate(150px, 450px)"
el.style.transition = 'all 1s ease'
// 这里的 done, 起始就是 afterEnter 这个函数,也就是说:done 是 afterEnter 函数的引用
done()
},
afterEnter(el){
// 动画完成之后,会调用 afterEnter
// console.log('ok')
this.flag = !this.flag
}
}
十六:使用ref获取DOM元素和组件
哈哈哈, 今天天气太好了!!!
methods:{
console.log(this.$refs.myh3.innerText
}