<!-- 属性name -->
<a :[name]="url"> ... </a>
<!-- 计算属性sss和s -->
<img :[sss]="/img/test.png"/>
<!-- 方法change1和change2 -->
<img :[change1()]="change2()"/>
data: {
name: 'href',
sss: 'src'
}
复制代码
注意:要避免空格和引号等,且须要小写,可以使用计算属性来应对复杂表达式,都须要使用[]html
computed
可以使用get/set
computed: {
top() {
return 'top'
},
name: {
get () {
return this.name
},
set (val) {
this.name = val
}
}
}
复制代码
computed
可缓存,但不可传参,会根据data中的属性变化而变化,便是根据响应式依赖来变化,而Date
不是响应式依赖,即不会变化;method
则每次都会进行计算,但可传参。vue
watch
用于处理异步或开销较大的操做,如输入搜索时。webpack
<!-- 属性名可加引号也可不加,属性小驼峰 -->
<div :style="{ 'color': 'red', fontSize: fontSize + 'px' }">样式3</div>
复制代码
data: {
isActive: true,
activeClass: 'active'
}
<!-- 使用数组时变量和字符串须要经过引号来区分 -->
<div :class="[isActive ? activeClass : '', 'errorClass']"></div>
<!-- 使用对象时类名不加引号可表示变量也可表示字符串 -->
<div :class="[{ active: isActive }, 'errorClass']"></div>
复制代码
template
包裹元素,template
会被当成不可见的包裹元素<template v-if="ok">
<h1>Title</h1>
<p>Paragraph 1</p>
<p>Paragraph 2</p>
</template>
复制代码
<div v-if="type === 'A'">
A
</div>
<div v-else-if="type === 'B'">
B
</div>
<div v-else-if="type === 'C'">
C
</div>
<div v-else>
Not A/B/C
</div>
复制代码
key
防止vue
重复利用不想被重复利用的元素,以下的input
若是不添加key
,则vue
会重复使用key
,进而input
的value
值在切换后还会被保留,由于vue
仅仅替换了placeholder
<template v-if="loginType === 'username'">
<label>Username</label>
<input placeholder="Enter your username" key="username-input">
</template>
<template v-else>
<label>Email</label>
<input placeholder="Enter your email address" key="email-input">
</template>
复制代码
v-if
是组件的销毁和重建,若是初始条件为false
,则什么都不作,直到变为真,因此切换开销高,运行条件不多改变时适用v-show
是display:none
和block
之间的CSS
切换,基于渲染,无论初始条件如何都会渲染,因此初始渲染开销高,切换频率高时适用in
或者of
v-for="(value, key, index) in obj"
template
渲染多个组合元素:<ul>
<template v-for="item in items">
<li>{{ item.msg }}</li>
<li class="divider"></li>
</template>
</ul>
复制代码
v-for
优先级更高,因此v-if
会重复运行于每一个v-for
循环中,因此尽可能不要一块儿使用,可先使用计算属性对数据进行过滤再遍历。Vue.set(object, key, value)
this.$set(object, key, value)
this.items.splice(index, 1, newValue)
// 不要直接Object.assign(this.items, {age: 18}
this.items = Object.assign({}, this.items, {
age: 18,
favoriteColor: 'Vue Green'
})
复制代码
.passive
:滚动的默认事件会当即出发,即告诉浏览器不想阻止默认事件的触发,可提高移动端性能<div @scroll.passive="onScroll">...</div>
复制代码
.capture
:添加事件监听器时使用事件捕获模式,即元素自身触发的事件先在此处理,而后才交由内部元素进行处理.self
:只当在 event.target
是当前元素自身时触发处理函数,即事件不是从内部元素触发的.once
:点击事件只会触发一次<input @keyup.enter="submit">
<!-- 单选框时,picked为字符串 "a",不是布尔值 -->
<input type="radio" value="a" v-model="picked">
<!-- 多选框时,toggle默认值设为字符串或布尔值时获得布尔值,设为数组时获得的是value值-->
<input type="checkbox" value="b" v-model="toggle">
<!-- 当选中第一个选项时,selected为字符串value的值 "abc" -->
<select v-model="selected">
<option value="abc">ABC</option>
</select>
复制代码
.lazy
:在change
时而非input
时更新 <input v-model.lazy="msg" >
注:change事件是在input失去焦点时触发,即用于单选、多选框和选择框,而input事件是在value值变化时触发,但脚本改变value值时不会触发,即用于text和textareaios
.number
:输入值转为数值.trim
:过滤收尾空白字符v-bind="obj"
会将对象的每一个属性都做为一个独立的prop
传入进去,因此接受时也须要逐个属性接收。<test v-bind="obj"></test>
复制代码
props
虽然是单向数据流,但对于引用类型,子组件仍是能够改变父组件的状态。props
会在组件实例建立以前进行验证,因此实例的属性再default
或validator
中是不可用的。$emit('BaseEvent')
虽然事件名不会变,但在html
中该事件名会被转化为小写,不会监听到。<base-layout>
<template v-slot:header>
<h1>Here might be a page title</h1>
</template>
<!-- 默认插槽也可不用加上template和v-slot -->
<template v-slot:default>
<p>A paragraph for the main content.</p>
<p>And another one.</p>
</template>
<template v-slot:footer>
<p>Here's some contact info</p>
</template>
</base-layout>
复制代码
<!-- current-user组件 -->
<span>
<slot :user="user">
{{ user.lastName }}
</slot>
</span>
<!-- 父级组件经过自定义名称访问子级做用域 -->
<current-user>
<template v-slot:default="slotProps">
{{ slotProps.user.firstName }}
</template>
</current-user>
<!-- 支持缩写和解构 -->
<current-user>
<template #default="{ user = { firstName: Gust } }">
{{ user.firstName }}
</template>
</current-user>
复制代码
vuex/eventBus
prop/$emit
$children/$parent
provide/inject
$refs
// 父或祖先级
provide: function () {
return {
getMap: this.getMap
}
}
// 后代级
inject: ['getMap']
复制代码
scoped
属性会自动添加一个惟一的属性 (好比 data-v-21e5b78
) 为组件内 CSS 指定做用域,编译的时候 .list-container:hover
会被编译成相似 .list-container[data-v-21e5b78]:hover
区分:this.$router
指路由器,this.$route
指当前路由web
通配符:捕获全部路由或 404 Not found
路由vuex
// 含通配符的路由都要放在最后,由于优先级由定义顺序决定
{
// 会匹配全部路径
path: '*'
}
{
// 会匹配以 `/user-` 开头的任意路径
path: '/user-*'
}
复制代码
$route.params
内会自动添加一个名为 pathMatch
参数。它包含了 URL
经过通配符被匹配的部分:// 给出一个路由 { path: '/user-*' }
this.$router.push('/user-admin')
this.$route.params.pathMatch // 'admin'
// 给出一个路由 { path: '*' }
this.$router.push('/non-existing')
this.$route.params.pathMatch // '/non-existing'
复制代码
点击 <router-link :to="...">
等同于调用 router.push(...)
方法,由于<router-link>
会在内部调用该方法,进而在history
栈添加一个新的记录json
使用了push
时,若是提供的path
不完整,则params
会被忽略,须要提供路由的 name
或手写完整的带有参数的 path
:axios
const userId = '123'
router.push({ name: 'user', params: { userId }}) // -> /user/123
router.push({ path: `/user/${userId}` }) // -> /user/123
// 这里的 params 不生效
router.push({ path: '/user', params: { userId }}) // -> /user
复制代码
router.push/router.replace/router.go
效仿于 window.history.pushState/window.history.replaceState/window.history.go
数组
命名视图:router-view
可设置名字,若是router-view
没有设置名字,那么默认为 default浏览器
<router-view></router-view>
<router-view name="a"></router-view>
<router-view name="b"></router-view>
const router = new VueRouter({
routes: [
{
path: '/',
components: {
default: Foo,
a: Bar,
b: Baz
}
}
]
})
复制代码
props
:可将路由参数设置为组件属性const User = {
props: ['id'],
template: '<div>User {{ id }}</div>'
}
// 经过布尔值设置
const router = new VueRouter({
routes: [
{ path: '/user/:id', component: User, props: true },
// 对于包含命名视图的路由,你必须分别为每一个命名视图添加 `props` 选项:
{
path: '/user/:id',
components: { default: User, sidebar: Sidebar },
props: { default: true, sidebar: false }
}
]
})
// 经过函数设置query
// URL /search?q=vue 会将 {name: 'vue'} 做为属性传递给 SearchUser 组件
const router = new VueRouter({
routes: [
{ path: '/search', component: SearchUser, props: (route) => ({ name: route.query.q }) }
]
})
复制代码
beforeRouteEnter
:可以使用beforeRouteEnter
来提早获取接口数据,同时须要在next后才能访问到实例:beforeRouteEnter(to, from, next) {
axios('/text.json').then(res => {
next(vm => {
vm.datas = res
})
})
}
复制代码
push
跳转返回,则不会保留该参数,这在第三方调用模块传参时须要注意。template
块时,会将全部遇到的URL资源转为webpack模块请求:// <img src="../image.png">将会被编译成为:
createElement('img', {
attrs: {
src: require('../image.png') // 如今这是一个模块的请求了
}
})
复制代码
/images/foo.png)
,则会原样保留。.
开头,将会被看做相对的模块依赖,并按照你的本地文件系统上的目录结构进行解析。~
开头,其后的部分将会被看做模块依赖。@
开头,也会被看做模块依赖。