【笔记】Vue3官方文档摘抄

原文地址:https://v3.cn.vuejs.org/guide/introduction.html

Vue3基础

模板语法

插值

  • 文本 => Mustache->{{ }}
  • 原始HTML => v-html=""
  • Attribute => v-bind
  • JavaScript表达式

指令(Directives) => v-attribute

  • 参数 => v-bind:参数v-on:参数
  • 动态参数 => v-bind:[attributeName]=""
    • 不能含有空格,可使用计算属性解决
  • 修饰符 => .prevent <=> event.preventDefault()

缩写

v-bind: <=> :
v-on: <=> @

Data Property 和方法

Data Property

$data

方法

methods => 绑定this

在定义 methods 时应避免使用箭头函数,因为这会阻止 Vue 绑定恰当的 this 指向

防抖和节流

Vue 没有内置支持防抖和节流,但可以使用 Lodash 等库来实现。

计算属性和侦听器

计算属性 => computed

  • 计算属性缓存 vs 方法
    计算属性将基于它们的响应依赖关系缓存。计算属性只会在相关响应式依赖发生改变时重新求值。这就意味着只要 计算属性中的方法依赖的值 还没有发生改变,多次访问计算属性中的方法时计算属性会立即返回之前的计算结果,而不必再次执行函数。
    这也同样意味着下面的计算属性将永远不会更新,因为 Date.now () 不是响应式依赖。
    相比之下,每当触发重新渲染时,调用方法将始终会再次执行函数。

  • 计算属性的 Setter

    computed: {
      xxx: {
        // getter
        get() {},
        // setter
        set(newValue) {}
      }
    }
    

侦听器 => watch

  • 计算属性 vs 侦听器
    Vue 提供了一种更通用的方式来观察和响应当前活动的实例上的数据变动:侦听属性。当你有一些数据需要随着其它数据变动而变动时,watch 很容易被滥用。然而,通常更好的做法是使用计算属性而不是命令式的 watch 回调。

Class 与 Style 绑定

绑定 HTML Class

  • 对象语法

    <div :class="{ active: isActive }"></div>
    

    上面的语法表示 active 这个 class 存在与否将取决于 data property isActivetruthiness

  • 数组语法

    <div :class="[activeClass, errorClass]"></div>
    
    data() {
      return {
        activeClass: 'active',
        errorClass: 'text-danger'
      }
    }
    
  • 在组件上使用

绑定内联样式

  • 对象语法
    CSS property 名可以用驼峰式 (camelCase) 或短横线分隔 (kebab-case,记得用引号括起来) 来命名。

    <div :style="{ color: activeColor }"></div>
    
  • 数组语法

    <div :style="[styleObject]"></div>
    
    data() {
      return {
        styleObject: {
          color: 'red'
        }
      }
    }
    
  • 自动添加前缀
    :style 中使用需要一个 vendor prefix (浏览器引擎前缀) 的 CSS property 时,Vue 将自动侦测并添加相应的前缀。Vue 是通过运行时检测来确定哪些样式的 property 是被当前浏览器支持的。如果浏览器不支持某个 property,Vue 会进行多次测试以找到支持它的前缀。

  • 多重值
    可以为 style 绑定中的 property 提供一个包含多个值的数组,常用于提供多个带前缀的值,例如:

    <div :style="{ display: ['-webkit-box', '-ms-flexbox', 'flex'] }"></div>
    

    这样写只会渲染数组中最后一个被浏览器支持的值。在本例中,如果浏览器支持不带浏览器前缀的 flexbox,那么就只会渲染 display: flex

条件渲染

v-if

  • v-if
  • v-else
  • v-else-if

v-show

不同的是带有 v-show 的元素始终会被渲染并保留在 DOM 中。v-show 只是简单地切换元素的 display CSS property。
注意,v-show 不支持 <template> 元素,也不支持 v-else

v-if vs v-show

v-if 是“真正”的条件渲染,因为它会确保在切换过程中,条件块内的事件监听器和子组件适当地被销毁和重建。

v-if 也是惰性的:如果在初始渲染时条件为假,则什么也不做——直到条件第一次变为真时,才会开始渲染条件块。

相比之下,v-show 就简单得多——不管初始条件是什么,元素总是会被渲染,并且只是简单地基于 CSS 进行切换。

一般来说,v-if 有更高的切换开销,而 v-show 有更高的初始渲染开销。因此,如果需要非常频繁地切换,则使用 v-show 较好;如果在运行时条件很少改变,则使用 v-if 较好。

v-ifv-for 一起使用

不推荐同时使用 v-ifv-for

v-ifv-for 一起使用时,v-if 具有比 v-for 更高的优先级。

风格指南
列表渲染指南

列表渲染

v-for 把一个数组映射为一组元素

<ul>
  <li v-for="(item, index) in items">
    ...
  </li>
</ul>

v-for 里使用对象

<li v-for="(value, name, index) in myObject">
  {{ index }}. {{ name }}: {{ value }}
</li>

维护状态

当 Vue 正在更新使用 v-for 渲染的元素列表时,它默认使用“就地更新”的策略。如果数据项的顺序被改变,Vue 将不会移动 DOM 元素来匹配数据项的顺序,而是就地更新每个元素,并且确保它们在每个索引位置正确渲染。

这个默认的模式是高效的,但是只适用于不依赖子组件状态或临时 DOM 状态 (例如:表单输入值) 的列表渲染输出

为了给 Vue 一个提示,以便它能跟踪每个节点的身份,从而重用和重新排序现有元素,你需要为每项提供一个唯一的 key attribute:

<div v-for="item in items" :key="item.id">
  <!-- 内容 -->
</div>

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

因为它是 Vue 识别节点的一个通用机制,key 并不仅与 v-for 特别关联。后面我们将在指南中看到,它还具有其它用途。

更多 key attribute 的细节用法请移步至 key 的 API 文档

数组更新检测

  • 变更方法
    Vue 将被侦听的数组的变更方法进行了包裹,所以它们也将会触发视图更新。这些被包裹过的方法包括:

    • push()
    • pop()
    • shift()
    • unshift()
    • splice()
    • sort()
    • reverse()
  • 替换数组
    变更方法,顾名思义,会变更调用了这些方法的原始数组。相比之下,也有非变更方法,例如 filter()concat()slice()。它们不会变更原始数组,而总是返回一个新数组。当使用非变更方法时,可以用新数组替换旧数组。

显示过滤/排序后的结果

计算属性

<li v-for="n in evenNumbers" :key="n">{{ n }}</li>
data() {
  return {
    numbers: [ 1, 2, 3, 4, 5 ]
  }
},
computed: {
  evenNumbers() {
    return this.numbers.filter(number => number % 2 === 0)
  }
}

在计算属性不适用的情况下 (例如,在嵌套的 v-for 循环中) 你可以使用一个方法:

<ul v-for="numbers in sets">
  <li v-for="n in even(numbers)" :key="n">{{ n }}</li>
</ul>
data() {
  return {
    sets: [[ 1, 2, 3, 4, 5 ], [6, 7, 8, 9, 10]]
  }
},
methods: {
  even(numbers) {
    return numbers.filter(number => number % 2 === 0)
  }
}

v-for 里使用值的范围

v-for 也可以接受整数。在这种情况下,它会把模板重复对应次数。

<div id="range" class="demo">
  <span v-for="n in 10" :key="n">{{ n }} </span>
</div>

<template> 中使用 v-for

类似于 v-if,你也可以利用带有 v-for<template> 来循环渲染一段包含多个元素的内容。

v-forv-if 一同使用

当它们处于同一节点,v-if 的优先级比 v-for 更高,这意味着 v-if 将没有权限访问 v-for 里的变量:

<!-- 这将抛出一个错误,因为“todo” property 没有在实例上定义 -->

<li v-for="todo in todos" v-if="!todo.isComplete">
  {{ todo.name }}
</li>

可以把 v-for 移动到 <template> 标签中来修正:

<template v-for="todo in todos" :key="todo.name">
  <li v-if="!todo.isComplete">
    {{ todo.name }}
  </li>
</template>

在组件上使用 v-for

事件处理

监听事件 => @

事件处理方法

@event="handle" -> methods: {handle() { } }

内联处理器中的方法

@event="handle(args)"

@click="handle(args, $event)"
有时也需要在内联语句处理器中访问原始的 DOM 事件。可以用特殊变量 $event 把它传入方法:

methods: {
  handle(args, event) {
    // 原生事件 event
}

多事件处理器

事件处理程序中可以有多个方法,这些方法由逗号运算符分隔:

<!-- 这两个 one() 和 two() 将执行按钮点击事件 -->
<button @click="one($event), two($event)">
  Submit
</button>
// ...
methods: {
  one(event) {
    // 第一个事件处理器逻辑...
  },
  two(event) {
   // 第二个事件处理器逻辑...
  }
}

事件修饰符

  • .stop: 阻止单击事件继续冒泡;
  • .prevent: 提交事件不再重载页面;
  • .capture: 添加事件监听器时使用事件捕获模式,即内部元素触发的事件先在此处理,然后才交由内部元素进行处理;
  • .self: 只当在 event.target 是当前元素自身时触发处理函数,即事件不是从内部元素触发的;
  • .once: 点击事件将只会触发一次;
  • .passive: 对应 addEventListener 中的 passive 选项

修饰符可以串联,使用修饰符时,顺序很重要;相应的代码会以同样的顺序产生。

按键修饰符

<!-- 只有在 `key` 是 `Enter` 时调用 `vm.submit()` -->
<input @keyup.enter="submit" />

可以直接将 KeyboardEvent.key 暴露的任意有效按键名转换为 kebab-case 来作为修饰符。

<input @keyup.page-down="onPageDown" />
  • 按键别名
    Vue 为最常用的键提供了别名:
    • .enter
    • .tab
    • .delete (捕获“删除”和“退格”键)
    • .esc
    • .space
    • .up
    • .down
    • .left
    • .right

系统修饰键

  • .ctrl
  • .alt
  • .shift
  • .meta: meta 对应 command 键 (⌘)。在 Windows 系统键盘 meta 对应 Windows 徽标键 (⊞)。

请注意修饰键与常规按键不同,在和 keyup 事件一起用时,事件触发时修饰键必须处于按下状态。换句话说,只有在按住 ctrl 的情况下释放其它按键,才能触发 keyup.ctrl。而单单释放 ctrl 也不会触发事件。

  • .exact 修饰符
    .exact 修饰符允许你控制由精确的系统修饰符组合触发的事件。

  • 鼠标按钮修饰符

    • .left
    • .right
    • .middle
      这些修饰符会限制处理函数仅响应特定的鼠标按钮。

表单输入绑定 => v-model

v-model 会忽略所有表单元素的 valuecheckedselected attribute 的初始值。它将始终将当前活动实例的数据作为数据来源。你应该通过 JavaScript 在组件的 data 选项中声明初始值。

v-model 在内部为不同的输入元素使用不同的 property 并抛出不同的事件:

  • text 和 textarea 元素使用 value property 和 input 事件;
  • checkbox 和 radio 使用 checked property 和 change 事件;
  • select 字段将 value 作为 prop 并将 change 作为事件。

对于需要使用输入法 (如中文、日文、韩文等) 的语言,你会发现 v-model 不会在输入法组织文字过程中得到更新。如果你也想响应这些更新,请使用 input 事件监听器和 value 绑定来替代 v-model

值绑定

对于单选按钮,复选框及选择框的选项,v-model 绑定的值通常是静态字符串 (对于复选框也可以是布尔值)。

修饰符

  • .lazyv-model 在每次 input 事件触发后将输入框的值与数据进行同步。你可以添加 lazy 修饰符,从而转为在 change 事件之后进行同步;
  • .number:自动将用户的输入值转为数值类型;
  • .trim:自动过滤用户输入的首尾空白字符。

组件基础

组件的复用

组件的组织

有两种组件的注册类型:全局注册局部注册

组件注册

通过 Prop 向子组件传递数据 => props

监听子组件事件 => $emit()

  • 使用事件抛出一个值 => $emit()

  • 在组件上使用v-model
    自定义事件也可以用于创建支持 v-model 的自定义输入组件。

    为了让它正常工作,这个组件内的 <input> 必须:

    • 将其 value attribute 绑定到一个名叫 modelValue 的 prop 上
    • 在其 input 事件被触发时,将新的值通过自定义的 update:modelValue 事件抛出
    app.component('custom-input', {
      props: ['modelValue'],
      emits: ['update:modelValue'],
      template: `
        <input
          :value="modelValue"
          @input="$emit('update:modelValue', $event.target.value)"
        >
      `
    })
    
    <custom-input v-model="searchText"></custom-input>
    

    在该组件中实现 v-model 的另一种方法是使用 computed property 的功能来定义 getter 和 setter。get 方法应返回 modelValue property,set 方法应该触发相应的事件。

    app.component('custom-input', {
      props: ['modelValue'],
      emits: ['update:modelValue'],
      template: `
        <input v-model="value">
      `,
      computed: {
        value: {
          get() {
            return this.modelValue
          },
          set(value) { 
            this.$emit('update:modelValue', value)
          }
        }
      }
    })
    

自定义事件

通过插槽分发内容 => <slot></slot>

动态组件 => :is

  • 已注册组件的名字,或
  • 一个组件选项对象

动态 & 异步组件

解析 DOM 模板时的注意事项

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

推荐阅读更多精彩内容