vue学习笔记

安装

npm install vue

概述

vue模板
new Vue({
  data: {
    a: 1
  },
  created: function () {
  },
})

vue定义了许多系统自带的属性attribute,一般用$开头来访问,有一些常用的attribute:
$root 访问组件的根元素,如果没有根元素就访问自己
$parent 访问父组件的实例
$ref 定义子组件的ID引用, $refs 引用所有的子组件ID

//通过 ref 这个 attribute 为子组件赋予一个 ID 引用
<base-input ref="usernameInput"></base-input>
//调用
this.$refs.usernameInput
vue生命周期

生命周期方法:

beforeCreate -> created -> beforeMount -> mounted -> beforeUpdated -> updated -> activated -> deactivated -> beforeDestory -> destoryed -> errorCaptured

  • image.png

vue基本语法

模板
  • 双大括号可以插入文本{{}}
<span>Message: {{ msg }}</span>
//或者还可以解析一段原始的html文本
<span>Message: {{ rawHtml }}</span>
//如果要插入一段生效的html代码,可以用*v-html*
<span v-html="rawHtml"></span>
//也可以支持插入一段表达式
<span>{{ message.split('').reverse().join('') }}</span>

使用v-once指令,此处的值只会更新一次,不进行响应式更新

<span v-once>这个将不会改变: {{ msg }}</span>
  • 属性Attribute插入值可以用v-bind指令
<button v-bind:disabled="isButtonDisabled">Button</button>
//支持表达式
<div v-bind:id="'list-' + id"></div>
  • 基本的指令描述可以表现为v-加一个指令,冒号后跟调用指令作用参数
    v-DIRECTIVES:PARAM
    半角句号.表示修饰符,用于指出一个指令应该以特殊方式绑定
<a v-on:click="doSomething">...</a>
//修饰符应用
<form v-on:submit.prevent="onSubmit">...</form>

使用方括号[]把参数括起来可以支持使用动态参数
<a v-on:[eventName]="doSomething"> ... </a>
v-bind可以简写用冒号:
v-on可以简写用@

  • class动态绑定
    对象绑定和数组绑定
//class绑定一个对象
data: {
  isActive: true,
  hasError: false
}
<div v-bind:class="{ active: isActive, 'text-danger': hasError }"></div>

data: {
  classObject: {
    active: true,
    'text-danger': false
  }
}
<div v-bind:class="classObject"></div>

//class 绑定一个数组
data: {
  activeClass: 'active',
  errorClass: 'text-danger'
}
<div v-bind:class="[activeClass, errorClass]"></div>

//最终渲染的结果都为
<div class="active text-danger"></div>

style的绑定同理

计算属性

封装一段逻辑代码,可以直接做为属性值来使用。它与方法最大区别是计算属性是基于它们的响应式依赖进行缓存的,而方法每次使用都会做一次重新计算

computed: {
    // 计算属性的 getter
    reversedMessage: function () {
      // `this` 指向 vm 实例
      return this.message.split('').reverse().join('')
    }
  }
条件渲染
  • v-if v-else-if v-else
  • v-show
列表渲染v-for
  • 渲染数组
<ul id="example">
  <li v-for="(item, index) in items" :key="item.id">
    {{ index }} - {{ item.message }}
  </li>
</ul>
  • 渲染对象,遍历一个对象的属性
<div v-for="(value, name, index) in object">
  {{ index }}. {{ name }}: {{ value }}
</div>

建议尽可能在使用 v-for 时提供 key attribute,除非遍历输出的 DOM 内容非常简单,或者是刻意依赖默认行为以获取性能上的提升。

事件

v-on 指令监听 DOM 事件,并在触发时运行一些 JavaScript 代码

<div>
  <!-- 事件传递一个处理方法名 -->
  <button v-on:click="greet">Greet</button>
  <!-- 或者也可以传递一个调用方法 -->
  <button v-on:click="greet('hi')">Greet</button>
</div>
  • 可以在内联语句调用方法中传递一个DOM事件,用$event
<button v-on:click="warn('Form cannot be submitted yet.', $event)">
  Submit
</button>
  • 事件修饰符
    .stop .prevent .capture .self .once .passive
<a v-on:click.stop="doThis"></a>
  • 按键修饰符
<input v-on:keyup.enter="submit">
<input v-on:keyup.13="submit">
表单

修饰符
.lazy 在默认情况下,v-model 在每次 input 事件触发后将输入框的值与数据进行同步 。你可以添加 lazy 修饰符,从而转为在 change 事件之后进行同步

<!-- 在“change”时而非“input”时更新 -->
<input v-model.lazy="msg">

.number 如果想自动将用户的输入值转为数值类型,可以给 v-model 添加 number 修饰符

<input v-model.number="age" type="number">

.trim 如果要自动过滤用户输入的首尾空白字符,可以给 v-model 添加 trim 修饰符

<input v-model.trim="msg">

组件

组件是可复用的 Vue 实例,且带有一个名字
基本组件示例

Vue.component('custom-input', {
  props: ['value'],
  template: `
    <input
      v-bind:value="value"
      v-on:input="$emit('input', $event.target.value)"
    >
  `
})

使用组件

<custom-input v-model="searchText"></custom-input>
组件注册

-全局注册

Vue.component('MyComponentName', { /* ... */ })

-局部注册

import ComponentA from './ComponentA.vue'
export default {
  components: {
    ComponentA,
    [componentbName]: componentB
  },
  // ...
}

Prop

Vue.component('blog-post', {
  // 在 JavaScript 中是 camelCase 的
  props: ['postTitle'],
  template: '<h3>{{ postTitle }}</h3>'
})
<!-- 在 HTML 中是 kebab-case 的 -->
<blog-post post-title="hello!"></blog-post>

prop类型限制:

props: {
  title: String,
  likes: Number,
  isPublished: Boolean,
  commentIds: Array,
  author: Object,
  callback: Function,
  contactsPromise: Promise // or any other constructor
}

prop验证的几种方式:

Vue.component('my-component', {
  props: {
    // 基础的类型检查 (`null` 和 `undefined` 会通过任何类型验证)
    propA: Number,
    // 多个可能的类型
    propB: [String, Number],
    // 必填的字符串
    propC: {
      type: String,
      required: true
    },
    // 带有默认值的数字
    propD: {
      type: Number,
      default: 100
    },
    // 带有默认值的对象
    propE: {
      type: Object,
      // 对象或数组默认值必须从一个工厂函数获取
      default: function () {
        return { message: 'hello' }
      }
    },
    // 自定义验证函数
    propF: {
      validator: function (value) {
        // 这个值必须匹配下列字符串中的一个
        return ['success', 'warning', 'danger'].indexOf(value) !== -1
      }
    }
  }
})

使用inheritAttrs: false可以禁用根元素继承attribute

prop与其父控件之间是单向下行数据流向,父级 prop 的更新会向下流动到子组件中,但是反过来则不行。这样会防止从子组件意外改变父级组件的状态,从而导致你的应用的数据流向难以理解。

插槽Slot

预先设定一段待填充代码片段,待调用的时候能使用户自定义填充

<navigation-link url="/profile">
  Your Profile
</navigation-link>

<navigation-link> 的模板中可能会写为:

<a v-bind:href="url"  class="nav-link">
  <slot></slot>
</a>

slot可以设定一个默认内容

<a v-bind:href="url"  class="nav-link">
  <slot>This is default value</slot>
</a>

如果有多个slot,需用name区分不同的slot,slot默认name为default
下面是<base-layout> 组件

<div class="container">
  <header>
    <slot name="header"></slot>
  </header>
  <main>
    <slot></slot>
  </main>
  <footer>
    <slot name="footer"></slot>
  </footer>
</div>

使用v-slot:name调用组件

<base-layout>
  <template v-slot:header>
    <h1>Here might be a page title</h1>
  </template>

  <p>A paragraph for the main content.</p>
  <p>And another one.</p>

  <template v-slot:footer>
    <p>Here's some contact info</p>
  </template>
</base-layout>

父级模板里的所有内容都是在父级作用域中编译的;子模板里的所有内容都是在子作用域中编译的。即子模板不能返回父模板的数据。

  • slot访问父级模板数据的方式
    1.以绑定数据model的方式在模板定义时把要访问的数据model添加到slot
    <current-user>
<span>
  <slot v-bind:user="user">
    {{ user.lastName }}
  </slot>
</span>

2.使用v-slot:name="slotProp"的方式在调用时传入数据

<current-user>
  <template v-slot:default="slotProps">
    {{ slotProps.user.firstName }}
  </template>
</current-user>

slot支持缩写语法,用#替换v-slot:,即为#slotName,如
<template #header>
<h1>Here might be a page title</h1>
</template>

混入Mixin

把一个功能混入到另一个组件中,有点类似于其它语言的扩展函数功能

var mixin = {
  data: function () {
    return {
      message: 'hello',
      foo: 'abc'
    }
  }
}

new Vue({
  mixins: [mixin],
  data: function () {
    return {
      message: 'goodbye',
      bar: 'def'
    }
  },
  created: function () {
    console.log(this.$data)
    // => { message: "goodbye", foo: "abc", bar: "def" }
  }
})

1.数据对象在内部会进行递归合并,并在发生冲突时以组件数据优先。
2.混入对象的钩子将在组件自身钩子之前调用

过滤器

Vue.js 允许你自定义过滤器,可被用于一些常见的文本格式化。过滤器有两种方式:
1.双大括号插值
2.v-bind表达式
过滤器第一个参数总是一个表达式的值,如下述的message,后面跟过滤器,多个过滤器可以通过|符号分隔开,有点像java中的管道,链式过滤。

<!-- 在双花括号中 -->
{{ message | capitalize }}

<!-- 在 `v-bind` 中 -->
<div v-bind:id="rawId | formatId"></div>

过滤器的定义也有两种方式:
1.组件中定义本地过滤器

filters: {
  capitalize: function (value) {
    if (!value) return ''
    value = value.toString()
    return value.charAt(0).toUpperCase() + value.slice(1)
  }
}

2.全局过滤器

Vue.filter('capitalize', function (value) {
  if (!value) return ''
  value = value.toString()
  return value.charAt(0).toUpperCase() + value.slice(1)
})

其它

Keep-alive

缓存组件的状态,避免重复渲染

<!-- 失活的组件将会被缓存!-->
<keep-alive>
  <component v-bind:is="currentTabComponent"></component>
</keep-alive>
依赖注入

使用provide选项允许我们指定可以提供给后代组件的数据方法,这种方式可以作为组件间交互方式的补充

provide: function () {
  return {
    getMap: this.getMap
  }
}

后代通过inject来接收想要添加到这个实例的属性:

inject: ['getMap']
事件侦听器

vue扩展了一些侦听器,可以接收$emit发出的事件
$on(eventName, eventHandler) 侦听一个事件
$once(eventName, eventHandler) 一次性侦听一个事件
$off(eventName, eventHandler) 停止侦听一个事件

使用$forceUpdate强制更新组件
通过 v-once 创建低开销的静态组件
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,919评论 6 502
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,567评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,316评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,294评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,318评论 6 390
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,245评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,120评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,964评论 0 275
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,376评论 1 313
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,592评论 2 333
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,764评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,460评论 5 344
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,070评论 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,697评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,846评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,819评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,665评论 2 354

推荐阅读更多精彩内容