借着假期, 霖呆呆我静下心来好好的把vue
文档又看了一遍, 发现相比于之前的版本(原谅我使用的还是"盘古开天"时的版本), 又新增了一些功能, 还有一些是我之前没太注意的内容, 所以借此整理了一下, 希望也能够帮助到你 😊.
这个是2.6.0
版本新增的功能. 作用主要是能让我们用方括号将一个js
表达式扩起来, 然后将它作为一个指令的参数, 可以看下面👇这个案例🌰:
<a v-bind:[dynamicParam]="url"></a>
dynamicParam
是一个js
变量, 比如你把它赋值为dynamicParam="href"
的话, 则最终这个绑定就等于:
<a v-bind:href="url"></a>
不仅如此, 你还可以将它用在动态的事件绑定上:
<a v-on:[eventName]="doSomething"></a>
<!--若 eventName 的值是 "click", 则等价于-->
<a v-on:click="doSomething"></a>
注
你应该尽量少的用以下这种写法:
<a v-on:['c' + eventName]="doSomething"></a>
实际上, 如果你用了ESLint
的话, 它也会给出错误警告不让你这样写.
如果你的表达式确实很复杂的话, 可以采用计算属性的方式来代替它:
// 计算属性
computed: {
eventName() {
return 'clic' + 'k'
}
}
在2.0中使用 v-bind
时,只有 null
, undefined
,和 false
被看作是假。这意味着,0
和空字符串将被作为真值渲染。比如 v-bind:draggable="''"
将被渲染为 draggable="true"
。
对于枚举属性,除了以上假值之外,字符串 "false"
也会被渲染为 attr="false"
。
但是值得注意的一点是, 对于其它钩子函数 (如 v-if
和 v-show
),他们依然遵循 js 对真假值判断的一般规则。
作用: 跳过这个元素和它的子元素的编译过程
有时我们可能需要编译模版中不需要表达式计算:
<span v-pre>{{ msg }}</span>
上面👆这个msg
并不会当成一个变量来渲染, 在页面中我们仍然可以看到:
{{ msg }}
之前一直只会计算属性最基本的用法:
var vm = new Vue({
el: '#demo',
data: {
firstName: 'Lin',
lastName: 'DaiDai'
},
computed: {
fullName: function () {
return this.firstName + ' ' + this.lastName
}
}
})
而忽略了它的setter
用法, 它允许我们在计算属性发生改变的时候, 处理一系列事情.
比如我将上面👆的例子重写一下:
var vm = new Vue({
el: '#demo',
data: {
firstName: 'Lin',
lastName: 'DaiDai'
},
methods: {
doSomething() {
this.fullName = 'Wang Peilin'
}
},
computed: {
fullName:{
get: function() {
return this.firstName + ' ' + this.lastName
},
set: function(newValue) {
var names = newValue.split(' ')
this.firstName = names[0]
this.lastName = names[names.length - 1]
}
}
}
})
我在页面上促发一下doSomething()
这个方法, 改变fullName
这个计算属性, 此时setter
就会被调用, 从而改变firstName和lastName
.
这个功能其实在实际开发中也是可能被用到的.
假设我们有以下一段代码:
<input type="text" v-model="msg" @input="onInput" @change="onChange" />
{{ msg }}
当修改输入框值的时候, 是会同步修改数据msg
, 然后使得下面{{msg}}
的UI同步更新, 并且触发@input
事件;
而如果加上v-model.lazy
修饰符的话, msg
这个变量就不会时时的更新, 而是当焦点离开输入框的时候才促发, 换句话说, 就是在触发@change
事件的时候, 才同步更新msg
变量.
这个修饰符用的就比较多了, 它的作用是自动过滤用户输入的首尾空白字符, 只要加上这个修饰符就可以避免你在js
代码中写一串正则过滤了:
<input v-model.trim="msg">
此修饰符是针对于父组件与子组件数据传输时用的.
我们知道父组件与子组件进行数据传输的时候, props
是单项的, 但是有时候我们想要达到一种“双向绑定”的效果, 我们可能要做此处理:
1.给子组件一个自定义事件, 将要改变的值传递出去:
// text-document组件
this.$emit('update:title', newTitle)
2.父组件那边接收这个自定义事件和要改变的值:
// 父组件
<text-document
v-bind:title="doc.title"
v-on:update:title="doc.title = $event"
></text-document>
而使用.sync
修饰符就可以给你提供一个这样的缩写:
<text-document v-bind:title.sync="doc.title"></text-document>
它相当于给你省了一个自定义事件.
我们知道, 在实例创建之后, 我们可以通过vm.$data
访问原始数据对象. 而Vue
实例也代理了data
对象上的所有属性, 因此访问vm.a
等价于访问vm.$data.a
.
但是以_
或者$
开头的属性不会被Vue
实例代理,因为它们可能和 Vue 内置的属性、API 方法冲突。
所以对于这种属性你必须用vm.$data._a
这样的方式来访问:
data () {
return {
$msg: "I'm msg"
}
},
created () {
console.log(this.$data.$msg);
}
当然在template
中也得加上$data
:
{{ $data.$msg }}
实际上, ESLint
有一个配置就是限制用户定义以$和_
开头的变量, 因此在开发中我们要避免使用这样的命名方式.
每个Vue
实例都提供了一个watch
对象用来监听使用者需要监听的属性.
其实Vue
也提供了一个$watch
方法以便使用者在某一时刻来设置监听.
语法:
vm.$watch(expOrFn, callback, [options])
expOrFn: String | Function
callback: Object | Function
options: 可选, 提供 深度监听{boolean} deep 和 是否立即触发{boolean}immediate 两个选项
比如下面👇这个案例, 当用户点击按钮时才设置监听:
<template>
<div>
<button @click="setWatch">点击我进行监听</button>
<button @click="handleUnWatch">点我取消监听</button>
</div>
</template>
<script>
export default {
data () {
return {
msg: '',
unWatch: null
}
},
methods: {
setWatch () {
var unWatch = this.$watch('msg', function (newValue, oldValue) {
console.log('newValue', newValue)
})
this.unWatch = unWatch;
},
handleUnWatch () {
this.unWatch()
}
}
}
</script>
同时vm.$watch
返回一个取消观察函数,用来停止触发回调.
我们知道, 在给组件定义props
的时候, 可以定义一些验证方式, 比如定义类型检查、必填、默认值等:
Vue.component('my-component', {
props: {
// 类型验证、必填项、默认值
propA: {
type: Number,
required: true,
default: 100
}
}
})
其实你也可以自定义验证函数:
Vue.component('my-component', {
props: {
// 自定义验证函数
propB: {
validator: function (value) {
// 这个值必须匹配下列字符串中的一个
return ['success', 'warning', 'danger'].indexOf(value) !== -1
}
}
}
})
注data
、computed
等) 在 default
或 validator
函数中是不可用的。
在开发中, 组件、方法之间相互引用, 如果都是用相对路径来引用的话过于麻烦了, 我们总是得关注文件位置之间的关系, 比如你常常会看到下面这种引入方式:
import { setProperty } from './../utils/tools'
我们可以在webpack中配置一些属性, 让我们省去这种麻烦的引用, 而是采用更加简便的方式, 比如将src
这个目录简写为@
:
import { setProperty } from '@/utils/tools'
配置方式:
- 在项目根目录下创建一个
vue.config.js
文件 - 在此文件中添加以下代码:
const path = require('path')
const resolve = dir => path.join(__dirname, dir)
module.exports = {
chainWebpack: config => {
config.resolve.alias
.set('@', resolve('src')),
.set('@comp', resolve('src/components'))
}
}
也就是你可以通过config.resolve.alias
来配置想要简化的文件路径.