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 为配置选项。注册后,我们可以使用以下方式来调用组件:
<tagName></tagName>

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

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或者组件,

<tag ref="a"></tag> //可以通过this.$refs.a获取到tag标签

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

<slot name="xxx"></slot>//给slot加一个name属性,写在模板里面,在页面的显示顺序只有模板里面的顺序有关
<h2 slot="xxx">内容</h2>//通过slot属性来获取获取到slot

动态组件

<component is="  "></component>//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

<style scoped> scoped指定样式只在当前页面生效

代理服务器配置
devServer:如果你的前端应用和后端 API 服务器没有运行在同一个主机上,你需要在开发环境下将 API 请求代理到 API 服务器。这个问题可以通过 vue.config.js 中的 devServer.proxy 选项来配置。

module.exports = {
  devServer: {
    port: 3000,
    open: true,
    proxy: {
       //所有以ajax开始的都配置到下面这个地址
      '/ajax': {
        target: 'http://m.maoyan.com',
        changeOrigin: true
      }
    }
  }
}

kepp-alive

用法:
<keep-alive> 包裹动态组件时,会缓存不活动的组件实例,而不是销毁它们。主要用于保留组件状态或避免重新渲染。
Propes

  • include - 字符串或正则表达式。只有名称匹配的组件会被缓存。
  • exclude - 字符串或正则表达式。任何名称匹配的组件都不会被缓存。
  • max - 数字。最多可以缓存多少组件实例。
    会新增 activateddeactivated这两个生命周期
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342

推荐阅读更多精彩内容

  • 这篇笔记主要包含 Vue 2 不同于 Vue 1 或者特有的内容,还有我对于 Vue 1.0 印象不深的内容。关于...
    云之外阅读 5,044评论 0 29
  • vue概述 在官方文档中,有一句话对Vue的定位说的很明确:Vue.js 的核心是一个允许采用简洁的模板语法来声明...
    li4065阅读 7,185评论 0 25
  • 主要还是自己看的,所有内容来自官方文档。 介绍 Vue.js 是什么 Vue (读音 /vjuː/,类似于 vie...
    Leonzai阅读 3,324评论 0 25
  • 什么是组件? 组件 (Component) 是 Vue.js 最强大的功能之一。组件可以扩展 HTML 元素,封装...
    youins阅读 9,441评论 0 13
  • vue学习笔记 安装 Vue 提供一个官方命令行工具,可用于快速搭建大型单页应用。只需几分钟即可创建并启动一个带热...
    EL_PSY_CONGROO阅读 1,052评论 0 5