Vue 基础精讲

Vue 官方文档:https://cn.vuejs.org/v2/guide/


VUE 实例

  每个组件都是一个 vue 的实例。

  一个 vue 项目是由实例组成的。

  vue 实例上有很多的实例属性和方法。

 <!DOCTYPE html>
<html lang="en"> <head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>vue 实例</title>
<!-- 引入库文件 -->
<script src="./vue.js"></script>
</head> <body>
<div id="root">
<!-- <div v-on:click="handleClick"> {{message}}</div> -->
<div @click="handleClick"> {{message}}</div>
<item></item>
</div> <script> Vue.component('item',{
template:"<div>hello item !</div>"
}) // vue 实例 ,根实例
var vm = new Vue({
// 接管dom标签
el: '#root',
// 数据绑定
data: {
message: 'Hello World'
},
// 方法
methods:{
handleClick:function(){
alert("ok")
}
},
}) </script> </body> </html>

  

利用浏览器控制台展示实例内容

  

  “$” 符号开始的变量都是vue实例属性或者方法。

Vue 实例的生命周期钩子

  生命周期函数就是 vue 实例在某一个时间点会自动执行的函数。

生命周期图示

  

使用生命周期函数

<!DOCTYPE html>
<html lang="en"> <head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>vue 实例生命周期函数</title>
<!-- 引入库文件 -->
<script src="./vue.js"></script>
</head> <body> <div id="app"></div> <script>
// 生命周期函数就是 vue 实例在某一个时间点会自动执行的函数
var vm = new Vue({
el:"#app",
// 使用模板
template:"<div>hello world</div>",
beforeCreate:function(){
console.log('beforeCreate')
},
created:function(){
console.log('created')
},
beforeMount:function(){
console.log(this.$el)
console.log('beforeMount')
},
mounted:function(){
console.log(this.$el)
console.log('mounted')
},
beforeDestroy:function(){
console.log('beforeDestroy')
},
destroyed:function(){
console.log('destroyed'
)
}
})
</script> </body> </html>

  

beforeUpdate & updated 生命周期

 <!DOCTYPE html>
<html lang="en"> <head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>vue 实例生命周期函数</title>
<!-- 引入库文件 -->
<script src="./vue.js"></script>
</head> <body> <div id="app"></div> <script>
// 生命周期函数就是 vue 实例在某一个时间点会自动执行的函数
var vm = new Vue({
el:"#app",
data:{
test:"hello world",
},
// 使用模板
template:"<div>{{test}}</div>",
beforeCreate:function(){
console.log('beforeCreate')
},
created:function(){
console.log('created')
},
beforeMount:function(){
console.log(this.$el)
console.log('beforeMount')
},
mounted:function(){
console.log(this.$el)
console.log('mounted')
},
beforeDestroy:function(){
console.log('beforeDestroy')
},
destroyed:function(){
console.log('destroyed')
},
beforeUpdate:function(){
console.log('beforeUpdate')
},
updated:function(){
console.log('updated')
} })
</script> </body> </html>

beforeUpdate & updated

  

  生命周期函数并不放在 methods 函数中。

Vue 的模板语法

<!DOCTYPE html>
<html lang="en"> <head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title> Vue的模板语法 </title>
<script src="./vue.js"></script>
</head> <body>
<div id="app">
<!-- 差值表达式 -->
<!-- {{name}} -->
<div>{{name+' 同志'}}</div>
<!-- v-text 将数据变量显示在页面上 -->
<div v-text="name+' 同学'"></div>
<!-- 将div中 innerHTML 的值与数据变量name进行绑定,会渲染html标签 -->
<div v-html="name+' 先生'"></div>
</div> <script> var vm = new Vue({
el: "#app",
data: {
name: "<h1>王佳伟</h1>"
}
}) </script>
</body> </html>

  

计算属性,方法和侦听器

计算属性  computed

 <!DOCTYPE html>
<html lang="en"> <head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>计算属性方法侦听器</title>
<script src="./vue.js"></script>
</head> <body> <div id="app"> {{fullName}}
{{age}}
</div> <script>
var vm = new Vue({
el: "#app",
data: {
firstName: "Jayvee",
lastName: "Wong",
age: 28
},
// 计算属性
// 内置缓存的
// 在计算之后,如果firstName和lastName没有改变,则不再去计算,提高性能.
// 如果依赖的值,发生变话,计算属性扈重新计算一次.
computed: {
// 姓名合并输出
fullName: function () {
console.log("计算了一次")
return this.firstName + " " + this.lastName
}
}
})
</script> </body> </html>

  

计算方法  methods

<!DOCTYPE html>
<html lang="en"> <head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>计算属性方法侦听器</title>
<script src="./vue.js"></script>
</head> <body> <div id="app"> <!-- 计算属性 -->
<!-- {{ fullName }} --> <!-- 计算方法 -->
{{ fullName() }}
{{age}}
</div> <script>
var vm = new Vue({
el: "#app",
data: {
firstName: "Jayvee",
lastName: "Wong",
age: 28
}, // 计算属性
// 内置缓存的
// 在计算之后,如果firstName和lastName没有改变,则不再去计算,提高性能.
// 如果依赖的值,发生变话,计算属性扈重新计算一次.
// computed: {
// // 姓名合并输出
// fullName: function () {
// console.log("计算了一次")
// return this.firstName + " " + this.lastName
// }
// } // 计算方法
// 不如计算属性好.没有缓存机制
methods:{
fullName:function(){
console.log("计算了一次")
return this.firstName + " " + this
.lastName
}
},
})
</script> </body> </html>

  

侦听器  watch

<!DOCTYPE html>
<html lang="en"> <head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>计算属性方法侦听器</title>
<script src="./vue.js"></script>
</head> <body> <div id="app"> <!-- 计算属性 -->
<!-- {{ fullName }} --> <!-- 计算方法 -->
<!-- {{ fullName() }} --> {{ fullName }} {{age}}
</div> <script>
var vm = new Vue({
el: "#app",
data: {
firstName: "Jayvee",
lastName: "Wong",
fullName:"Jayvee Wong",
age: 28
}, // 侦听器
watch:{
firstName:function(){
console.log("计算了一次")
this.fullName=this.firstName + " " + this.lastName
},
lastName:function(){
console.log("计算了一次")
this.fullName=this.firstName + " " + this.lastName
}
}
// 计算属性
// 内置缓存的
// 在计算之后,如果firstName和lastName没有改变,则不再去计算,提高性能.
// 如果依赖的值,发生变话,计算属性扈重新计算一次.
// computed: {
// // 姓名合并输出
// fullName: function () {
// console.log("计算了一次")
// return this.firstName + " " + this.lastName
// }
// } // 计算方法
// 不如计算属性好.没有缓存机制
// methods:{
// fullName:function(){
// console.log("计算了一次")
// return this.firstName + " " + this.lastName
// }
// }, })
</script> </body> </html>

  

计算属性的setter和getter

<!DOCTYPE html>
<html lang="en"> <head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>计算属性的setter和getter</title>
<script src="./vue.js"></script>
</head> <body>
<div id="app">
{{fullName}}
</div>
<script>
var vm = new Vue({
el: "#app",
data: {
firstName: "Jayvee",
lastName: "Wong",
},
// 计算属性
computed: {
fullName: {
// 获取
get: function () {
return this.firstName + " " + this.lastName
},
// 设置
set: function (value) {
var arr = value.split(" ")
this.firstName = arr[0]
this.lastName = arr[1
]
console.log(value)
}

}
}
})
</script>
</body> </html>

  

Vue中的样式绑定

  点击标签(div),实现标签内数据颜色变红,再次点击变回原色。

方式一  class的对象绑定

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Vue中的样式绑定</title>
<script src="./vue.js"></script>
<style>
.activated{
color: red;
}
</style>

</head>
<body> <div id="app">
<div @click="handleDivClick"
:class="{activated: isActivated}"
>

hello world
</div>
</div> <script> var vm = new Vue({
el:"#app",
data:{
isActivated:
false,
},
methods:{
handleDivClick:function(){
this.isActivated= !this
.isActivated
}
}

}) </script> </body>
</html>

  

  

方法二

<!DOCTYPE html>
<html lang="en"> <head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Vue中的样式绑定</title>
<script src="./vue.js"></script>
<style>
.activated {
color: red;
}
</style>

</head> <body> <div id="app"> <!-- class的对象绑定 -->
<!-- <div @click="handleDivClick"
:class="{activated: isActivated}"
> --> <div @click="handleDivClick" :class="[activated,activatedOne]">
hello world
</div>
</div> <script> var vm = new Vue({
el: "#app",
data: {
// class对象绑定
// isActivated: false,
activated: "",
activatedOne:"activated-one"
,
},
methods: {
handleDivClick:
function () {
// if (this.activated == "activated") {
// this.activated == ""
// }else{
// this.activated = "activated"
// }
this.activated = this.activated === "activated"?"":"activated"
}
}
// class对象绑定
// methods:{
// handleDivClick:function(){
// this.isActivated= !this.isActivated
// }
// }
}) </script> </body> </html>

  

  

方式三

<!DOCTYPE html>
<html lang="en"> <head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Vue中的样式绑定</title>
<script src="./vue.js"></script>
<!-- <style>
.activated {
color: red;
}
</style> -->
</head> <body> <div id="app"> <!-- class的对象绑定 -->
<!-- <div @click="handleDivClick"
:class="{activated: isActivated}"
> --> <!-- <div @click="handleDivClick" :class="[activated,activatedOne]"> --> <div :style="styleObj" @click="handleDivClick">
hello world
</div>
</div> <script> var vm = new Vue({
el: "#app",
data:{
styleObj:{
color:
"black"
}
},
methods:{
handleDivClick:function(){
this.styleObj.color = this.styleObj.color==="black"?"red":"black"
}
}
// data: {
// // class对象绑定
// // isActivated: false,
// activated: "",
// activatedOne:"activated-one",
// }, // methods: {
// handleDivClick: function () {
// // if (this.activated == "activated") {
// // this.activated == ""
// // }else{
// // this.activated = "activated"
// // }
// this.activated = this.activated === "activated"?"":"activated"
// }
// } // class对象绑定
// methods:{
// handleDivClick:function(){
// this.isActivated= !this.isActivated
// }
// }
}) </script> </body> </html>

  

Vue 中的条件渲染

<!DOCTYPE html>
<html lang="en"> <head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Vue中的条件渲染</title>
<script src="./vue.js"></script>
</head> <body>
<div id="app"> <!-- 判断 不存在于DOM之上 -->
<!-- <div v-if="show">{{message}}</div> --> <!-- 渲染到界面了,只不过display:none -->
<!-- <div v-show="show">{{message}}</div> --> <!-- if else 必须紧贴在一起用,中间不许有其他标签 -->
<!-- <div v-if="show === 'a'">this is a</div> -->
<!-- <div v-else-if="show === 'b'">this is b</div> -->
<!-- <div v-else>this is others</div> --> <div v-if="show">
<!-- key的作用是为了防止vue复用,清空 -->
用户名:<input key="username" type="text" name="" id="">
</div>
<div v-else>
邮箱名:<input key="email" type="email" name="" id="">
</div>
</div>
<script>
var vm = new Vue({
el: "#app",
data:{
// message:"hello world",
// show:false,
// show:"a",
show:false
,
}

})
</script>
</body> </html>

Vue中的列表渲染

<!DOCTYPE html>
<html lang="en"> <head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Vue中的列表渲染</title>
<script src="./vue.js"></script>
</head> <body> <div id="app">
<div v-for="(item,index) of list">
{{item}} ------ {{index}}
</div>

</div> <script>
var vm = new Vue({
el: "#app",
data: {
list: [
"hello",
"jayvee",
"nice",
"to",
"meet",
"you"
,
]

},
})
</script>
</body> </html>

  

每一个循环项上,带一个唯一的 key 值,用来提高性能。

<!DOCTYPE html>
<html lang="en"> <head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Vue中的列表渲染</title>
<script src="./vue.js"></script>
</head> <body> <div id="app">
<div v-for="(item,index) of list" :key="item.id">
{{item.name}} ------ {{index}}
</div>

</div> <script>
var vm = new Vue({
el: "#app",
data: {
list: [
{
id:
"00001",
name: "jayvee",
},
{
id: "00002",
name: "qing",
},
{
id: "00003",
name: "anlex"
,
}
]
},

})
</script>
</body> </html>

  

对数组的操作函数

  push  :  向数组中添加一条数据
  pop  :  删除数组最后一条数据
  shift  :  数组的第一项删除掉
  unshift  :  向数组的第一项加点内容
  splice  :  数组截取
  sort  :  对数组进行排序
  reverse  :  对数组进行取反

vue中的set方法

 <!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>vue中的set方法</title>
<script src="./vue.js"></script>
</head>
<body>
<div id="app">
<div v-for="(item,key,index) of userInfo">
{{item}} -- {{key}} -- {{index}}
</div>
</div> <script>
var vm = new Vue({
el:"#app",
data:{
userInfo:{
name:'Jayvee',
age:18,
gender:'male',
salary:'secret',
}
}
})
</script> </body>
</html>

  

  

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>vue中的set方法</title>
<script src="./vue.js"></script>
</head>
<body>
<div id="app">
<div v-for="(item,index) of userInfo">
{{item}}
</div>
</div> <script>
var vm = new Vue({
el:"#app",
data:{
userInfo:[1,2,3,4]
}
})
</script> </body>
</html>

  

项目代码已整理打包进GitHub

腰都直不起来了,有点辛苦,不过挺充实的!

Vue 基础精讲的更多相关文章

  1. 第三章、vue基础精讲

    3.1VUE实例 组件:全局组件,局部组件,vue的每个组件也是一个实例,有自己的实例属性和实例方法. 在console中调试vue,vm为vue的实例,凡是以$开头的都是vue的实例属性或者vue的 ...

  2. VUE.js入门学习(2)-基础精讲

    1.VUE 实例 - 一个项目是有很多的vue实例拼装的.每一个组建就是vue的实例. var vm = new Vue() 2.VUE 实例生命周期钩子 生命周期函数:VUE实例在某一个时间点会自动 ...

  3. Vue —— VueX精讲(1)

    大纲 这一讲我们最主要的就是学习vue中的数据管理VueX,这个是一个大杀器 一.回顾一些Promise相关的东西 Promise 有几个比较重要的方法,最重要的还是有一个叫做all的方法,这个也是非 ...

  4. JavaScript基础精讲

    ---------------------------------------------------------------------------------------------------- ...

  5. vue.js精讲02

    2017-09-17 笔记及源码地址 : https://github.com/wll8/vue_note vue 中的事件深入. 事件: @click/mouseover…事件简写: @ 如 @cl ...

  6. vue.js精讲01

    笔记及源码地址 : https://github.com/wll8/vue_note 01 2017-09-13 view一个 mvvm框架(库),和 ag 类似.比较小巧,容易上手. mvc: mv ...

  7. 精讲响应式webclient第1篇-响应式非阻塞IO与基础用法

    笔者在之前已经写了一系列的关于RestTemplate的文章,如下: 精讲RestTemplate第1篇-在Spring或非Spring环境下如何使用 精讲RestTemplate第2篇-多种底层HT ...

  8. 【C++自我精讲】基础系列二 const

    [C++自我精讲]基础系列二 const 0 前言 分三部分:const用法.const和#define比较.const作用. 1 const用法 const常量:const可以用来定义常量,不可改变 ...

  9. 【C++自我精讲】基础系列四 static

    [C++自我精讲]基础系列四 static 0 前言 变量的存储类型:存储类型按变量的生存期划分,分动态存储方式和静态存储方式. 1)动态存储方式的变量,生存期为变量所在的作用域.即程序运行到此变量时 ...

随机推荐

  1. 天猫京东app中常见的上下滚动轮播效果如何实现?

    前段时间,公司安排我制作一个上下滚动轮播效果,类似于我们在天猫京东app中常见的这样: 哇kao!这个我完全不会呀??? 幸好,前几天一个朋友在朋友圈分享了一篇推文.瞬间引领我走出了迷茫,这个教程特别 ...

  2. podofo 一点小分享

    PDF 的开源库,大多是Java,或C#的,但C++也有一个很不错的PDF开源库:PoDoFo 我司的PDF签章产品中,我就是用这个PoDoFo库来做的底层 但是国外开源库对中文支持都是或多或少有点问 ...

  3. 从零开始一起学习SLAM | 为什么要用齐次坐标?

    在涉及到计算机视觉的几何问题中,我们经常看到齐次坐标这个术语.本文介绍一下究竟为什么要用齐次坐标?使用齐次坐标到底有什么好处? 什么是齐次坐标?简单的说:齐次坐标就是在原有坐标上加上一个维度: 使用齐 ...

  4. 自定django登录跳转限制

    django自定义一个登录跳转限制: 解释: 不登录不让跳转到其它页面. 原理: 做一个装饰器,在访问路由时,先进行判断,登录session是否存在,如果存在则跳转,不存在则返回到登录页面.或者你可以 ...

  5. selenium PO模式

    思想: 1.定义basepage.py用来写公共方法,比如找元素,打开url,切换frame.这样的部分都写在这里.不必每次用都重写. 2.LoginPage.py 每个功能模块一个文件或者一个类 这 ...

  6. Oracle推进SCN系列:使用oradebug在mount状态下推进SCN

    环境:RHEL 6.5(x86-64) + Oracle 11.2.0.4 声明:推进SCN属于非常规恢复范畴,不建议非专业人员操作,否则后果自负. 需求:我这里演示下推进SCN 10W数量级,实际需 ...

  7. activity bj draw 流程图

  8. jdk8新特性-亮瞎眼的lambda表达式

    jdk8之前,尤其是在写GUI程序的事件监听的时候,各种的匿名内部类,大把大把拖沓的代码,程序毫无美感可言!既然Java中一切皆为对象,那么,就类似于某些动态语言一样,函数也可以当成是对象啊!代码块也 ...

  9. Real Time Credit Card Fraud Detection with Apache Spark and Event Streaming

    https://mapr.com/blog/real-time-credit-card-fraud-detection-apache-spark-and-event-streaming/ Editor ...

  10. hdu5289 单调队列

    这题说的是给了 n个数 然后让你计算出所有区间中那些数的最大值减最小值小于k这样的区间有多少个 /* 这样我们给我们在处理过程中的区间做一些处理 我们在处理即将进来的数的时候我们并不知道他是不是我们区 ...