Vue基础

特性检测:检测浏览器是否支持某个属性


image.png

image.png

vue指令

页面渲染

vue的指令都是v-这种格式,虽然v-xxx="xxx"写的值是用""包裹,但实际上是js,因此需要在双引号里再加层引号,否则会报错。

v-text : 用于替换插值表达式,如果有v-text,插值就不生效。

v-html: 输出转译过的不带HTML标签的HTML语句。富文本编辑器的内容直接渲染的话是被转译过的,那么HTML标签就会被渲染到页面上

v-cloak: 配合样式来使用,可以让样式在vue实例化之前生效

v-for: 用于循环渲染数据。v-for="item in list"。可以直接遍历对象、数组、数字。

v-if: 直接是dom节点的移除和插入,来达到显示和隐藏元素的效果。通过判断true和false来实现

v-else:必须与v-if配合使用,而v-if不需要配合v-else

v-show: 是通过改变css样式style来显示或者隐藏元素,通过display。对于需要频繁切换显示和隐藏的节点特别实用,比如弹窗、手机注册和邮箱注册两个tab的切换。

v-bind:属性:用于动态绑定元素的属性 ,可以简写为:属性

image.png

事件绑定

v-on:事件名: 绑定事件,可以直接操作data里的数据,v-on可以缩写为@事件名
vue的事件可以加括号也可以不加,不加默认接收事件处理函数的事件对象;加了括号就可以任意传参。(可以继续在括号里通过$event获取当前事件对象)

image.png

v-on:click: 用于绑定点击事件

v-model:自动绑定input输入内容改变事件

image.png

@keyup.enter: .enter是按键修饰符,也可以用enter的对应码13代替。可以使用组合键如.ctrl.enter

image.png

.stop:事件修饰符,阻止冒泡。

class绑定
计算属性
methods和computed区别

methods用来绑定一些方法,每次有数据更改只要在模板里使用这个方法就会执行,没有缓存。
computed是计算属性,有依赖缓存,只有它所依赖的数据发生改变才会重新计算,计算出来的值可以当成data直接使用,不需要添加括号,必须要有一个return值。计算属性是基于它们的响应式依赖进行缓存的。

侦听器 watch

一种更通用的方式来观察和响应 Vue 实例上的数据变动:侦听属性。当你有一些数据需要随着其它数据变动而变动时,你很容易滥用 watch。然而,通常更好的做法是使用计算属性而不是命令式的 watch 回调。
computed是生成一个新的数据,watch是观测已有的数据,当被观测的数据发生改变时,自动执行后面的方法。

filters过滤器
image.png
ajax-fetch
image.png

vue组件

组件是可复用的 Vue 实例(可以将组件进行任意次数的复用),所以它们与 new Vue 接收相同的选项,例如 data、computed、watch、methods 以及生命周期钩子等。仅有的例外是像 el 这样根实例特有的选项。

Vue.compoent(" tagName ", options ):
tagName 为组件名,options 为配置选项。注册后,我们可以使用以下方式来调用组件:

全局注册一个组件,第一个参数就是要使用的标签的名字,不论使用大驼峰或者小写字母加中线的命名方式,在使用组件的时候都要使用小写字母加中线使用。
第二个参数就是组件的配置项,全局注册的组件可以在任何地方使用

components:局部注册一个组件,只有当前Vue实例中才可以使用这个组件

组件的data必须是一个方法(函数),然后要return一个对象,为了保证组件的数据是独立的而不是共享

一个组件可以嵌套,但是一个组件的template只能有一个根元素

组件的props

Prop 是你可以在组件上注册的一些自定义特性。当一个值传递给一个 prop 特性的时候,它就变成了那个组件实例的一个属性。

通过prop来接收调用的时候传过来的值,然后可以把prop当data使用,但是不能修改父组件传的值,这是基于单项数据流。

单项数据流:所有的 prop 都使得其父子 prop 之间形成了一个单向下行绑定:父级 prop 的更新会向下流动到子组件中,但是反过来则不行。这样会防止从子组件意外改变父级组件的状态,从而导致你的应用的数据流向难以理解。

props的大小写
HTML 的属性忽略大小写,所以浏览器会把所有大写字符解释为小写字符。这意味着当你使用 DOM 中的模板时,驼峰命名的 prop 名需要使用短横线分隔命名

传递非字符串类型的数据需要使用动态绑定v-bind

如果要对传入的props进行类型检查,就需要使用对象的方式来写props;如果要对传入的值进行更多约束,就需要把这个值写成对象,对其设置default或者required(二选一)

ref

ref:用来获取dom或者组件,

 //可以通过this.$refs.a获取到tag标签

slot:插槽 占位组件,能够实现标签的嵌套,可以写成:

//给slot加一个name属性,写在模板里面,在页面的显示顺序只有模板里面的顺序有关

内容

//通过slot属性来获取获取到slot

动态组件

//is后面写组件名,用来指定是哪一个组件

还可以通过is 来解决标签嵌套不合法的情况

image.png

动画

transition将需要过渡的元素包起来,要为多个元素设置的话使用transition-group
transition的主要作用是给它的子元素添加和移除class

v-enter:v指元素的name属性,如xxx-enter,不设置的话默认为transition内所有的元素

过渡的类型
v-enter:定义进入过渡的开始状态
v-enter-active:定义进入过渡生效时的状态。
v-enter-to: 定义进入过渡的结束状态。
v-leave: 定义离开过渡的开始状态。
v-leave-active:定义离开过渡生效时的状态。
v-leave-to:定义离开过渡的结束状态。

image.png

transition负责给它的子元素添加和移除class

过渡模式

in-out:新元素先进行过渡,完成之后当前元素过渡离开。
out-in:当前元素先进行过渡,完成之后新元素过渡进入。

生命周期

1. 创建阶段
(1)beforeCreate -- 没什么用,里面取不到数据
(2)created -- 没有this.$el,也没有真实的dom,但是已经有数据,可以在这里更改数据,如果数据是同步更改就会带入下一个生命周期;如果是异步修改,当数据修改完之后就会进入更新阶段,在这里做Ajax请求比较推荐
2. 挂载阶段
(1)beforeMount--这里已经能看到this.$el,但还没有进行真实的数据替换,看到的还是插值表达式,这里也不会做太多的事
(2)mounted--在这里this.$el是真实渲染的dom,在这里及之后才能取到真实的dom。一些第三方dom插件也会在这里来进行初始化,(仅限没有异步数据的dom,这里也可以做Ajax请求)
3. 更新阶段
(1)beforeUpdate--不做太多事
(2)updated--可能需要在这里重新初始化第三方的dom操作插件
4. 销毁阶段
(1)beforeDestroy--在这里一般会去解除一些事件的监听,或者清除一些定时器。
(2)destroyed

lifecycle.png

image.png

nextTick
在created里数据有异步更新时,这时dom还没有进行渲染,在这时候进行dom操作没有用,而在$nextTick的回调中去操作dom的时候,代表此时的页面已经根据最新的数据渲染完成。通过异步返回的数据去操作dom,就放在next tick里执行

created() {
        // 模拟一下ajax
        setTimeout(() => {
          this.banners = ['banner 1', 'banner 2', 'banner 3']
          // 在这里的dom还是没有应用新数据的dom
          // this.$nextTick(() => {
          //   // 在这里的dom就是已经使用了更新的数据的dom
          //   this.initSwiper()
          // })
          this.$nextTick()
            .then(() => {
              this.initSwiper()
            })
        }, 2000)
      }

虚拟DOM

console.time() ... console.timeEnd()查看代码运行耗费的时间

vue-ajax axios

1、安装axios -- npm i axios -s
2、在index.js里引入axios import axios from 'axios'
3、配置baseUrl const ajax = axios.create({ baseURL: 'http://jsonplaceholder.typicode.com/' })
4、在index.js里定义接口导出你要的数据,以todos为例

import axios from 'axios'

const ajax  = axios.create({
    baseURL: 'http://jsonplaceholder.typicode.com/'
})

//取todos
export const getTodos = () => {
    return ajax.get('/todos')
}

//单个todo
export const getTodoById = (id) => {
    return ajax.get(`/todos/$(id)`)
}

5、在main.js里引入所有的,而不用挨个引入import * as $http from './requests' //引入所有的
6、挂载到Vue上

import * as $http from './requests' //引入所有的

Vue.prototype.$http = $http

7、在app.vue里请求数据(在created里)

created () {
    this.$http.getTodos()
    .then(resp => {
      if(resp.status === 200){
        this.todos = resp.data
      }
    })
  }

拦截器
作用:更改请求的参数,在里面自动注入一个参数;

//拦截请求
//拦截器 使用一个方法去拦截Ajax的request请求,有些请求要求你必须携带token...
ajax.interceptors.request.use((config) => {
    //第一个人用途:用于显示全局的loading状态
    document.querySelector('.modal').style.display = 'block'
    //第二个用途:在请求参数里加上全局的参数,比如token,这个token在实际项目中会从本地存储中取
    config.headers.token='123'
    //必须return config,否则请求不会执行
    return config
})

//拦截响应
ajax.interceptors.response.use(resp => {
    //隐藏全局loading
    document.querySelector('.modal').style.display = 'none'
    //全局处理错误
    if(resp === 200){
        return resp.data  
    }
    //这里统一做错误处理,需要后端配合,接口的返回格式必须一致
})
image.png

判断isDev,判断是否处于开发模式,就使用前面的地址;上线模式就使用后面的地址

image.png

vue-cli