vue2.x阅读笔记
v-once
作用:
只赋值一次
注意:
包括子项都是只赋值一次
模板
1.v-text v-html
2.{}语法
3.如果是html的属性,则用v-bind绑定,简写:
注意:
1.可以使用javascript,但只能是包含单个表达式
2.模板表达式都被放在沙盒中,只能访问全局变量的一个白名单,如 Math 和 Date 。你不应该在模板表达式中试图访问用户定义的全局变量。
比如:
{{ number + 1 }}
{{ ok ? 'YES' : 'NO' }}
指令
作用:
当表达式的值改变时,将其产生连带影响,响应式的作用于dom中
例子:
1.v-if
2.v-bind
3.v-on
修饰符:
以.为特殊后缀,指出指令用何种特殊方式绑定
计算属性
作用:
模板中写逻辑不便于维护,代码冗杂
逻辑业务相同的话难以处理
建议写在computed里面
例子:
Original message: "{{ message }}"
Computed reversed message: "{{ reversedMessage }}"
var vm = new Vue({
el: '#example',
data: {
message: 'Hello'
},
computed: {
// 计算属性的 getter
reversedMessage: function () {
// this 指向 vm 实例
return this.message.split('').reverse().join('')
}
}
})
注意:
1.模板中调用不需要写()
2.当message变化时,所有依赖reversedMessage的绑定都会更新
computed与methods的区别:
1.它是存在于缓存中的,计算了一次就直接调缓存的值。除非相关的依赖发生改变时了,才会重新计算。
坑:
computed: {
now: function () {
return Date.now()
}
}
此处的Date.now()不是响应式依赖,所以不会多次执行,但在methods里面会多次执行
computed与侦听属性:
例子:
1.watch的做法
var vm = new Vue({
el: '#demo',
data: {
firstName: 'Foo',
lastName: 'Bar',
fullName: 'Foo Bar'
},
watch: {
firstName: function (val) {
this.fullName = val + ' ' + this.lastName
},
lastName: function (val) {
this.fullName = this.firstName + ' ' + val
}
}
})
2.computed的做法
var vm = new Vue({
el: '#demo',
data: {
firstName: 'Foo',
lastName: 'Bar'
},
computed: {
fullName: function () {
return this.firstName + ' ' + this.lastName
}
}
})
html中直接用computed里面的值
只能改firstName lastName,有setter才能改fullName
关于computed的setter,默认情况下是只有getter,但也可以提供一个setter
例子:
computed: {
fullName: {
// getter
get: function () {
return this.firstName + ' ' + this.lastName
},
// setter
set: function (newValue) {
var names = newValue.split(' ')
this.firstName = names[0]
this.lastName = names[names.length - 1]
}
}
}
可以改fullName
现在再运行 vm.fullName = 'John Doe' 时,setter 会被调用,vm.firstName 和 vm.lastName 也会相应地被更新。
侦听器watch
例子:
data: {
question: '',
answer: 'I cannot give you an answer until you ask a question!'
},
watch: {
// 如果 question 发生改变,这个函数就会运行
question: function (newQuestion) {
this.answer = 'Waiting for you to stop typing...'
this.getAnswer()
}
},
methods: {
getAnswer: function(){
//..逻辑处理
}
}
在这个示例中,使用 watch 选项允许我们执行异步操作 (访问一个 API),限制我们执行该操作的频率,并在我们得到最终结果前,设置中间状态。这些都是计算属性无法做到的。
class和style绑定
上面的语法表示 active 这个 class 存在与否将取决于数据属性 isActive 的 值。
多个class的情况:
data: {
isActive: true,
hasError: false
}
结果为:
绑定的数据对象不必内联定义在模板里
data: {
classObject: {
active: true,
'text-danger': false
}
}
还可以绑定在computed里面:
data: {
isActive: true,
error: null
},
computed: {
classObject: function () {
return {
active: this.isActive && !this.error,
'text-danger': this.error && this.error.type === 'fatal'
}
}
}
数组语法:
data: {
activeClass: 'active',
errorClass: 'text-danger'
}
渲染为:
数组中用对象写法:
div v-bind:class="[{ active: isActive }, errorClass]">
绑定内联样式
data: {
activeColor: 'red',
fontSize: 30
}
直接绑定比较好看:
data: {
styleObject: {
color: 'red',
fontSize: '13px'
}
}
数组语法:
作用:可以将多个样式应用到同个元素上
条件渲染
v-if v-else v-else-if v-show
1.
Yes
2.
Yes
No
3.
Title
Paragraph 1
Paragraph 2
里面的东西全没了如果ok为false的话
模板的复用会高效,但存在问题。
模板复用问题,用Key解决
这里的input会复用,不会清除已输入的值
加了key之后,切换loginType,input每次都会被重新渲染
v-show 关于v-if与v-show对比: 1. v-if 是“真正”的条件渲染,因为它会确保在切换过程中条件块内的事件监听器和子组件适当地被销毁和重建。 2. v-if 惰性的,只有条件成立才渲染 3. v-show 元素总是会被渲染,并且只是简单地基于 CSS 进行切换。 4. v-if开销大,如果频繁操作的话建议用v-show 另外提一点: v-for基本用法: var example2 = new Vue({ 2.2.0+ 的版本里,当在组件中使用 v-for 时,key 现在是必须的。 关于v-for中的key 变异方法: Vue 不能检测对象属性的添加或删除: vm.b = 2 Vue.set(vm.userProfile, 'age', 27) 有时,我们想要显示一个数组的过滤或排序副本,而不实际改变或重置原始数据。在这种情况下,可以创建返回过滤或排序数组的计算属性或者用methods 这里是方法: data: { 有时也需要在内联语句处理器中访问原始的 DOM 事件。可以用特殊变量 $event 把它传入方法: // ... .stop 注意: 记住所有的 keyCode 比较困难,所以 Vue 为最常用的按键提供了别名: .enter 可以通过全局 config.keyCodes 对象自定义按键修饰符别名: 你也可直接将 KeyboardEvent.key 暴露的任意有效按键名转换为 kebab-case 来作为修饰符: .left 当一个 ViewModel 被销毁时,所有的事件处理器都会自动被删除。你无须担心如何自己清理它们。 v-model 会忽略所有表单元素的 value、checked、selected 特性的初始值而总是将 Vue 实例的数据作为数据来源。你应该通过 JavaScript 在组件的 data 选项中声明初始值。 对于需要使用输入法 (如中文、日文、韩文等) 的语言,你会发现 v-model 不会在输入法组合文字过程中得到更新。如果你也想处理这个过程,请使用 input 事件。 绑定布尔值 new Vue({ new Vue({ 用字符串去存name的值,单选按钮的name属性要一致,v-model相当于name new Vue({ 绑定到一个字符串中 注意: new Vue({ .trim // 注册 // 创建根实例 var Child = { new Vue({ 像 ul,ol,table,select 这样的元素里允许包含的元素有限制,而另一些像 option 这样的元素只能出现在某些特定元素的内部。会当做无效。 变通的方案是使用特殊的 is 特性: 如果是来源于以下字符串模板,则没有影响:
v-show 的元素始终会被渲染并保留在 DOM 中。v-show 只是简单地切换元素的 CSS 属性 display。
注意:
v-show 不支持 元素,也不支持 v-else。
当 v-if 与 v-for 一起使用时,v-for 具有比 v-if 更高的优先级。列表渲染
{{ parentMessage }} - {{ index }} - {{ item.message }}
el: '#example-2',
data: {
parentMessage: 'Parent',
items: [
{ message: 'Foo' },
{ message: 'Bar' }
]
}
})
额外知识:
如果v-for循环的是一个对象,可以有三个参数
{{ index }}. {{ key }}: {{ value }}
渲染的结果是:
0.key.value
1.key.value
2.key.value
1. 如果数据项的顺序被改变,Vue 将不会移动 DOM 元素来匹配数据项的顺序, 而是简单复用此处每个元素
2. 建议尽可能在使用 v-for 时提供 key,除非遍历输出的 DOM 内容非常简单,或者是刻意依赖默认行为以获取性能上的提升。
3. 它是 Vue 识别节点的一个通用机制数组更新检测
改变原数组
非变异方法:
不改变原数组
注意:
由于javascript的限制,Vue不能检测以下变动
1. 直接利用索引设置一个项
解决:
//Vue.set
Vue.set(example1.items, indexOfItem, newValue)
// Array.prototype.splice
example1.items.splice(indexOfItem, 1, newValue)
2. 修改数组长度
解决:
example1.items.splice(newLength)对象更新检测
var vm = new Vue({
data: {
a: 1
}
})
// vm.a 现在是响应式的
// vm.b 不是响应式的
对于已经创建的实例,可以这么做
var vm = new Vue({
data: {
userProfile: {
name: 'Anika'
}
}
})
或者
vm.$set(this.userProfile, 'age', 27)
//它只是全局 Vue.set 的别名显示过滤/排序结果
numbers: [ 1, 2, 3, 4, 5 ]
},
methods: {
even: function (numbers) {
return numbers.filter(function (number) {
return number % 2 === 0
})
}
}v-if和v-for搭配使用
{{ todo }}
上面的代码只传递了未 complete 的 todos。
v-for的优先级比v-if高
事件处理
事件监听
methods: {
warn: function (message, event) {
// 现在我们可以访问原生事件对象
if (event) event.preventDefault()
alert(message)
}
}事件修饰符
.prevent
.capture
.self
.once 只触发一次
使用修饰符时,顺序很重要;相应的代码会以同样的顺序产生。因此,用 @click.prevent.self 会阻止所有的点击,而 @click.self.prevent 只会阻止对元素自身的点击。按键修饰符
<input @keyup.enter="submit">
.tab
.delete (捕获“删除”和“退格”键)
.esc
.space
.up
.down
.left
.right
// 可以使用 v-on:keyup.f1
Vue.config.keyCodes.f1 = 112自动匹配按键修饰符
<input @keyup.page-down="onPageDown">
在上面的例子中,处理函数仅在 $event.key === 'PageDown' 时被调用。鼠标按钮修饰符
.right
.middle表单输入绑定
基础用法
复选框
多选按钮
Checked names: {{ checkedNames }}
el: '#example-3',
data: {
checkedNames: []
}
})
用一个数组去装复选框单选按钮
Picked: {{ picked }}
el: '#example-4',
data: {
picked: ''
}
})选择框
Selected: {{ selected }}
el: 'example-5',
data: {
selected: ''
}
})
如果 v-model 表达式的初始值未能匹配任何选项,
Selected: {{ selected }}
el: '...',
data: {
selected: 'A',
options: [
{ text: 'One', value: 'A' },
{ text: 'Two', value: 'B' },
{ text: 'Three', value: 'C' }
]
}
})input修饰符
.number
.lazy组件
注册
全局注册
Vue.component('my-component', {
template: '
})
new Vue({
el: '#example'
})局部注册
template: '
}
components: {
//
'my-component': Child
}
})注册组件注意事项:
浙公网安备 33010602011771号