计算属性的特点
- 计算属性使数据处理结构清晰
- 依赖于数据,若数据更新,则处理结果自动更新
- 计算属性内部 this 指向 vm 实例
- 模板调用时,直接写计算属性名即可
- 常用的是 getter 方法,用于获取数据,也可以使用 setter 方法改变数据
- 相较于methods,不管依赖的数据是否改变,methods都会重新计算,但是依赖数据不变的时候,computed从缓存中获取,不会重新计算。
<div id="app">
<input v-model="firstName"/>
<input v-model="lastName"/>
<input v-model="fullName"/>
</div>
var vm = new Vue({
el: '#app',
data: {
firstName: 'Foo',
lastName: 'Bar'
},
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]
}
}
}
})
各生命周期适合开发的业务逻辑
- created:进行 Ajax 请求异步数据的获取、初始化数据
- mounted:挂载元素内 DOM 节点的获取
- nextTick:针对单一事件更新数据后立即操作 DOM
- updated:数据更新的统一业务逻辑处理
- watch:监听具体数据变化,并做相应的处理
v-if 与 v-slow
<div id="app-2">
<span v-show="computedSeen">
v-show:用 css (display: none)来显示 or 隐藏。这不修改 DOM。
</span> No Show.
<hr>
<!-- v-if: 控制显示与否 -->
<span v-if="seen">
鼠标悬停几秒钟查看此处动态绑定的提示信息!这会修改 DOM。
</span>
<h1 v-else>No Seen</h1>
<!--‘
v-else’元素必须要紧挨着
v-if 元素,否则它将无法被识别。
-->
<template v-if="seen">
<!--由于 v-if 是一个指令,它必须添加在单个元素上。但是如果我们想切换多个元素的话要怎么做呢?可以通过让
<template> 元素充当一个不可见的包装元素,并在
<template>元素上使用
v-if 来实现,最终的渲染结果不会包含
<template> 元素。
-->
<h1>多标记 if</h1>
<p>段落1</p>
<p>段落2</p>
</template>
</div>
- v-if 是动态地向 DOM 树内添加或删除 DOM 元素,v-show 是通过设置 DOM 元素的 display 样式属性控制显隐
- v-if 是真实的条件渲染,因为它会确保条件块在切换中适当地销毁与重建条件块内的事件监听器和子组件。v-show 只是简单地基于 css 切换
- v-if 也是惰性的,如果在初始渲染时条件为假,则什么也不做,在条件第一次变为真时才开始局部编译(编译会被缓存起来)。v-show 是在任何条件下(首次条件是否为真)都被编译,然后被缓存,而且 DOM 元素保留。
- 相比之下,v-show 简单得多,元素始终被编译并保留,只是简单地基于 CSS 切换。
- 一般来说,v-if 有更高的切换消耗而 v-show 有更高的初始渲染消耗。因此,如果需要频繁切换,则使用 v-show 较好;如果在运行时条件不大可能改变,则使用 v-if 较好。
组件中的 data 必须是函数
因为一个组件可以多处复用,如果是对象,那么复用的组件实例都显示相同的内容,失去了组件复用的意义。只有一个例外,构造 Vue 实例时传入的各种选项大多数都可以在组件里使用。
slot 作用域插槽
一种子向父传参的方式,解决普通 slot 在 parent 中无法访问 子组件数据的问题
- 代表性用例:列表组件
允许在 parent 父组件上对列表项进行自定义显示,该 items 的所有列表项都可以通过 slot 定义后传递给父组件使用,也就是说数据是相同的,不同的场景页面可以有不同的展示方式
<my-component :items="myItems">
<!--作用域插槽也可以是具名的-->
<template slot="item" scope="props">
<!-- 允许父组件向子组件分发内容-->
<li class="my-fancy-item">{{props.username}} {{ props.text }}</li>
</template>
</my-component>
Vue.component('my-component', {
props:["items"],
template: `
<ul>
<hr>
<slot name="item" v-for="item in items" :username="item.username" :text="item.text"></slot>
<hr>
</ul>`,
created: function(){
console.log(this.items) ;
}
})
// 初始化根实例
var app7 = new Vue({
el: '#app-7',
data: {
myItems:[
{username:'小慧', text: '毕业了'},
{username:'小兰', text: '毕业了'},
{username:'小强', text: '毕业了'}
]
}
})