ctrlcv-dev.comgithub

Vue.jscheatsheet

贡献者:lele88lala,BAI

表达式

一些基础表达

HTML
<div id="app">
<p>I have a {{ product }}</p>
<p>{{ product + 's' }}</p>
<p>{{ isWorking ? 'YES' : 'NO' }}</p>
<p>{{ product.getSalePrice() }}</p>
</div>

详见: Delimiters

绑定

HTML
<a v-bind:href="url">...</a>

简写语法

HTML
<a :href="url">...</a>

:disabled 表达式返回的 true 或者 false 将影响此属性是否存在

HTML
<button :disabled="isButtonDisabled">...</button>

:class 设置类名,如果 isActive 返回 true,class="active"就会显示出来

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

:style 设置 CSS 样式,例如将颜色值设置成 activeColor 表示的值

HTML
<div :style="{ color: activeColor }"></div>

查看: v-bind

指令(Directive)

v-if 是“真正”的条件渲染,因为它会确保在切换过程中条件块内的事件监听器和子组件适当地被销毁和重建。v-if 也是惰性的:如果在初始渲染时条件为假,则什么也不做——直到条件第一次变为真时,才会开始渲染条件块

HTML
<p v-if="inStock">{{ product }}</p>
HTML
<p v-else-if="onSale">...</p>
<p v-else>...</p>

v-show 切换元素,不管初始条件是什么,元素总是会被渲染,并且只是简单地基于 CSS 进行切换

HTML
<p v-show="showProductDetails">...</p>

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

数据双向绑定

HTML
<input v-model="firstName" />
方法说明
v-model.lazy="..."change 事件之后进行数据同步而非 input事件触发后
v-model.number="..."将输入字符串转为有效的数字
v-model.trim="..."将输入首尾空格去除

查看: Directives

事件处理

在元素里调用 addToCart 方法

HTML
<button v-on:click="addToCart">...</button>

v-on 简写

HTML
<button @click="addToCart">...</button>

方法中参数的传递方式

HTML
<button @click="addToCart(product)">...</button>

防止出现默认行为(例如重新加载页面)

HTML
<form @submit.prevent="addProduct">...</form>

事件只触发一次

HTML
<img @mouseover.once="showImage" />...
MethodDescription
.stop停止所有事件传播
.self仅在 event.target 是元素本身时触发

键盘输入事件列子

HTML
<input @keyup.enter="submit" />

当键盘输入 control-c 时调用 onCopy

HTML
<input @keyup.ctrl.c="onCopy" />

查看: Events

列表渲染

列表渲染时候不能把 :key 属性忽略

HTML
<li v-for="item in items" :key="item.id">{{ item }}</li>

获取数组位置

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

遍历对象

HTML
<li v-for="(value, key) in object">...</li>

在组件中使用 v-for

HTML
<cart-product
v-for="item in products"
:product="item"
:key="item.id"
></cart-product>

查看: List Rendering

组件

组件剖析

JS
Vue.component('my-component', {
components: {
// 组件可以用在 Template 中
ProductComponent,
ReviewComponent
},
props: {
// 组件可以接受的参数
message: String,
product: Object,
email: {
type: String,
required: true,
default: "none"
validator: function (value) {}
}
},
data: function() {
// data 必须是一个函数
return {
firstName: 'Vue',
lastName: 'Mastery'
}
},
computed: {
// 返回缓存的值, 除非依赖发生变化
fullName: function () {
return this.firstName + ' ' + this.lastName
}
},
watch: {
// 当 firstName 值发生变化时调用
firstName: function (value, oldValue) { ... }
},
methods: { ... },
template: '<span>{{ message }}</span>',
})

详见: Components Basics

生命周期 Hook

方法Description
beforeCreate实例初始化后 #
created实例创建后 #
beforeMount第一次渲染前 #
mounted实例挂载后 #
beforeUpdate数据更新时调用,发生在虚拟 DOM 打补丁之前 #
updated由于数据更改导致的虚拟 DOM 重新渲染和打补丁,在这之后会调用该钩子 #
beforeDestroy实例销毁之前 #
destroyedVue 实例被销毁之后 #

详见: Lifecycle Hooks

自定义事件

在其父级中的组件上设置侦听器

HTML
<button-counter v-on:incrementBy="incWithVal"></button-counter>

在父组件内部添加事件方法

JS
methods: {
incWithVal: function (toAdd) { ... }
}

在 button-counter 内部调用此方法

JS
this.$emit(
"incrementBy", // 自定义事件名称
5
);

详见: Custom Events

单文件组件

单文件

HTML
<template>
<p>{{ greeting }} World!</p>
</template>
<script>
module.exports = {
data: function () {
return {
greeting: "Hello",
};
},
};
</script>
<style scoped>
p {
font-size: 2em;
text-align: center;
}
</style>

详见: Single File Components

关注点分离

HTML
<template>
<div>This will be pre-compiled</div>
</template>
<script src="./my-component.js"></script>
<style src="./my-component.css"></style>

详见: What About Separation of Concerns?

插槽(Slot)

使用单个插槽

组件模板

HTML
<div>
<h2>I'm a title</h2>
<slot> Only displayed if no slot content </slot>
</div>

组件中的内容会显示在插槽中

HTML
<my-component>
<p>This will go in the slot</p>
</my-component>

详见: Slots

多个插槽

插槽组件模板

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

组件中的内容会显示在对应的插槽中

HTML
<app-layout>
<h1 slot="header">Page title</h1>
<p>the main content.</p>
<p slot="footer">Contact info</p>
</app-layout>

查看: Slots

另见