一、什么是Vue.js
1. vue是一种数据驱动的前端框架
this.msg="我爱你"
,通过改变数据,然后自动渲染到绑定的DOM节点上
2. jQuery就是一种结构驱动的前端框架
$(#app).text('你真好')
,先获取结构,然后在修改数据来更新结构
二、搭建环境
首先保证你的电脑上有node和npm,版本越新越好
-
npm install -g vue-cli
全局安装脚手架工具,安装的时候可以指定版本 -
vue init webpack myProject
用webpack工具初始化vue项目,myProject是项目名称,可以自己命名 -
cd myProject
进入创建的vue项目目录 -
npm install
安装项目所需要的依赖,也就是安装一些必要的插件 -
npm run dev
开始运行项目
三、Vue核心知识点
1. Vue实例
1.1
vue实例被创建时,它会自动的将data中的属性,methods中的方法绑定到Vue实例对象上,也就是Vue实例代理了data对象上的所有属性
调用时:vm.msg = "hello world"
1.2
data中存在的属性才是响应式的,新添加的不算
比如在浏览器端添加:vm.b = 1
,那么b的变化不会对页面进行渲染
1.3
Object.freeze(),会阻止修改现有的属性,响应系统无法再追踪变化
var data = {msg: 1} ; Object.freeze(data)
1.4
Vue实例还暴露了一些有用的实例属性和方法,有前缀el
vm.$data
vm.$props……
3. Vue模板语法
2.1 动态参数
如果data中有一个属性attrName值为 href,那么这个绑定v-bind:href = 'url'
v-on:[eventName] = 'doSomething'>
同样,在data中有eventName的值为focus函数时,v-on:focus = 'doSomething'
注意:
2.1.1. 动态参数值是字符串类型,值为null,用于解除绑定,其他任何非字符串类型的值都会触发一个警告
2.1.2
无效,要使用没有空格和引号的表达式,或者用计算属性代替
2.2 修饰符
.prevent
告诉v-on指令对于触发的事件调用event.preventDefault()
3. 计算属性、方法和侦听器
3.1 计算属性
计算属性有缓存,依赖改变才会重新计算
{{fullName}}
{{age}}
3.1.1 计算属性中的 getter和setter
computed: {
fullName: {
//自动执行,获取 fullName 的值
//并且 get 依赖的变量发生改变时,get就会重新进行计算
get () {
return this.firstName + " " + this.lastName
},
//当重新设置fullName的值的时候,set函数就会执行 vm.fullName = 'Mike Wang'
//value就是 vm.fullName = 'Mike Wang'
//set函数里,重新设置 fullName 改变了firstName lastName,触发了get 进行计算
set (value) {
var arr = value.split(' ')
this.firstName = arr[0]
this.lastName = arr[1]
}
}
}
3.2 方法
methods: {
//没有缓存,只要页面上有内容变动,就会执行
fullName () {
console.log('打印了一次')
return this.firstName + ' ' + this.lastName
}
},
3.3 侦听器
watch: {
//有缓存,只有监听的属性变量发生改变,才会执行函数内的内容
firstName () {
console.log('打印了一次')
return this.fullName = this.firstName + ' ' + this.lastName
},
lastName () {
console.log('打印了一次')
return this.fullName = this.firstName + ' ' + this.lastName
}
},
注意: 计算属性和侦听器
- 计算属性的键名是计算出来的,所以键名是一个新的名称,在data和props中都是不存在的,计算属性一般可以监听多个值的变化
- watch侦听器就是已有值发生变化的时候执行的操作,所以侦听器的键名是data或者props中已经存在的
4.class与style的绑定
4.1 class的绑定
绑定class对象语法:对象键是类名,值是布尔值
意思就是isActive是true,那么就绑定类名为divStyle的这个类
1223454
绑定class数组语法:数组中的成员直接对应类名
意思是绑定的类由 activeClass 这个变量来决定,若为空,就绑定空,若是active,就绑定类名为active的这个类
hhhhhh
4.2 style的绑定
绑定内联样式:键代表的是style的属性(color,size属性等),值就是属性值啦
切记: 在vue中,只要是大写字母,就会转变为 -小写
fontSize ----> font-size
你丫真傻啊
5. 条件渲染
5.1 v-if
v-if绑定的变量若为true,则该元素就会出现在DOM中,并且在页面中渲染出来;若为false,则将该元素从DOM中移除
5.1.1 v-if使用
{{msg}}
5.1.2 v-if v-else-if v-else的使用
v-if v-else-if v-else一定要连在一起写,中间不能有其他标签分隔开
this is A
this is B
this is others
5.1.3 key值的使用
Vue 会尽可能高效地渲染元素,通常会复用已有元素而不是从头开始渲染,所以如果是完全一样的文本框,vue会完全借用上一个文本框,如果不想复用,可用不同的key值区分。
注意:元素复用并不局限与文本框,其他元素都会复用的,这会极大的提高Vue的渲染效率
用户名:
lalala: //会复用
密码名: //不会复用
5.2 v-show
v-show绑定的变量无论是true还是false,它只是控制这个DOM元素的display:'none'这个style属性而已,这个元素一直在DOM中
6.列表渲染
6.1数组渲染
这种是工作中常用的循环,要加上key值,可以提高vue的性能,理想的 key 值是每项都有的唯一 id。key不建议使用index
注意:
- Vue有一组观察数组的变异方法,所以他们也会触发视图更新
方法如下:
- push()----在数组末尾加上一项
vm.list.push({id:'004',text:'啦啦啦'})
- pop()----将数组的最后一个元素移除
- shift()----删除数组的第一个元素
- unshift()----在数组的第一个元素位置添加一个元素
- splice()----可以添加或者删除数组中的一个或多个元素—返回删除的元素
三个参数:
- 表示开始操作的位置
- 要操作的长度,为0,就是不删除
- 为可选参数,可以把要添加的元素或者数组对象写在这里
arr.splice(4,1,{ll:true})
- sort()----排序
- reverse()----数组反转
当我们想要修改数组中的元素的时候,不能通过下标的方式进行改变,只能通过Vue提供的几个数组变异方法来实现。
比如想要在数组添加一项内容:
vm.list[4]={id: '005',text:'hello world'}
其实list数组中已经添加上了这一项,只是无法在页面中渲染出来
比如在数组第二项后面添加一项内容:
vm.list.splice(1,0,{id:'001',text:'第三项'})
当我们想要修改数组中的元素的时候,还可以通过改变数组的引用,就是对数组进行重新赋值
当我们想要修改数组中的元素的时候,还可以通过set语法
Vue.set(vm.list,1,{id:'007',text: '你真傻'})
或者vm.$set(vm.list,1,{id:'007',text: '你真傻'})
,中间数字为操作元素的index值
{{item.text}}----{{index}}
如果我们想要通过一个list循环两项,比如div和span
两个循环完全独立,不符合预期
{{item.text}}----{{index}}
{{item.text}}----{{index}}
外面包一层div,效果可以,但我们并不想要包裹的div出现在DOM中
{{item.text}}----{{index}}
{{item.text}}----{{index}}
满足预期,且在DOM中不会出现template标签
{{item.text}}----{{index}}
{{item.text}}----{{index}}
6.2 对象渲染
参数顺序:拿到value key index 的写法 v---k---i 外开
{{key}}: {{item}}--{{index}}
注意:
对象里面要想添加某一项,用点语法是行不通的
比如:vm.userInfo.address = 'ZhengZhou'
,在页面中渲染不出来
- 通过改变对象引用,就是为对象重新赋值的方式来改变对象内容
- 通过set语法
Vue.set(vm.userInfo,'address', 'beijing')
或者vm.$set(vm.userInfo,'adress','beijing')
7.组件使用中的一些细节
7.1 table中的问题
正常情况下如此
1
2
3
每一行都引入一个组件,但是渲染的时候发现渲染出来的 row 并不在 tbody 标签里面
因为 tbody 标签里面只能写 tr,其他标签他识别不了
使用is属性可以解决这个问题
比如:这几种情况最好也不要直接写组件,用is属性来实现
7.2 组件中的data
组件都是可以复用的,所以组件中data也得是一个独立的对象,那么组件之间的data才不会相互干扰
7.3 ref的使用
ref在dom标签上使用,指向的是这个dom节点
hello world
ref在一个组件上使用,实际上是对这个组件的一个引用
{{sum}}
8. 父子组件间数据传递
8.1 父组件向子组件传递数据
注意:
- 父组件向子组件传值时,传值参数前最好加上v-bind,以下面为例:
count="1"
就是传递的字符串1
:count="1"
就是数字1,
不加:,那么传递参数就是参数后的那个值
加:,那么传递参数就是引号里面的js表达式- 子组件接收到父组件传过来的值,是不能修改的,不要在子组件中修改props中的值,vue中有单向数据流的概念,即父组件向子组件传值时,父组件中可以随意修改所要传递地数据,子组件不能反过来修改父组件传递来的数据
如果你在子组件中修改了props:
- 如果传过来的是基本类型,那么会有警告,但在页面中正常渲染
- 如果是引用类型(对象,数组),vue会检测不到变化,页面中也不会渲染
如何修改传递过来的值?
- 把传递过来的值赋值给子组件data的一个属性里,就可以修改啦
//正确写法
var counter = { //局部组件,需要在父组件中注册
props: ['count'],
data () {
return {
number: this.count
}
},
template: '{{number}}',
methods: {
handleClick () {
this.number ++
}
}
}
8.2 子组件向父组件传递数据
{{total}}
8.3 组件参数校验与非props特性
以下是props的参数校验的几种写法,以及参数意思
props特性和非props特性
- props特性就是父组件传递过去,子组件有接收,接收后这个特性就不会出现在DOM结构中
- 非props特性就是父组件传递过去,子组件没有接收,会在DOM结构中出现(了解)
8.3 自定义事件和原生事件
- 自定义事件:子组件在父组件中使用时,直接绑定在子组件上的事件就是自定义事件,必须经过子组件的触发才能执行
- 原生事件:直接在子组件里的模板上绑定的事件,子组件引入后是可以直接使用的
- 怎么在父组件的子组件里直接绑定原生事件,不用子组件的再次触发呢?
直接在绑定的自定义事件后加上修饰符
.native
//在这里绑定的是自定义事件,必须经过子组件的触发才能执行
9. 非父子组件之间的传值
bus/总线/发布订阅模式/观察者模式
步骤:
- 建立总线
Vue.prototype.bus = new Vue()
- 在子组件中触发
this.bus.$emit('change',this.selfContent)
- 在子组件mounted生命周期钩子函数中监听
this.bus.$on('change',(value)=>{})
value就是传过来的值,可以进行操作
10. 插槽
10.1 没有插槽前的传值方式
父组件向子组件传值,采用props传值,可以传少量的值,但如果数值较多的话,代码可读性会很低
插槽
Dell
具名插槽,可以在父组件中插入多个模块的内容
header
作用域插槽
- 执行逻辑:
- 父组件调用子组件时,向子组件传递了一个插槽
- 子组件通过slot向父组件传递数据,比如:
:item = item
- 插槽是作用域插槽,插槽必须写在template里面,同时声明从子组件接收的数据都放在props里面
- 在template里面写上模板的信息,以什么方式进行展示
- 什么时候用作用域插槽?
子组件做循环或者有一部分的DOM结构要由外部传过来的时候
作用域插槽改写
{{props.item}}
11. 动态组件和v-once指令
- 动态组件
动态组件中is属性根据绑定的组件名的不同会动态的切换组件
- v-once 使用
子组件中加上v-once,也就是第一次执行的时候就把子组件放入内存,下次直接复用即可,所以如果子组件内容不变的话,加上v-once会提高vue性能
12.Vue动画
12.1 css过渡动画
过渡动画原理:
- 在需要过渡的元素外面包裹上transition标签,那么vue执行代码的时候就会对被包裹的元素进行解析
- 以缓动出现为例:
- 动画开始前,vue刚开始解析代码,就会给transition包裹的标签(div)加上
v-enter , v-enter-active
两个类(注意可以给transition加name,那么v就换成name名称)- 动画开始时,去掉
fade-enter
这个类,添加fade-enter-to
这个类- 动画结束时,所有的类都去掉
- 我们可以根据这些类的添加和删除为这些类添加一些样式,来做出动画效果
代码如下:
hello world
12.2 在Vue中使用animate.css库
Vue中使用keyframes
v-enter-active, v-leave-active
在动画整个过程都是存在的,所以可以在这里面写效果vue提供的原生类名太长,想换类名怎么办?
可以在
transition
里面自己设置类名 比如:enter-active-class='enter'
leave-active-class='leave'
,那么这两个类就可以这样简写啦
hello world
使用animate.css库
如何使页面出现以及刷新的时候也出现动画呢?在transition中加入属性
appear
,类appear-active-class='animated swing'
hello world
12.3 在vue中同时使用animate.css库和transition
注意: animate.css动画默认时间是1s,所以如果transition和animate时间不一致?
怎么办?
- 加
type="transition"
用来指定以谁的时间为准- 自定义时间
:duration="5000"
hello world
12.4 js 动画
js动画钩子:
- before-enter: 动画开始执行前就执行啦
- enter: 动画开始的时候执行
- after-enter: 动画结束时执行
离开动画与进入动画一样before-leave,leave,after-leave
hello world
12.5 Velocity动画库的使用
hello world
12.6 Vue中多个元素或组件的过渡
- 多个元素的过渡
注意:多个元素的过渡,每个元素要加一个key,如果不加vue中会进行dom复用,就没有动画效果啦
hello world
bye world
- 多个组件的过渡
多个组件可以转化为动态组件
12.7 vue中的列表过渡
原理:
{{item.title}}把循环的每一项都变成了
{{item.title}}在进行渲染
{{item.title}}
12.8 vue动画封装
hello world
I love you